diff options
author | seppo <seppo.jaakola@iki.fi> | 2020-02-23 10:29:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-23 10:29:42 +0200 |
commit | 4618c974e4b467624d38bb256c2993afb4ac93b1 (patch) | |
tree | 4e6ccc608bb8dcc05f8a9d01d81be1a11bdb5419 /sql/log_event.cc | |
parent | 3ce49a0a5225eb7d185361e1ece65d03813ec550 (diff) | |
download | mariadb-git-4618c974e4b467624d38bb256c2993afb4ac93b1.tar.gz |
MDEV-21723 Async slave thread BF abort and replaying fixes (#1448)
If async replication slave thread conflicts with cluster replication,
then the async slave transaction should be BF aborted, and depending on the
state of async slave transaction execution, potentially also replayed.
There were problems in such BF abort implementation and the replaying was not
started.
This pull request contains fixes which make sure that if async slave thread is
marked to abort and replay, it will complete carry out the rollback and
release all locks and resources before starting the replaying. After replaying,
async slave transactions is treated as successful, so the slave thread will
continue as usual, handling next replication event.
There is also new mtr test: galera.galera_slave_replay, which stresses both a
certification failure for async slave thread and a successful BF abort
followed by replaying.
Diffstat (limited to 'sql/log_event.cc')
-rw-r--r-- | sql/log_event.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sql/log_event.cc b/sql/log_event.cc index d5066fdabdf..29cb4d6d7d7 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -8567,8 +8567,16 @@ int Xid_log_event::do_apply_event(rpl_group_info *rgi) res= trans_commit(thd); /* Automatically rolls back on error. */ thd->mdl_context.release_transactional_locks(); +#ifdef WITH_WSREP + if (WSREP(thd)) mysql_mutex_lock(&thd->LOCK_thd_data); + if ((!res || (WSREP(thd) && thd->wsrep_conflict_state == MUST_REPLAY)) && sub_id) +#else if (!res && sub_id) +#endif /* WITH_WSREP */ rpl_global_gtid_slave_state->update_state_hash(sub_id, >id, rgi); +#ifdef WITH_WSREP + if (WSREP(thd)) mysql_mutex_unlock(&thd->LOCK_thd_data); +#endif /* WITH_WSREP */ /* Increment the global status commit count variable |