专栏首页腾讯数据库技术浅析mysql-test框架

浅析mysql-test框架

1 综述

MTR框架分为两部分:perl脚本(mysql-test-run.pl)和c++二进制(mysqltest)。perl脚本负责控制流程,包括启停、识别执行哪些用例、创建文件夹、收集结果等等,mysqltest负责执行测试用例,包括读文件,解析特定语法,执行用例。用例的特殊语法(比如,--source,--replace_column等)都在command_names和enum_commands两个枚举结构体中。

MTR框架时序图如下所示:

2 Perl脚本控制框架

如上图所示,mysql-test-run.pl框架运行流程如下:

1、初始化(Initialization)。确定用例执行范围(collect_test_cases),包括运行哪些suite,skip哪些用例,在本阶段根据disabled.def文件--skipXXX命令(比如skip-rpl)等确定执行用例。将所有用例组织到一个大的内存结构中,包括用例启动参数,用例

同时,初始化数据库(initialize_servers()->mysql_install_db()),后面运行用例启动数据库时,不需要每次初始化,只需从这里的目录中拷贝启动

2、运行用例(run test)。主线程根据参数--parallel,默认是1)启动一个或者多个用例执行线程(run_worker()),各线程有自己独立的client port,data dir等。启动的run_worker与主线程之间是server-client模式,主线程是server,run_worker()是client。主线程与run_worker是一问一答模式,主线程向run_worker发送运行用例的文件路径、配置文件参数等各种参数信息,run_worker向主线程返回运行结果,直到所有在collection中的用例都运行完毕,主线程close各run_worker,进行收尾工作

主线程先读取各run_worker返回值,对上一个用例进行收尾工作。之后,读取collection中的用例,通过本地socket发送到run_worker线程,run_worker线程接收到主线程命令,运行进去本次用例执行函数(run_testcase()),run_worker()的run_testcase()主要负责3件事:启动mysqld、启动并监控mysqltest,处理执行结果

启动mysqld:run_testcase根据参数启动一个或者多个mysqld(start_servers()),在start_servers大多数情况下会拷贝主线程初始化后的目录到run_worker的目录,作为新实例的启动目录,用shell命令启动数据库。

启动并监控mysqltest:用例在mysqltest中执行,run_worker线程会监控mysqltest的运行状态,监测其是否运行超时或者运行结束。

处理执行结果:mysqltest执行结束会留下执行日志,框架根据执行日志判断执行是否通过,如果没通过是否需要重试等

3 C++执行框架

执行框架都集中在mysqltest.cc中,mysqltest读取用例文件(*.test),根据预定义的命令(比如--source,--replace_column, shutdown_server等)执行相应的操作。mysql根据run_worker传入的运行参数(args)获得用例文件路径等信息,然后读取文件逐行执行语句,语句分为两种,一种是可以直接执行的SQL语句,一种是控制语句,控制语句用来控制mysqlclient的特殊行为,比如shutdown mysqld等,这些命令预定义在command_names中


腾讯数据库技术团队对内支持QQ空间、微信红包、腾讯广告、腾讯音乐、腾讯新闻等公司自研业务,对外在腾讯云上支持TencentDB相关产品,如CynosDB、CDB、CTSDB、CMongo等。腾讯数据库技术团队专注于持续优化数据库内核和架构能力,提升数据库性能和稳定性,为腾讯自研业务和腾讯云客户提供“省心、放心”的数据库服务。此公众号和广大数据库技术爱好者一起,推广和分享数据库领域专业知识,希望对大家有所帮助。

本文分享自微信公众号 - 腾讯数据库技术(gh_83eebc796d5d),作者:腾讯数据库技术

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OpenSSL与yaSSL性能对比

    摘要 MySQL可以使用OpenSSL或yaSSL/wolfSSL进行编译,这两者都支持基于OpenSSL API的加密连接。在5.7版本,我们知道默认情况下...

    腾讯数据库技术
  • 战略升级!腾讯云数据库五大新品重磅发布

      8月28日,腾讯云数据库在京正式启动战略升级发布会。 未来,腾讯云数据库将聚焦云原生、自治、超融合三大战略方向,并且面向全球用户同步发布五大战略级新品:...

    腾讯数据库技术
  • 比ls快8倍?百万级文件遍历的奇技淫巧

    腾讯数据库技术
  • .NET 中 GetProcess 相关方法的性能

    2018-08-19 07:04

    walterlv
  • 第十章 磁盘管理

    我们知道,日常中我们的台式机、笔记本电脑上的磁盘都会有几百G的容量,这种磁盘一般都是机械磁盘,即使用一些精密的机械部件组成的磁盘。而近几年来,越来越多的笔记本电...

    晓天
  • 0511-正式合并完成后Cloudera推出新的大数据平台CDP

    Cloudera在今天主要阐述了将要推出的统一旗舰产品CDP(Cloudera Data Platform),它也是Cloudera新兴的“企业数据云”战略的核...

    Fayson
  • 比特币和区块链(1):真钱,电子货币以及区块链

    0 比特币和区块链系列0篇发出去之后,有些人表示了不满意,说我写的肤浅。非喜勿扰。尤其是那些从来没有对我的公众号贡献过什么。没赞赏过没提供建设性意见没转文章的伸...

    用户1564362
  • 等保2.0时代,企业如何开展移动互联安全合规建设

    根据《网络安全法》规定“国家实行网络安全等级保护制度”。等级保护作为我国在网络安全方面的基本制度将长期实行下去。等级保护2.0时代,行业单位未落实网络安全等级保...

    几维安全
  • 打造 Mac 下高颜值好用的终端环境

    最近有很多朋友看了我的文章之后,问我你终端是怎么设置的,为什么如此炫酷,这这这...让我怎么说,难道我的文章不干吗?还是特干看不下去了?好吧,今天趁着周末给大家...

    云原生生态圈
  • 加密货币是信仰,还是在赌哥伦布的新大陆

    牛市是整个加密货币行业的期望,但真正的牛市需要区块链产业发展成像互联网一样庞大,只有技术普及开来才会对行业形成支撑。现在的区块链技术仍然主要应用在加密货币领域,...

    PlusFo超级链

扫码关注云+社区

领取腾讯云代金券