Commit 863d67e3 authored by Luis Soares's avatar Luis Soares

BUG#17460821: ASSERTION ERROR WHEN STOPPING SLAVE AFTER SEMI-SYNC ON MASTER IS DISABLED

The assertion happens when: (i) the master and slave are configured to
use the semisync plugin; (ii) the DBA disables semisync on the master;
(iii) and he also unsets the option to wait for slaves ACK even if the
semisync slave count reaches 0 during the waiting period. This
combination of factors makes the server run into an assertion as soon
as the last semisync slave disconnects and its dump thread exits.
  
The root of the problem is the fact that when the dump thread
disconnects and calls the observer hook transmit_stop, which ends up
calling ReplSemiSyncMaster::remove_slave, there is no check whether
the master has already disabled semisync or not. If it has, the then a
second call to the switch_off member function must be avoided.
  
The quick fix is to avoid calling switch_off if the DBA has disabled
the semisync plugin interactively on the master. Also, the switch_off
member function should only be called if the plugin has not been
switched off already. This is basically the pattern throughout the
rest of the semisync plugin and no other calls seem vulnerable to
similar crashes/assertions.

(This a backport of the patch to 5.5, which is also vulnerable.)
parent 54a36531
...@@ -482,13 +482,17 @@ void ReplSemiSyncMaster::remove_slave() ...@@ -482,13 +482,17 @@ void ReplSemiSyncMaster::remove_slave()
lock(); lock();
rpl_semi_sync_master_clients--; rpl_semi_sync_master_clients--;
/* If user has chosen not to wait if no semi-sync slave available /* Only switch off if semi-sync is enabled and is on */
and the last semi-sync slave exits, turn off semi-sync on master if (getMasterEnabled() && is_on())
immediately. {
*/ /* If user has chosen not to wait if no semi-sync slave available
if (!rpl_semi_sync_master_wait_no_slave && and the last semi-sync slave exits, turn off semi-sync on master
rpl_semi_sync_master_clients == 0) immediately.
switch_off(); */
if (!rpl_semi_sync_master_wait_no_slave &&
rpl_semi_sync_master_clients == 0)
switch_off();
}
unlock(); unlock();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment