mysql 半同步测试,一个会导致Mysql crash 的半同步的bug

作者在之前写的一篇关于mysql 5.6与mysql 5.7的半同步性能对比测试的文章中,提到mysql的半同步的一个bug .  当时提出了在mysql 5.6中并未曾遇到这个bug (作者确实未曾在5.6上遇到这个bug,回头看来,这个原因也很可能是性能上的差异导致),而事实上,这个bug在5.6就存在,周末在bug库里面找到了这个bug ,确实目前还没有程序员分享(贡献)解决这个Bug的代码。

下面来看这个bug的详细信息:

df03743d54228d590a5c54b7470452b1.png

bug触发的条件是:当事务执行到正在提交的函数Trans_delegate::after_commit() 时,同时将master的半同步状态设置为on .

如何重复,如下(截取bug 提交者的说明进行描述)

This was interesting to reproduce.    (这是一个非常有趣的重现)

I attached a log file with details, but in short: (我提交了一个日志文件进行描述,简单说来如下)

- run mysqld with semi-sync DISABLED     (首先mysqld将半同步的插件运行在异步状态下,也就是semi-sync DISABLED  )

- run a DML statement , but block it when Trans_delegate::after_commit() is called  (通过debug_sync函数设置断点,将执行dml 语句的会话堵塞在Trans_delegate::after_commit() 这个函数的入口处)

- in another thread, enable semi-sync (用另外一个会话,将半同步开启)

- let the DML statement complete with semi-sync ENABLED (然后之前被block的dml 语句的会话继续运行)。

- mysqld will crash  (mysqld crash).

因此,只有当其他会话正执行到这个函数Trans_delegate::after_commit() 时,将半同步从异步状态设置会同步状态时,则会引发mysqld crash . 因此,事务并发越多,越容易刚好在这个函数点上撞上,导致mysqld crash 。

现在来说说,为什么在mysql 5.6上,作者为什么未曾遇到设置mysql半同步时出现crash的现象,通过对比测试发现,mysql 5.6的事务提交速度比mysql5.7低,因此事务并发提交的速度也没有mysql5.7快,所以刚好撞上的概率也就低。

标签:同步,crash,5.6,Mysql,mysqld,mysql,bug

来源: https://blog.51cto.com/15057824/2648705

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值