断开是异步执行的。这很可能对通常应用程序的吞吐量有好处,但对测试开发有一些令人讨厌的后果。
如果一个
> <连接或断开
杀死< connection_id >
——exec <连接到服务器>的客户端程序
发生在mysqltest的脚本中,即使disconnect或kill没有完全完成,下一个语句也将被执行。
我猜这也适用于一个测试的结束(->结束的语句将由mysqltest执行)。它为任何打开的会话触发一些断开连接,但这也是异步的。
不完全完成意味着会话在进程列表中是可见的,关于会话的“退出”的条目还没有附加到一般日志中。
因此,后续的测试可能会受到意外事件的影响,比如
在进程列表中观察属于前一个测试的会话
在一般日志中发现一个条目(断开连接的会话的“退出”)不是由它自己的活动引起的,等等。
根据我的经验,一些测试可能会由于未完成的断开而损害到一个成功的测试,这种可能性随着时间的推移而增加
额外的平行负载在测试箱上
测试中缺少“disconnect
” “disconnect
”,“KILL ”或“——exec…”与测试结束之间的距离更短 会话在断开之前运行一个“重”SQL语句
在我看来,最有效的解决方案是增加一个
——包括/ wait_until_disconnected.inc来源
就在断开连接之后。
如果你不相信我,请稍后运行下面的代码片段
./mtr——skip-ndb——no-check-testcases——repeat=100
你很可能会观察到
测试结果(ms ) ------------------------------------------------------------ ... [pass] 4 [fail]…CURRENT_TEST: —— +++ @@ -1,4 +1,4 @@ SELECT COUNT(*) FROM information_schema。processlist WHERE id < CONNECTION_ID();Count (*) -0 +1 select sleep (10);...mysqltest:结果内容不匹配
用于演示的片段:
SELECT COUNT(*) FROM information_schema。processlist WHERE id < CONNECTION_ID();# connect (con1,localhost,root,,);发送选择睡眠(10);#连接默认值;让$wait_condition= SELECT COUNT(*) = 1 FROM information_schema。processlist WHERE State = 'User sleep' AND Info = 'SELECT sleep (10)';——包括/ wait_condition来源。从信息模式中选择COUNT(*) = 1。processlist WHERE State = 'User sleep' AND Info = 'SELECT sleep (10)';#(4)断开con1;<脚本>的结束
代码片段用于演示目的,包含明显的“垃圾”代码,但需要强制执行预期的效果。一些注意事项:
(1)在测试开始时的这种声明使该测试对未完成的断开非常敏感。
(2)等待例程(3)防止我们对进程列表(4)的查找过早发生=在服务器开始处理(2)之前。否则,在高并行负载下,我们会得到(4)的随机结果集差异。
如何防止本次测试对后续测试造成伤害?
(5)应改为连接con1;断开con1;——包括/ wait_until_disconnected.inc来源connection default;
“垃圾”在哪里?
-
对于前面的每个“send
”都应该有一个“reap”。这不仅是为了学术的完整性,也是为了确保(2)是真正完成的。 我们真的需要10秒的睡眠时间吗?根据我的经验,在高负荷下,睡眠时间<= 2秒是至关重要的。(5)睡觉呢?