mirror of
https://github.com/MariaDB/server.git
synced 2025-12-01 17:39:21 +03:00
Bug#20685029: SLAVE IO THREAD SHOULD STOP WHEN DISK IS
FULL Bug#21753696: MAKE SHOW SLAVE STATUS NON BLOCKING IF IO THREAD WAITS FOR DISK SPACE Problem: ======== Currently SHOW SLAVE STATUS blocks if IO thread waits for disk space. This makes automation tools verifying server health block on taking relevant action. Finally this will create SHOW SLAVE STATUS piles. Analysis: ========= SHOW SLAVE STATUS hangs on mi->data_lock if relay log write is waiting for free disk space while holding mi->data_lock. mi->data_lock is needed to protect the format description event (mi->format_description_event) which is accessed by the clients running FLUSH LOGS and slave IO thread. Note relay log writes don't need to be protected by mi->data_lock, LOCK_log is used to protect relay log between IO and SQL thread (see MYSQL_BIN_LOG::append_event). The code takes mi->data_lock to protect mi->format_description_event during relay log rotate which might get triggered right after relay log write. Fix: ==== Release the data_lock just for the duration of writing into relay log. Made change to ensure the following lock order is maintained to avoid deadlocks. data_lock, LOCK_log data_lock is held during relay log rotations to protect the description event.
This commit is contained in:
@@ -43,6 +43,7 @@
|
||||
#
|
||||
# [--let $rpl_server_count= 7]
|
||||
# --let $rpl_topology= 1->2->3->1->4, 2->5, 6->7
|
||||
# [--let $rpl_extra_connections_per_server= 1]
|
||||
# [--let $rpl_check_server_ids= 1]
|
||||
# [--let $rpl_skip_change_master= 1]
|
||||
# [--let $rpl_skip_start_slave= 1]
|
||||
@@ -65,6 +66,12 @@
|
||||
# want to specify the empty topology (no server replicates at
|
||||
# all), you have to set $rpl_topology=none.
|
||||
#
|
||||
# $rpl_extra_connections_per_server
|
||||
# By default, this script creates connections server_N and
|
||||
# server_N_1. If you can set this variable to a number, the
|
||||
# script creates:
|
||||
# server_N, server_N_1, ..., server_N_$rpl_extra_connections_per_server
|
||||
#
|
||||
# $rpl_check_server_ids
|
||||
# If $rpl_check_server_ids is set, this script checks that the
|
||||
# @@server_id of all servers are different. This is normally
|
||||
@@ -139,8 +146,17 @@ if (!$SERVER_MYPORT_4)
|
||||
# Check that $rpl_server_count is set
|
||||
if (!$rpl_server_count)
|
||||
{
|
||||
--let $_compute_rpl_server_count= `SELECT REPLACE('$rpl_topology', '->', ',')`
|
||||
--let $rpl_server_count= `SELECT GREATEST($_compute_rpl_server_count)`
|
||||
--let $rpl_server_count= `SELECT REPLACE('$rpl_topology', '->', ',')`
|
||||
if (`SELECT LOCATE(',', '$rpl_server_count')`)
|
||||
{
|
||||
--let $rpl_server_count= `SELECT GREATEST($rpl_server_count)`
|
||||
}
|
||||
}
|
||||
|
||||
--let $_rpl_extra_connections_per_server= $rpl_extra_connections_per_server
|
||||
if ($_rpl_extra_connections_per_server == '')
|
||||
{
|
||||
--let $_rpl_extra_connections_per_server= 1
|
||||
}
|
||||
|
||||
|
||||
@@ -159,15 +175,20 @@ if (!$rpl_debug)
|
||||
# Create two connections to each server; reset master/slave, select
|
||||
# database, set autoinc variables.
|
||||
--let $_rpl_server= $rpl_server_count
|
||||
--let $_rpl_one= _1
|
||||
--let $underscore= _
|
||||
while ($_rpl_server)
|
||||
{
|
||||
# Connect.
|
||||
--let $rpl_server_number= $_rpl_server
|
||||
--let $rpl_connection_name= server_$_rpl_server
|
||||
--source include/rpl_connect.inc
|
||||
--let $rpl_connection_name= server_$_rpl_server$_rpl_one
|
||||
--source include/rpl_connect.inc
|
||||
--let $_rpl_connection_number= 1
|
||||
while ($_rpl_connection_number <= $_rpl_extra_connections_per_server)
|
||||
{
|
||||
--let $rpl_connection_name= server_$_rpl_server$underscore$_rpl_connection_number
|
||||
--source include/rpl_connect.inc
|
||||
--inc $_rpl_connection_number
|
||||
}
|
||||
|
||||
# Configure server.
|
||||
--let $rpl_connection_name= server_$_rpl_server
|
||||
|
||||
Reference in New Issue
Block a user