MySQL的插件功能通过委托回调机制来实现。
拿Binlog_relay_IO_delegate(委托者的一种)来讲,它有很多委托方法,比如说after_read_event,是在读取一个binlog event之后进行回调,MySQL半同步插件就跟这个委托者相关。
下面来看Binlog_relay_IO_delegate中的after_read_event委托函数是如何进行回调的,详细过程如下
IO线程在读取一个binlog event之后,调用
if (RUN_HOOK(binlog_relay_io, after_read_event,
(thd, mi,(const char*)mysql->net.read_pos + 1,
event_len, &event_buf, &event_len)))
{
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
ER(ER_SLAVE_FATAL_ERROR),
"Failed to run 'after_read_event' hook");
goto err;
}
其中RUN_HOOK宏定义如下
#define RUN_HOOK(group, hook, args) \
(group ##_delegate->is_empty() ? \
0 : group ##_delegate->hook args)
通过RUN_HOOK宏定义可以统一所有的委托者中不同委托方法进行回调的写法,只需要传入不同的参数即可。比如afte