summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-01-30 17:50:54 +0200
committerJan Lindström <jan.lindstrom@mariadb.com>2017-01-31 18:40:46 +0200
commit7586026236639e5fe86b64a04338028fbc9dcf80 (patch)
treee1ab2bf719ca81a837c42a1b5171137b5e20393a
parent6aa551fa54afba96b7bac374a09d1e2c7fa929af (diff)
downloadmariadb-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.cc19
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);