MySQL半同步复制--RUN_HOOK
来源:互联网 发布:淘宝买gtx1080截图 编辑:程序博客网 时间:2024/06/05 18:27
半同步复制只是一个插件,一个动态加载的插件怎么实现事务处理线程等待、停下来呢?
这个插件只是个实现体,在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 (((Observer *)info->observer)->f && ((Observer *)info->observer)->f args){ ... }}...到这里就很清楚了,此处用了观察者模式,最终回调typedef Binlog_relay_IO_observer Observer的thread_start.初始化的时候Binlog_relay_IO_observer是以插件的形式通过register_binlog_relay_io_observer函数注册到观察者list里面,所以最终实现io的功能是在plugin/semisync实现.
replication.h/** Observes and extends the service of slave IO thread.*/typedef struct Binlog_relay_IO_observer { uint32 len; /** This callback is called when slave IO thread starts @param param Observer common parameter @retval 0 Sucess @retval 1 Failure */ int (*thread_start)(Binlog_relay_IO_param *param); /** This callback is called when slave IO thread stops @param param Observer common parameter @retval 0 Sucess @retval 1 Failure */ int (*thread_stop)(Binlog_relay_IO_param *param); /** This callback is called before slave requesting binlog transmission from master This is called before slave issuing BINLOG_DUMP command to master to request binlog. @param param Observer common parameter @param flags binlog dump flags @retval 0 Sucess @retval 1 Failure */ int (*before_request_transmit)(Binlog_relay_IO_param *param, uint32 flags); /** This callback is called after read an event packet from master @param param Observer common parameter @param packet The event packet read from master @param len Length of the event packet read from master @param event_buf The event packet return after process @param event_len The length of event packet return after process @retval 0 Sucess @retval 1 Failure */ int (*after_read_event)(Binlog_relay_IO_param *param, const char *packet, unsigned long len, const char **event_buf, unsigned long *event_len); /** This callback is called after written an event packet to relay log @param param Observer common parameter @param event_buf Event packet written to relay log @param event_len Length of the event packet written to relay log @param flags flags for relay log @retval 0 Sucess @retval 1 Failure */ int (*after_queue_event)(Binlog_relay_IO_param *param, const char *event_buf, unsigned long event_len, uint32 flags); /** This callback is called after reset slave relay log IO status @param param Observer common parameter @retval 0 Sucess @retval 1 Failure */ int (*after_reset_slave)(Binlog_relay_IO_param *param);} Binlog_relay_IO_observer;声明:
semisync_slave_plugin.cc::Binlog_relay_IO_observer relay_io_observer = { sizeof(Binlog_relay_IO_observer), // len repl_semi_slave_io_start,// start repl_semi_slave_io_end,// stop repl_semi_slave_request_dump,// request_transmit repl_semi_slave_read_event,// after_read_event repl_semi_slave_queue_event,// after_queue_event repl_semi_reset_slave,// reset};
即thread_start指向的是函数repl_semi_slave_io_start函数。至此run_hook调用结束。
阅读全文
0 0
- MySQL半同步复制--RUN_HOOK
- MySQL半同步复制
- mysql半同步复制
- MySQL半同步复制
- MySQL半同步复制
- MySql-半同步复制
- MySQL半同步复制
- MySQL半同步复制
- MySQL半同步复制
- mysql半同步复制
- MySQL半同步复制
- MySQL半同步复制
- mysql半同步复制
- MySQL复制之半同步复制
- MySQL的主从复制,半同步复制
- MySQL复制之半同步复制
- mysql半同步复制<一>
- mysql半同步复制<二>
- Android的Cursor的close方法不调用会不会造成内存泄露
- 超简单!Linux下FTP服务器的安装和配置(基于Ubuntu)
- HDU 5877 Weak Pair (dfs 树状数组 || dfs序 主席树)
- svm+hog 训练,检测手写数字
- Asp.net MVC中ViewData与ViewBag的使用方法
- MySQL半同步复制--RUN_HOOK
- 0-1背包问题
- tomcat+nginx+redis实现均衡负载、session共享(二)
- 损失函数
- HDU -- 6188 Duizi and Shunzi 【思维】
- 33 Three.js的材质THREE.MeshBasicMaterial
- 自定义View实现视差特效
- 校招上机题(收集)
- QT笔记