diff options
author | seppo <seppo.jaakola@iki.fi> | 2020-03-24 11:01:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-24 11:01:42 +0200 |
commit | 5918b17004674f425f2cd1d4f0bac29b3bcecb35 (patch) | |
tree | fd5be51c5b8d516aaa51c9fa1be1bab1e6b2ab1a /sql/wsrep_hton.cc | |
parent | a7cbce06d432cbcb88e071731089aacfd41750fd (diff) | |
download | mariadb-git-5918b17004674f425f2cd1d4f0bac29b3bcecb35.tar.gz |
MDEV-21473 conflicts with async slave BF aborting (#1475)
If async slave thread (slave SQL handler), becomes a BF victim, it may occasionally happen that rollbacker thread is used to carry out the rollback instead of the async slave thread.
This can happen, if async slave thread has flagged "idle" state when BF thread tries to figure out how to kill the victim.
The issue was possible to test by using a galera cluster as slave for external master, and issuing high load of conflicting writes through async replication and directly against galera cluster nodes.
However, a deterministic mtr test for the "conflict window" has not yet been worked on.
The fix, in this patch makes sure that async slave thread state is never set to IDLE. This prevents the rollbacker thread to intervene.
The wsrep_query_state change was refactored to happen by dedicated function to make controlling the idle state change in one place.
Diffstat (limited to 'sql/wsrep_hton.cc')
-rw-r--r-- | sql/wsrep_hton.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 6cf29c43447..7c154d6ce6f 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -439,7 +439,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) DBUG_RETURN(WSREP_TRX_CERT_FAIL); } - thd->wsrep_query_state = QUERY_COMMITTING; + wsrep_thd_set_query_state(thd, QUERY_COMMITTING); mysql_mutex_unlock(&thd->LOCK_thd_data); cache = get_trans_log(thd); @@ -473,7 +473,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) { WSREP_DEBUG("empty rbr buffer, query: %s", thd->query()); } - thd->wsrep_query_state= QUERY_EXEC; + wsrep_thd_set_query_state(thd, QUERY_EXEC); DBUG_RETURN(WSREP_TRX_OK); } @@ -581,7 +581,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) WSREP_DEBUG("commit failed for reason: %d", rcode); DBUG_PRINT("wsrep", ("replicating commit fail")); - thd->wsrep_query_state= QUERY_EXEC; + wsrep_thd_set_query_state(thd, QUERY_EXEC); if (thd->wsrep_conflict_state == MUST_ABORT) { thd->wsrep_conflict_state= ABORTED; @@ -613,7 +613,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) DBUG_RETURN(WSREP_TRX_ERROR); } - thd->wsrep_query_state= QUERY_EXEC; + wsrep_thd_set_query_state(thd, QUERY_EXEC); mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_OK); |