mysql-test/include/rpl_init_raft.inc (108 lines of code) (raw):

# TODO: check if the topology is supported in raft --let $_rpl_server= $rpl_server_count while ($_rpl_server) { --source include/have_gtid.inc if (`SELECT COUNT(*) = 0 OR VARIABLE_VALUE = 'NONE' FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'BINLOG_CHECKSUM'`) { --skip Mysql Raft cannot be enabled without binlog checksums } # Store the orginial values of these server variables as a string delimited by ':', one value for each server let $rpl_raft_orig_sync_binlog= `SELECT CONCAT((SELECT @@GLOBAL.SYNC_BINLOG), ':', '$rpl_raft_orig_sync_binlog')`; let $rpl_raft_orig_innodb_flush= `SELECT CONCAT((SELECT @@GLOBAL.INNODB_FLUSH_LOG_AT_TRX_COMMIT), ':', '$rpl_raft_orig_innodb_flush')`; let $rpl_raft_orig_innodb_doublewrite= `SELECT CONCAT((SELECT @@GLOBAL.INNODB_DOUBLEWRITE), ':', '$rpl_raft_orig_innodb_doublewrite')`; let $rpl_raft_orig_sync_binlog= `SELECT TRIM(BOTH ':' FROM '$rpl_raft_orig_sync_binlog')`; let $rpl_raft_orig_innodb_flush= `SELECT TRIM(BOTH ':' FROM '$rpl_raft_orig_innodb_flush')`; let $rpl_raft_orig_innodb_doublewrite= `SELECT TRIM(BOTH ':' FROM '$rpl_raft_orig_innodb_doublewrite')`; # Check if the plugin binary exists in the plugin dir --let $plugin_dir= `SELECT @@GLOBAL.PLUGIN_DIR` --file_exists $plugin_dir/mysql_raft_repl.so --let $rpl_connection_name= server_$_rpl_server --source include/rpl_connection.inc --let $ipv6_host_port= `SELECT CONCAT('[::1]', ':', (SELECT @@GLOBAL.PORT), ',')` let $date= `SELECT DATE_FORMAT(NOW(), '%m-%d-%Y')`; eval SET @@GLOBAL.RPL_RAFT_SKIP_SMC_UPDATES= 'ON,$date'; eval SET @@GLOBAL.RPL_RAFT_MYSQL_REPL_USER= "root"; --dec $_rpl_server } let $socket_dir= `SELECT SUBSTRING(VARIABLE_VALUE, 1, LOCATE(SUBSTRING_INDEX( VARIABLE_VALUE, '/', -1), VARIABLE_VALUE) - 2) FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'socket'`; exec ./include/raft_config.py $rpl_server_count $socket_dir; --let $_rpl_server= $rpl_server_count while ($_rpl_server) { --let $rpl_connection_name= server_$_rpl_server --source include/rpl_connection.inc --let $_is_slave= `SELECT SUBSTRING('$rpl_master_list', 1 + ($_rpl_server - 1) * $rpl_server_count_length, $rpl_server_count_length) != ''` let $fs_wal_path = `SELECT CONCAT((SELECT @@GLOBAL.RPL_RAFT_WAL_DIR), '/', (SELECT @@GLOBAL.PORT))`; exec rm -fr $fs_wal_path; exec mkdir -p $fs_wal_path; --let $raft_plugin_early_installed= `SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'RPL_RAFT'` # Install plugin if (!$raft_plugin_early_installed) { INSTALL PLUGIN RPL_RAFT SONAME 'mysql_raft_repl.so'; } if ($_is_slave) { let $_slave_io_state= query_get_value(SHOW SLAVE STATUS, Slave_IO_Running, 1); let $_running= `SELECT '$_slave_io_running' = 'Yes'`; if ($_running != 0) { STOP SLAVE IO_THREAD; } # Disable failure detection on the slaves so that master becomes the leader SET GLOBAL RPL_RAFT_LEADER_FAILURE_DETECTION= OFF; } SET GLOBAL ENABLE_RAFT_PLUGIN= ON; # Enable raft plugin send SET GLOBAL RPL_RAFT_ON= ON; --dec $_rpl_server } --let $_rpl_server= $rpl_server_count while ($_rpl_server) { --let $rpl_connection_name= server_$_rpl_server --source include/rpl_connection.inc reap; let $_is_mysql_slave= `SELECT SUBSTRING('$rpl_master_list', 1 + ($_rpl_server - 1) * $rpl_server_count_length, $rpl_server_count_length) != ''`; # Stash master's connection if (!$_is_mysql_slave) { let $master_server_num= $_rpl_server; } --dec $_rpl_server } # Wait for the master to become the leader --let $rpl_connection_name= server_$master_server_num --source include/rpl_connection.inc --let $status_var= RPL_RAFT_ROLE --let $status_var_value= LEADER --source include/wait_for_status_var.inc # The master should be the leader in term 1 --let $assert_cond= VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = "RPL_RAFT_TERM" --let $assert_text= Term should be 1 --source include/assert.inc # Enable failure detection let $_rpl_server= $rpl_server_count; while ($_rpl_server) { let $rpl_connection_name= server_$_rpl_server; source include/rpl_connection.inc; SET GLOBAL RPL_RAFT_LEADER_FAILURE_DETECTION= ON; if ($_rpl_server != $master_server_num) { source include/wait_for_slave_sql_to_start.inc; } if ($_rpl_server == $master_server_num) { let $max_sleep= 300; while (!$_leader_writeable) { let $_leader_writeable= `SELECT @@GLOBAL.READ_ONLY = 0`; sleep 1; let $max_sleep= $max_sleep - 1; if ($max_sleep == 0) { die "Timeout while waiting for read_only = 0 on leader"; } } } dec $_rpl_server; } if ($rpl_debug) { --echo "Raft leadership transferred to true master" }