@@ -340,7 +340,8 @@ class binlog_cache_data
340
340
void add_time_meta_data (THD *thd, ptree &meta_data_root);
341
341
int finalize (THD *thd, Log_event *end_event);
342
342
int flush (THD *thd, my_off_t *bytes, bool *wrote_xid, bool async);
343
- int write_event (THD *thd, Log_event *event);
343
+ int write_event (THD *thd, Log_event *event,
344
+ bool write_meta_data_event= false );
344
345
345
346
virtual ~binlog_cache_data ()
346
347
{
@@ -981,7 +982,9 @@ static bool should_write_gtids(THD *thd) {
981
982
return (!read_only || thd->variables .gtid_next .type == GTID_GROUP);
982
983
}
983
984
984
- int binlog_cache_data::write_event (THD *thd, Log_event *ev)
985
+ int binlog_cache_data::write_event (THD *thd,
986
+ Log_event *ev,
987
+ bool write_meta_data_event)
985
988
{
986
989
DBUG_ENTER (" binlog_cache_data::write_event" );
987
990
@@ -1001,6 +1004,11 @@ int binlog_cache_data::write_event(THD *thd, Log_event *ev)
1001
1004
1002
1005
if (ev != NULL )
1003
1006
{
1007
+ // case: write meta data event before the real event
1008
+ // see @opt_binlog_trx_meta_data
1009
+ if (write_meta_data_event && write_trx_meta_data (thd))
1010
+ DBUG_RETURN (1 );
1011
+
1004
1012
DBUG_EXECUTE_IF (" simulate_disk_full_at_flush_pending" ,
1005
1013
{DBUG_SET (" +d,simulate_file_write_error" );});
1006
1014
if (ev->write (&cache_log) != 0 )
@@ -5830,7 +5838,9 @@ MYSQL_BIN_LOG::flush_and_set_pending_rows_event(THD *thd,
5830
5838
Write an event to the binary log.
5831
5839
*/
5832
5840
5833
- bool MYSQL_BIN_LOG::write_event (Log_event *event_info, int force_cache_type)
5841
+ bool MYSQL_BIN_LOG::write_event (Log_event *event_info,
5842
+ int force_cache_type,
5843
+ bool write_meta_data_event)
5834
5844
{
5835
5845
THD *thd= event_info->thd ;
5836
5846
bool error= 1 ;
@@ -5980,7 +5990,7 @@ bool MYSQL_BIN_LOG::write_event(Log_event *event_info, int force_cache_type)
5980
5990
/*
5981
5991
Write the event.
5982
5992
*/
5983
- if (cache_data->write_event (thd, event_info) ||
5993
+ if (cache_data->write_event (thd, event_info, write_meta_data_event ) ||
5984
5994
DBUG_EVALUATE_IF (" injecting_fault_writing" , true , false ))
5985
5995
goto err;
5986
5996
@@ -8397,11 +8407,6 @@ int THD::binlog_write_table_map(TABLE *table, bool is_transactional,
8397
8407
binlog_cache_data *cache_data=
8398
8408
cache_mngr->get_binlog_cache_data (is_transactional);
8399
8409
8400
- // case: add meta data in the binlog
8401
- if (opt_binlog_trx_meta_data &&
8402
- (error= cache_data->write_trx_meta_data (this )))
8403
- DBUG_RETURN (error);
8404
-
8405
8410
if (binlog_rows_query && this ->query ())
8406
8411
{
8407
8412
/* Write the Rows_query_log_event into binlog before the table map */
@@ -8411,7 +8416,8 @@ int THD::binlog_write_table_map(TABLE *table, bool is_transactional,
8411
8416
DBUG_RETURN (error);
8412
8417
}
8413
8418
8414
- if ((error= cache_data->write_event (this , &the_event)))
8419
+ if ((error= cache_data->write_event (this , &the_event,
8420
+ opt_binlog_trx_meta_data)))
8415
8421
DBUG_RETURN (error);
8416
8422
8417
8423
binlog_table_maps++;
@@ -10233,7 +10239,11 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
10233
10239
log event is written to the binary log, we pretend that no
10234
10240
table maps were written.
10235
10241
*/
10236
- int error= mysql_bin_log.write_event (&qinfo);
10242
+ int error= mysql_bin_log.write_event (&qinfo,
10243
+ /* default parameter */
10244
+ Log_event::EVENT_INVALID_CACHE,
10245
+ /* write meta data before query? */
10246
+ opt_binlog_trx_meta_data);
10237
10247
binlog_table_maps= 0 ;
10238
10248
DBUG_RETURN (error);
10239
10249
}
0 commit comments