半同步复制只是一个插件,一个动态加载的插件怎么实现事务处理线程等待、停下来呢?这个插件只是个实现体,在MySQL源码中还是需要支撑这个实现体的框架。即在代码的某些位置,加入一些桩observer,在执行到这些桩的时候,如果有插件在这些observer中注册了实现体,就这执行这些实现体,否则什么也不执行。
RUN_HOOK就是这些桩的调用接口:
#define RUN_HOOK(group, hook, args) (group ##_delegate->is_empty() ? 0 : group ##_delegate->hook args)
以RUN_HOOK(binlog_relay_io, thread_start, (thd, mi))为例:
binlog_relay_io_delegate->thread_start(thd,mi)是RUN_HOOK转换后的调用。
int Binlog_relay_IO_delegate::thread_start(THD *thd, Master_info *mi)
{
Binlog_