
events scheduler导致MGR节点退出详解及修复
问题复现
执行如下命令:
正常情况下,这个events会被自动删除。 如果在MGR集群上执行上面的命令,则根据编译版本不同表现不同。 Debug版本:直接ASSERT
Release版本:导致MGR集群状态异常,节点退出MGR集群。
问题分析
调试Debug版本,很容易发现导致assert的原因在recalculate_activation_times函数中:
是由于trans_commit_stmt事务提交失败,导致Disable_autocommit_guard中的事务状态判断失败。 trans_commit_stmt失败的原因是group_replication_trans_before_commit失败。
熟悉MGR代码的知道,后台applier线程才是事件处理的真正线程,用户线程失败肯定是applier线程处理出现问题导致,applier线程出现问题的地方在set_transaction_ctx中,其调用堆栈为:
set_transaction_ctx代码逻辑如下https://gitee.com/mirrors/mysql-server/blob/8.0/sql/rpl_transaction_ctx.cc#L90:
这里搜索的thd_ptr为nullptr,导致了返回了ER_NO_SUCH_THREAD错误。从而导致了认证失败。 为什么会导致无法搜索到对应的thd呢?因为提交这个事务的线程是event_scheduler_thread事件调度后台线程,而线程搜索算法是忽略这种后台线程。https://gitee.com/mirrors/mysql-server/blob/8.0/sql/mysqld_thd_manager.cc#L59
综上所述,原因可以总结如下:
1. event_scheduler_thread 后台事件调度线程触发了COMMIT操作
2. COMMIT操作经过MGR的applier模块
3. applier模块通过Global_THD_manager无法找到后台THD
4. applier模块异常 修复思路: 修改线程搜索算法,支持Global_THD_manager可以搜索daemon thread。
反馈社区
打开bugs.mysql.com
1. Report a bug
2. 填写Bug相关描述信息
3. 给出复现步骤
4. 给出修改建议
5. 附加可以提交测例文件以及修复patch
https://bugs.mysql.com/bug.php?id=107635
本文转载自公共号GreatSQL社区。
