diff --git a/plugin/semisync/semisync_master_plugin.cc b/plugin/semisync/semisync_master_plugin.cc index affc063..f429a93 100644 --- a/plugin/semisync/semisync_master_plugin.cc +++ b/plugin/semisync/semisync_master_plugin.cc @@ -74,6 +74,14 @@ int repl_semi_report_binlog_sync(Binlog_storage_param *param, return 0; } +int repl_semi_report_binlog_before_init(Binlog_storage_param *param, + const char * server_uuid, + PSI_file_key * key_file_binlog_index, + const char * log_bin_index) +{ + return 0; +} + int repl_semi_report_before_dml(Trans_param *param, int& out) { return 0; @@ -417,8 +425,9 @@ Trans_observer trans_observer = { Binlog_storage_observer storage_observer = { sizeof(Binlog_storage_observer), // len - repl_semi_report_binlog_update, // report_update - repl_semi_report_binlog_sync, // after_sync + repl_semi_report_binlog_update, // report_update + repl_semi_report_binlog_sync, // after_sync + repl_semi_report_binlog_before_init, // before_binlog_init }; Binlog_transmit_observer transmit_observer = { diff --git a/sql/binlog.cc b/sql/binlog.cc index 078cec9..6e06282 100644 --- a/sql/binlog.cc +++ b/sql/binlog.cc @@ -7775,6 +7775,15 @@ int MYSQL_BIN_LOG::open_binlog(const char *opt_name) DBUG_ASSERT(total_ha_2pc > 1 || (1 == total_ha_2pc && opt_bin_log)); DBUG_ASSERT(opt_name && opt_name[0]); + int ret= RUN_HOOK(binlog_storage, before_binlog_init, + (NULL, server_uuid, &key_file_binlog_index, log_bin_index)); + + if (ret) + { + sql_print_information("RUN_HOOK before_binlog_init ret %d", ret); + unireg_abort(1); + } + if (!my_b_inited(&index_file)) { /* There was a failure to open the index file, can't open the binlog */ diff --git a/sql/replication.h b/sql/replication.h index 0a1124b..c5ddfe7 100644 --- a/sql/replication.h +++ b/sql/replication.h @@ -333,6 +333,10 @@ typedef struct Binlog_storage_observer { const char *log_file, my_off_t log_pos); int (*after_sync)(Binlog_storage_param *param, const char *log_file, my_off_t log_pos); + int (*before_binlog_init)(Binlog_storage_param *param, + const char *server_uuid, + PSI_file_key *key_file_binlog_index, + const char *log_bin_index ); } Binlog_storage_observer; /** diff --git a/sql/rpl_handler.cc b/sql/rpl_handler.cc index e5ea51b..24edff8 100644 --- a/sql/rpl_handler.cc +++ b/sql/rpl_handler.cc @@ -575,6 +575,20 @@ int Binlog_storage_delegate::after_flush(THD *thd, DBUG_RETURN(ret); } +int Binlog_storage_delegate::before_binlog_init(THD * thd, + const char *server_uuid, + PSI_file_key *key_file_binlog_index, + const char *log_bin_index) +{ + DBUG_ENTER("Binlog_storage_delegate::before_binlog_init"); + Binlog_storage_param param; + param.server_id= thd->server_id; + + int ret= 0; + FOREACH_OBSERVER(ret, before_binlog_init, thd, (¶m, server_uuid, key_file_binlog_index, log_bin_index)); + DBUG_RETURN(ret); +} + /** * This hook MUST be invoked after ALL recovery operations are performed * and the server is ready to serve clients. diff --git a/sql/rpl_handler.h b/sql/rpl_handler.h index 97921e8..58e29c0 100644 --- a/sql/rpl_handler.h +++ b/sql/rpl_handler.h @@ -239,6 +239,9 @@ public: my_off_t log_pos); int after_sync(THD *thd, const char *log_file, my_off_t log_pos); + int before_binlog_init(THD *thd, const char *server_uuid, + PSI_file_key *key_file_binlog_index, + const char *log_bin_index); }; #ifdef HAVE_REPLICATION