Skip to content

Commit a85b8d3

Browse files
SBR support for binlog trx meta data
Summary: Supporting binlog trx meta data for SBR. The meta data event is written right before every query event in a trx representing a statement. Squash with: D5220355 Reviewed By: tianx Differential Revision: D5530983 fbshipit-source-id: b6a490f
1 parent b653b11 commit a85b8d3

File tree

4 files changed

+49
-29
lines changed

4 files changed

+49
-29
lines changed

mysql-test/suite/rpl/r/binlog_trx_meta_data.result

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ set @save.binlog_trx_meta_data= @@global.binlog_trx_meta_data;
77
set @@global.binlog_trx_meta_data= true;
88
set @save.binlog_trx_meta_data= @@global.binlog_trx_meta_data;
99
set @@global.binlog_trx_meta_data= true;
10-
include/sync_slave_sql_with_master.inc
11-
include/sync_slave_sql_with_master.inc
1210
meta count(*)
13-
# /*::TRX_META_DATA::{"timestamps":[ts]}*/ 134
11+
# /*::TRX_META_DATA::{"timestamps":[ts]}*/ 301
1412
meta count(*)
15-
# /*::TRX_META_DATA::{"timestamps":[ts,ts]}*/ 134
13+
# /*::TRX_META_DATA::{"timestamps":[ts,ts]}*/ 301
14+
drop table t1;
15+
set @@global.binlog_trx_meta_data= @save.binlog_trx_meta_data;
16+
set @@global.binlog_trx_meta_data= @save.binlog_trx_meta_data;
1617
include/rpl_end.inc

mysql-test/suite/rpl/t/binlog_trx_meta_data.test

+21-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
source include/master-slave.inc;
2-
source include/have_binlog_format_row.inc;
32

43
# Enable trx meta data
54
connection master;
@@ -12,15 +11,28 @@ set @@global.binlog_trx_meta_data= true;
1211

1312
# Generate load
1413
connection master;
15-
let $skip_cleanup= 1;
16-
let $sync_with_master= 1;
17-
let $databases=2;
18-
let $iter=5;
19-
source extra/rpl_tests/rpl_parallel_simple_load.test;
14+
disable_result_log;
15+
disable_query_log;
16+
create table t1(a int) engine=innodb;
17+
# the following loop will generate 300 meta data events, 1 for each statement
18+
# the total number of meta data events will be 301, +1 for create stmt above
19+
let $iter= 100;
20+
while ($iter > 0)
21+
{
22+
begin;
23+
eval insert into t1 values($iter);
24+
eval update t1 set a= $iter + 1;
25+
delete from t1;
26+
commit;
27+
dec $iter;
28+
}
2029
enable_result_log;
30+
enable_query_log;
31+
sync_slave_with_master;
2132

2233
# Check binlogs for meta data
2334
connection master;
35+
disable_query_log;
2436
let $MYSQLD_DATADIR = `select @@datadir`;
2537
let $MYSQLD_SECURE_FILE_DIR = `select @@secure_file_priv`;
2638
exec $MYSQL_BINLOG -v -v $MYSQLD_DATADIR/master-bin.0* | grep "::TRX_META_DATA::" | sed 's/\"[0-9]*\"/ts/g' > $MYSQLD_SECURE_FILE_DIR/meta_data.dat;
@@ -43,16 +55,12 @@ select meta, count(*) from test.meta_data;
4355
drop table test.meta_data;
4456
set sql_log_bin=1;
4557
remove_file $MYSQLD_SECURE_FILE_DIR/meta_data.dat;
46-
47-
# Consistency check
48-
connection master;
49-
let $include_silent=1;
50-
source extra/rpl_tests/rpl_parallel_simple_load_consistency.test;
51-
let $include_silent=;
58+
enable_query_log;
5259

5360
# Cleanup
5461
connection master;
55-
source extra/rpl_tests/rpl_parallel_simple_load_cleanup.test;
62+
drop table t1;
63+
sync_slave_with_master;
5664
connection slave;
5765
set @@global.binlog_trx_meta_data= @save.binlog_trx_meta_data;
5866
connection master;

sql/binlog.cc

+21-11
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,8 @@ class binlog_cache_data
340340
void add_time_meta_data(THD *thd, ptree &meta_data_root);
341341
int finalize(THD *thd, Log_event *end_event);
342342
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);
344345

345346
virtual ~binlog_cache_data()
346347
{
@@ -981,7 +982,9 @@ static bool should_write_gtids(THD *thd) {
981982
return (!read_only || thd->variables.gtid_next.type == GTID_GROUP);
982983
}
983984

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)
985988
{
986989
DBUG_ENTER("binlog_cache_data::write_event");
987990

@@ -1001,6 +1004,11 @@ int binlog_cache_data::write_event(THD *thd, Log_event *ev)
10011004

10021005
if (ev != NULL)
10031006
{
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+
10041012
DBUG_EXECUTE_IF("simulate_disk_full_at_flush_pending",
10051013
{DBUG_SET("+d,simulate_file_write_error");});
10061014
if (ev->write(&cache_log) != 0)
@@ -5830,7 +5838,9 @@ MYSQL_BIN_LOG::flush_and_set_pending_rows_event(THD *thd,
58305838
Write an event to the binary log.
58315839
*/
58325840

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)
58345844
{
58355845
THD *thd= event_info->thd;
58365846
bool error= 1;
@@ -5980,7 +5990,7 @@ bool MYSQL_BIN_LOG::write_event(Log_event *event_info, int force_cache_type)
59805990
/*
59815991
Write the event.
59825992
*/
5983-
if (cache_data->write_event(thd, event_info) ||
5993+
if (cache_data->write_event(thd, event_info, write_meta_data_event) ||
59845994
DBUG_EVALUATE_IF("injecting_fault_writing", true, false))
59855995
goto err;
59865996

@@ -8397,11 +8407,6 @@ int THD::binlog_write_table_map(TABLE *table, bool is_transactional,
83978407
binlog_cache_data *cache_data=
83988408
cache_mngr->get_binlog_cache_data(is_transactional);
83998409

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-
84058410
if (binlog_rows_query && this->query())
84068411
{
84078412
/* 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,
84118416
DBUG_RETURN(error);
84128417
}
84138418

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)))
84158421
DBUG_RETURN(error);
84168422

84178423
binlog_table_maps++;
@@ -10233,7 +10239,11 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
1023310239
log event is written to the binary log, we pretend that no
1023410240
table maps were written.
1023510241
*/
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);
1023710247
binlog_table_maps= 0;
1023810248
DBUG_RETURN(error);
1023910249
}

sql/binlog.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,8 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG
664664
int new_file(Format_description_log_event *extra_description_event);
665665

666666
bool write_event(Log_event* event_info,
667-
int force_cache_type = Log_event::EVENT_INVALID_CACHE);
667+
int force_cache_type = Log_event::EVENT_INVALID_CACHE,
668+
bool write_meta_data_event= false);
668669
bool write_cache(THD *thd, class binlog_cache_data *binlog_cache_data,
669670
bool async);
670671
int do_write_cache(IO_CACHE *cache);

0 commit comments

Comments
 (0)