diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2017-01-30 17:50:54 +0200 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2017-01-31 18:40:46 +0200 |
commit | 7586026236639e5fe86b64a04338028fbc9dcf80 (patch) | |
tree | e1ab2bf719ca81a837c42a1b5171137b5e20393a | |
parent | 6aa551fa54afba96b7bac374a09d1e2c7fa929af (diff) | |
download | mariadb-git-bb-10.2-MDEV-11035.tar.gz |
srv_get_active_thread_type(): Remove a potential race condition.bb-10.2-MDEV-11035
Call trx_purge_state() only once, to avoid a race condition if the
value changes while the conditions are being evaluated.
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index b3d40dd5abf..c5a8265d803 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -2011,13 +2011,18 @@ srv_get_active_thread_type(void) srv_sys_mutex_exit(); - /* Check only on shutdown. */ - if (ret == SRV_NONE - && srv_shutdown_state != SRV_SHUTDOWN_NONE - && trx_purge_state() != PURGE_STATE_DISABLED - && trx_purge_state() != PURGE_STATE_EXIT) { - - ret = SRV_PURGE; + if (ret == SRV_NONE && srv_shutdown_state != SRV_SHUTDOWN_NONE) { + /* Check only on shutdown. */ + switch (trx_purge_state()) { + case PURGE_STATE_INIT: + case PURGE_STATE_RUN: + case PURGE_STATE_STOP: + ret = SRV_PURGE; + break; + case PURGE_STATE_DISABLED: + case PURGE_STATE_EXIT: + break; + } } return(ret); |