半同步复制只是一个插件,一个动态加载的插件怎么实现事务处理线程等待、停下来呢?
这个插件只是个实现体,在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_relay_IO_param param;
init_param(¶m, mi);
int ret= 0;
FOREACH_OBSERVER(ret, thread_start, thd, (¶m));
return ret;
}关键在FOREACH_OBSERVER这个宏定义:
#define FOREACH_OBSERVER(r, f, thd, args) \
...
for (; info; info= iter++){
if ((