mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-34705: Binlog-in-engine: Read side of out-of-band binlogging
With this commit, the out-of-band binlogging of large event groups in multiple smaller records interleaved with other event groups is now working. Instead of flushing the binlog cache to disk when they reach @@binlog_cache_size, instead the cache is binlogged as an out-of-band record. Then at transaction commit, a commit record is written containing just the GTID and a link to the out-of-band data. To facilitate append-only operation, the binlogged records do not have a "next" pointer. Instead, they are written out as a forest of perfect binary trees, the leftmost leaf of one tree pointing to the root of the previous tree. This structure is used in the binlog reader to efficiently read out the event group data consecutively for the binlog dump thread, needing to maintain only O(log(N)) amount of memory during the reading. As part of this commit, the existing binlog reader code is refactored to be greatly improved, with a much cleaner explicit state machine and handling of chunk/page/file boundaries etc. Also fixes some bugs in the gtid_search::find_gtid_pos(). Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
19
mysql-test/suite/binlog_in_engine/rpl_oob.result
Normal file
19
mysql-test/suite/binlog_in_engine/rpl_oob.result
Normal file
@@ -0,0 +1,19 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c TEXT, PRIMARY KEY(a, b)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (0, 0, 'Start');
|
||||
*** Generating 25 large transactions in 5 interleaved connections
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (0, 1, 'End');
|
||||
SELECT COUNT(*), SUM(a), SUM(b), SUM(LENGTH(c)) FROM t1;
|
||||
COUNT(*) SUM(a) SUM(b) SUM(LENGTH(c))
|
||||
2552 33150 128776 5000383
|
||||
include/save_master_gtid.inc
|
||||
connection slave;
|
||||
include/sync_with_master_gtid.inc
|
||||
SELECT COUNT(*), SUM(a), SUM(b), SUM(LENGTH(c)) FROM t1;
|
||||
COUNT(*) SUM(a) SUM(b) SUM(LENGTH(c))
|
||||
2552 33150 128776 5000383
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
69
mysql-test/suite/binlog_in_engine/rpl_oob.test
Normal file
69
mysql-test/suite/binlog_in_engine/rpl_oob.test
Normal file
@@ -0,0 +1,69 @@
|
||||
--source include/have_innodb_binlog.inc
|
||||
--source include/have_binlog_format_row.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
# Test a number of transactions that are large and get interleaved with each
|
||||
# other over multiple binlog files.
|
||||
--let $NUM_CONNECTIONS= 5
|
||||
# $NUM_TRANSACTIONS is total, not per connection.
|
||||
--let $NUM_TRANSACTIONS=25
|
||||
--let $NUM_PIECES= 100
|
||||
--let $PIECE_SIZE= 2000
|
||||
|
||||
|
||||
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, c TEXT, PRIMARY KEY(a, b)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (0, 0, 'Start');
|
||||
|
||||
--echo *** Generating $NUM_TRANSACTIONS large transactions in $NUM_CONNECTIONS interleaved connections
|
||||
--disable_query_log
|
||||
let $t= 0;
|
||||
while ($t < $NUM_TRANSACTIONS) {
|
||||
let $b= $t;
|
||||
let $i= 1;
|
||||
while ($i <= $NUM_CONNECTIONS) {
|
||||
--connect(con$i,localhost,root,,)
|
||||
START TRANSACTION;
|
||||
eval INSERT INTO t1 VALUES ($b + $i, 0, 'Initial $i');
|
||||
inc $i;
|
||||
inc $t;
|
||||
}
|
||||
|
||||
let $p= 1;
|
||||
while ($p <= $NUM_PIECES) {
|
||||
let $i= 1;
|
||||
while ($i <= $NUM_CONNECTIONS) {
|
||||
--connection con$i
|
||||
eval INSERT INTO t1 VALUES ($b + $i, $p, REPEAT(CHR(65 + ($p + $i MOD 26)), $PIECE_SIZE));
|
||||
inc $i;
|
||||
}
|
||||
inc $p;
|
||||
}
|
||||
|
||||
let $i= 1;
|
||||
while ($i <= $NUM_CONNECTIONS) {
|
||||
--connection con$i
|
||||
eval INSERT INTO t1 VALUES ($b + $i, $NUM_PIECES+1, 'Last $i');
|
||||
COMMIT;
|
||||
--disconnect con$i
|
||||
inc $i;
|
||||
}
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--connection master
|
||||
INSERT INTO t1 VALUES (0, 1, 'End');
|
||||
|
||||
SELECT COUNT(*), SUM(a), SUM(b), SUM(LENGTH(c)) FROM t1;
|
||||
--source include/save_master_gtid.inc
|
||||
--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 --start-position=0-1-1 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog.txt
|
||||
|
||||
--connection slave
|
||||
--source include/sync_with_master_gtid.inc
|
||||
SELECT COUNT(*), SUM(a), SUM(b), SUM(LENGTH(c)) FROM t1;
|
||||
|
||||
|
||||
# Cleanup.
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 --start-position=0-1-1 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog.txt
|
||||
--source include/rpl_end.inc
|
Reference in New Issue
Block a user