mariadb/mysql-test/include/rpl_sync.inc
Kristian Nielsen 7081f2a58e Binlog-in-engine: New binlog implementation integrated in InnoDB
Implement an improved binlog implementation that is integrated into
the storage engine. The new implementation is enabled with the
--binlog-storage-engine option. Initially the InnoDB storage engine
implements the binlog.

Integrating the binlog in the storage engine improves performance,
since it makes the InnoDB redo log the single source of truth and
avoids the need for expensive two-phase commit between binlog and
engine. It also makes it possible to disable durability (set
--innodb-flush-log-at-trx-commit=0) to further improve performance,
while still preserving the ability to recover the binlog and database
into a consistent state after a crash.

The new binlog implementation also greatly improves the internal
design and implementation of the binlog, and enables future
enhancements for replication.

This is a squash of the original 11.4-based patch series.

Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
2026-01-23 03:21:03 +01:00

205 lines
6.2 KiB
PHP

# ==== Purpose ====
#
# Sync all servers in an arbitrary replication topology. This works
# only if the servers have been configured with rpl_init.inc (and
# possibly rpl_change_topology.inc).
#
#
# ==== Usage ====
#
# [--let $rpl_only_running_threads= 1]
# [--let $rpl_debug= 1]
# [--let $slave_timeout= NUMBER]
# [--let $disable_gtid= 1]
# --source include/rpl_sync.inc
#
# Parameters:
# $rpl_only_running_threads
# By default, this script assumes that both the IO thread and the
# SQL thread are running and fails if one of them is stopped. If
# $rpl_only_running_threads is set, this script first checks
# which slave threads are running:
# - If both threads are running, sync both threads with master.
# - If only IO thread is running, sync IO thread with master.
# - If only SQL thread is running, sync SQL thread with IO thread.
# - If no thread is running, don't sync.
#
# $disable_gtid
# Use old-style file/offset for syncing, even if slave is configured
# to connect using GTID. (Useful for tests that run without properly
# configuring domain_id, like rpl.rpl_circular_for_4_hosts).
#
# $slave_timeout
# Set the timeout when waiting for threads to sync. See
# include/wait_for_slave_param.inc
#
# $rpl_debug
# See include/rpl_init.inc
#
#
# ==== Side effects ====
#
# Does not change the current connection (note that this is different
# from mysqltest's built-in sync_slave_with_master command).
--let $include_filename= rpl_sync.inc
--source include/begin_include_file.inc
# Compute $rpl_sync_chain if needed. We could have done this in
# rpl_change_topology.inc, but instead we do it here because that
# means we only compute $rpl_sync_chain when it is needed.
if ($rpl_sync_chain_dirty)
{
--source include/rpl_generate_sync_chain.inc
--let $rpl_sync_chain_dirty= 0
}
if ($rpl_debug)
{
--echo \$rpl_sync_chain = '$rpl_sync_chain' \$rpl_only_running_threads= $rpl_only_running_threads
}
if (!$rpl_server_count_length)
{
--die \$rpl_server_count_length is not set. Did you call rpl_init.inc?
}
--let $_rpl_i= 1
--let $_rpl_connect= 0
while ($_rpl_i) {
# $rpl_sync_chain consists of a sequence of sync chains. Each sync
# chain has the form:
#
# <space><server1_1><server1_2>...<server1_N>
#
# So the space character indicates that a new sync chain starts.
--let $_rpl_server= `SELECT TRIM(SUBSTR('$rpl_sync_chain', 1 + ($_rpl_i - 1) * $rpl_server_count_length, $rpl_server_count_length))`
if ($_rpl_server)
{
disable_query_log;
--connection server_$_rpl_server
enable_query_log;
# By default, sync using GTID (when GTID is enabled), as GTID is now
# on by default. But allow to fallback explicitly to old-style file/pos
# for tests that need this.
--let $_rpl_gtid_mode= query_get_value(SHOW SLAVE STATUS, Using_Gtid, 1)
if ($disable_gtid)
{
--let $_rpl_gtid_mode= No
}
if ($rpl_debug)
{
--echo [sync server_$_rpl_prev_server -> server_$_rpl_server]
}
if ($rpl_only_running_threads)
{
disable_connect_log;
--connection server_$_rpl_server
enable_connect_log;
--let $_rpl_slave_io_running= query_get_value(SHOW SLAVE STATUS, Slave_IO_Running, 1)
--let $_rpl_slave_sql_running= query_get_value(SHOW SLAVE STATUS, Slave_SQL_Running, 1)
if ($rpl_debug)
{
--echo Sync IO: $_rpl_slave_io_running; Sync SQL: $_rpl_slave_sql_running
}
--let $_rpl_slave_io_running= `SELECT IF('$_rpl_slave_io_running' != 'No', 1, '')`
--let $_rpl_slave_sql_running= `SELECT IF('$_rpl_slave_sql_running' = 'Yes', 1, '')`
if ($_rpl_slave_io_running)
{
disable_query_log;
--connection server_$_rpl_prev_server
enable_query_log;
if ($_rpl_slave_sql_running)
{
if ($_rpl_gtid_mode == 'No')
{
if ($rpl_debug)
{
--let $_rpl_master_file= query_get_value("SHOW MASTER STATUS", File, 1)
--let $_rpl_master_pos= query_get_value("SHOW MASTER STATUS", Position, 1)
--echo syncing master_file='$_rpl_master_file' master_pos='$_rpl_master_pos'
}
disable_connect_log;
--sync_slave_with_master server_$_rpl_server
enable_connect_log;
}
if ($_rpl_gtid_mode != 'No')
{
--source include/save_master_gtid.inc
disable_connect_log;
--connection server_$_rpl_server
if ($rpl_debug)
{
--echo syncing with GTID position '$master_pos'
}
--source include/sync_with_master_gtid.inc
enable_connect_log;
}
}
if (!$_rpl_slave_sql_running)
{
--let $sync_slave_connection= server_$_rpl_server
--source include/sync_slave_io_with_master.inc
}
}
if (!$_rpl_slave_io_running)
{
if ($_rpl_slave_sql_running)
{
--source include/sync_slave_sql_with_io.inc
}
}
}
if (!$rpl_only_running_threads)
{
disable_connect_log;
--connection server_$_rpl_prev_server
if ($_rpl_gtid_mode == 'No') {
if ($rpl_debug)
{
--let $_rpl_master_file= query_get_value("SHOW MASTER STATUS", File, 1)
--let $_rpl_master_pos= query_get_value("SHOW MASTER STATUS", Position, 1)
--echo syncing master_file='$_rpl_master_file' master_pos='$_rpl_master_pos'
}
--sync_slave_with_master server_$_rpl_server
}
if ($_rpl_gtid_mode != 'No') {
--source include/save_master_gtid.inc
disable_connect_log;
--connection server_$_rpl_server
if ($rpl_debug)
{
--echo syncing with GTID position'$master_pos'
}
--source include/sync_with_master_gtid.inc
}
enable_connect_log;
}
}
# This happens at the beginning of a new sync subchain and at the
# end of the full sync chain.
if (!$_rpl_server)
{
--inc $_rpl_i
--let $_rpl_server= `SELECT TRIM(SUBSTR('$rpl_sync_chain', 1 + ($_rpl_i - 1) * $rpl_server_count_length, $rpl_server_count_length))`
if (!$_rpl_server)
{
# terminate loop
--let $_rpl_i= -1
}
}
--let $_rpl_prev_server= $_rpl_server
--inc $_rpl_i
}
--let $include_filename= rpl_sync.inc
--source include/end_include_file.inc