mirror of
https://github.com/MariaDB/server.git
synced 2025-02-15 18:05:32 +01:00
![Andrei](/assets/img/avatar_default.png)
that is not in binlog. Post-crash recovery of --rpl-semi-sync-slave-enabled server failed to recognize a transaction in-doubt that needed rolled back. A prepared-but-not-in-binlog transaction gets committed instead to possibly create inconsistency with a master (e.g the way it was observed in the bug report). The semisync recovery is corrected now with initializing binlog coordinates of any transaction in-doubt to the maximum offset which is unreachable. In effect when a prepared transaction that is not found in binlog it will be decided to rollback because it's guaranteed to reside in a truncated tail area of binlog. Mtr tests are reinforced to cover the described scenario.
61 lines
2.1 KiB
Text
61 lines
2.1 KiB
Text
call mtr.add_suppression("Can.t init tc log");
|
|
call mtr.add_suppression("Aborting");
|
|
SET @@global.max_binlog_size= 4096;
|
|
SET @@global.sync_binlog= 1;
|
|
RESET MASTER;
|
|
FLUSH LOGS;
|
|
CREATE TABLE ti (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb;
|
|
CREATE TABLE tm (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=MyISAM;
|
|
connect master1,localhost,root,,;
|
|
"List of binary logs before rotation"
|
|
show binary logs;
|
|
Log_name File_size
|
|
master-bin.000001 #
|
|
master-bin.000002 #
|
|
INSERT INTO ti VALUES(1,"I am gonna survive");
|
|
INSERT INTO tm VALUES(1,"me too!");
|
|
SET DEBUG_SYNC= "commit_after_release_LOCK_after_binlog_sync SIGNAL master1_ready WAIT_FOR master1_go_never_arrives";
|
|
INSERT INTO ti VALUES (2, REPEAT("x", 4100));
|
|
connect master2,localhost,root,,;
|
|
SET DEBUG_SYNC= "now WAIT_FOR master1_ready";
|
|
SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL master2_ready WAIT_FOR master2_go_never_arrives";
|
|
INSERT INTO ti VALUES (3, "not gonna survive");
|
|
connection default;
|
|
SET DEBUG_SYNC= "now WAIT_FOR master2_ready";
|
|
connect master3,localhost,root,,;
|
|
SET DEBUG_SYNC= "ha_commit_trans_before_log_and_order SIGNAL master3_ready WAIT_FOR master3_go_never_arrives";
|
|
INSERT INTO ti VALUES (4, "not gonna be log therefore survive"),(5, "ditto");
|
|
connection default;
|
|
SET DEBUG_SYNC= "now WAIT_FOR master3_ready";
|
|
"List of binary logs before crash"
|
|
show binary logs;
|
|
Log_name File_size
|
|
master-bin.000001 #
|
|
master-bin.000002 #
|
|
master-bin.000003 #
|
|
# The gtid binlog state prior the crash will be truncated at the end of the test
|
|
SELECT @@global.gtid_binlog_state;
|
|
@@global.gtid_binlog_state
|
|
0-1-6
|
|
connection default;
|
|
# Kill the server
|
|
disconnect master1;
|
|
disconnect master2;
|
|
disconnect master3;
|
|
# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3
|
|
FOUND 1 /truncated binlog file:.*master.*000002/ in mysqld.1.err
|
|
"One record should be present in table"
|
|
SELECT * FROM ti;
|
|
a b
|
|
1 I am gonna survive
|
|
# The truncated gtid binlog state
|
|
SELECT @@global.gtid_binlog_state;
|
|
@@global.gtid_binlog_state
|
|
0-1-4
|
|
SELECT @@global.gtid_binlog_pos;
|
|
@@global.gtid_binlog_pos
|
|
0-1-4
|
|
# Cleanup
|
|
DROP TABLE ti;
|
|
SET @@global.sync_binlog= default;
|
|
# End of the tests
|