mirror of
https://github.com/MariaDB/server.git
synced 2025-02-15 09:55:33 +01:00
![Brandon Nesterenko](/assets/img/avatar_default.png)
Row-injection updates don’t correctly set the historical partition for tables with system versioning and system_time partitions. This results in inconsistencies between the master and slave when replicating transactions that target such tables (i.e. the primary server would correctly distribute archived rows amongst its partitions, whereas the replica would have all archived rows in a single partition). The function partition_info::vers_set_hist_part(THD*) is used to set the partition; however, its initial check for vers_require_hist_part(THD*) returns false, bypassing the rest of the function (which sets up the partition to use). This is because the actual check uses the LEX sql_command (via LEX::vers_history_generating()) to determine if the command is valid to generate history. Row injections don’t have sql_commands though. This patch provides a fix which extends the check in vers_history_generating() to additionally allow row injections to be history generating (via the function LEX::is_stmt_row_injection()). Special thanks to Jan Lindstrom <jan.lindstrom@galeracluster.com> for his work in reproducing the bug, and providing an initial test case. Reviewed By ============ Kristian Nielsen <knielsen@knielsen-hq.org> Aleksey Midenkov <midenok@mariadb.com>
71 lines
2.5 KiB
Text
71 lines
2.5 KiB
Text
include/master-slave.inc
|
|
[connection master]
|
|
#
|
|
# Initialize system-versioned and partitioned table and its data
|
|
connection master;
|
|
SET timestamp=UNIX_TIMESTAMP('2025-01-01 01:00:00.000000');
|
|
RESET MASTER;
|
|
create table t1 (x int) engine=InnoDB with system versioning partition by system_time limit 3 partitions 5;
|
|
insert into t1 values(1);
|
|
insert into t1 values(2);
|
|
insert into t1 values(3);
|
|
insert into t1 values(4);
|
|
insert into t1 values(5);
|
|
# Verifying master partitions are correct after data insertion..
|
|
# .. done
|
|
connection slave;
|
|
connection slave;
|
|
# Verifying partitions of master and slave match on data setup..
|
|
# .. done
|
|
#
|
|
# "Delete" each row -- these are the BINLOG commands generated by
|
|
# mysqlbinlog from `delete from t1 where x=<n>` statments. Because the
|
|
# table uses system versioning and system_time partition, the actual
|
|
# events are updates, with added fields for the `row_start` and `row_end`
|
|
# columns.
|
|
connection master;
|
|
# BINLOG for Format Description event
|
|
BINLOG '
|
|
APZ0Zw8BAAAA/AAAAAABAAAAAAQAMTAuNi4yMS1NYXJpYURCLWRlYnVnLWxvZwAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAA9nRnEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAA
|
|
CgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAEEwQADQgICAoKCgHgiCNP
|
|
';
|
|
# BINLOG for delete from t1 where x=1;
|
|
BINLOG '
|
|
APZ0ZxMBAAAAMQAAAAQHAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBvaHPfA==
|
|
APZ0ZxgBAAAASAAAAEwHAAAAACEAAAAAAAEAAwcH+AEAAABndPYAAAAAf////w9CP/gBAAAAZ3T2
|
|
AAAAAGd09gAAAADnhA23
|
|
';
|
|
# BINLOG for delete from t1 where x=2;
|
|
BINLOG '
|
|
APZ0ZxMBAAAAMQAAAPUHAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBwNtQNQ==
|
|
APZ0ZxgBAAAASAAAAD0IAAAAACEAAAAAAAEAAwcH+AIAAABndPYAAAAAf////w9CP/gCAAAAZ3T2
|
|
AAAAAGd09gAAAABPYZUX
|
|
';
|
|
# BINLOG for delete from t1 where x=3;
|
|
BINLOG '
|
|
APZ0ZxMBAAAAMQAAAOYIAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBKWGevg==
|
|
APZ0ZxgBAAAASAAAAC4JAAAAACEAAAAAAAEAAwcH+AMAAABndPYAAAAAf////w9CP/gDAAAAZ3T2
|
|
AAAAAGd09gAAAAD0hz5S
|
|
';
|
|
# BINLOG for delete from t1 where x=4;
|
|
BINLOG '
|
|
APZ0ZxMBAAAAMQAAANcJAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBaT9IZg==
|
|
APZ0ZxgBAAAASAAAAB8KAAAAACEAAAAAAAEAAwcH+AQAAABndPYAAAAAf////w9CP/gEAAAAZ3T2
|
|
AAAAAGd09gAAAADA4Tdx
|
|
';
|
|
# BINLOG for delete from t1 where x=5;
|
|
BINLOG '
|
|
APZ0ZxMBAAAAMQAAAMgKAAAAACEAAAAAAAEABHRlc3QAAnQxAAMDERECBgYBMk64Mw==
|
|
APZ0ZxgBAAAASAAAABALAAAAACEAAAAAAAEAAwcH+AUAAABndPYAAAAAf////w9CP/gFAAAAZ3T2
|
|
AAAAAGd09gAAAAA5blY6
|
|
';
|
|
# Verifying master partitions are correct after deletion BINLOG stmts..
|
|
# .. done
|
|
connection slave;
|
|
connection slave;
|
|
connection master;
|
|
drop table t1;
|
|
include/rpl_end.inc
|