1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

Fix for galera_3nodes.galera_var_dirty_reads2

Call desync_and_pause() and resync_and_resume() only if state is s_synced.
This commit is contained in:
mkaruza
2019-02-25 17:08:02 +01:00
committed by Jan Lindström
parent 7b9981fbdf
commit 32badae31f

View File

@@ -1101,13 +1101,14 @@ void Global_read_lock::unlock_global_read_lock(THD *thd)
if (m_state == GRL_ACQUIRED_AND_BLOCKS_COMMIT)
{
Wsrep_server_state& server_state= Wsrep_server_state::instance();
if (server_state.state() == Wsrep_server_state::s_donor)
if (server_state.state() == Wsrep_server_state::s_donor ||
(wsrep_on(thd) && server_state.state() != Wsrep_server_state::s_synced))
{
/* TODO: maybe redundant here?: */
wsrep_locked_seqno= WSREP_SEQNO_UNDEFINED;
server_state.resume();
}
else if (WSREP(thd))
else if (wsrep_on(thd) && server_state.state() == Wsrep_server_state::s_synced)
{
server_state.resume_and_resync();
}
@@ -1155,26 +1156,26 @@ bool Global_read_lock::make_global_read_lock_block_commit(THD *thd)
m_state= GRL_ACQUIRED_AND_BLOCKS_COMMIT;
#ifdef WITH_WSREP
/* Native threads should bail out before wsrep oprations to follow.
/* Native threads should bail out before wsrep operations to follow.
Donor servicing thread is an exception, it should pause provider
but not desync, as it is already desynced in donor state
but not desync, as it is already desynced in donor state.
Desync should be called only when we are in synced state.
*/
Wsrep_server_state& server_state= Wsrep_server_state::instance();
if (!WSREP(thd) && server_state.state() != Wsrep_server_state::s_donor)
{
DBUG_RETURN(FALSE);
}
wsrep::seqno paused_seqno;
if (server_state.state() == Wsrep_server_state::s_donor)
if (server_state.state() == Wsrep_server_state::s_donor ||
(wsrep_on(thd) && server_state.state() != Wsrep_server_state::s_synced))
{
paused_seqno= server_state.pause();
}
else
else if (wsrep_on(thd) && server_state.state() == Wsrep_server_state::s_synced)
{
paused_seqno= server_state.desync_and_pause();
}
else
{
DBUG_RETURN(FALSE);
}
WSREP_INFO("Server paused at: %lld", paused_seqno.get());
if (paused_seqno.get() >= 0)
{