diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2019-05-17 20:32:51 +0530 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-05-28 15:55:33 +0300 |
commit | 88157247fc5920ef77cfa96aebd33460d86b3905 (patch) | |
tree | a726bc196f9e9f1d82064e1747854d2b21156026 /storage/innobase/fil/fil0fil.cc | |
parent | 79b46ab2a6eae493b89ab0fcfc03fcf6b585244c (diff) | |
download | mariadb-git-88157247fc5920ef77cfa96aebd33460d86b3905.tar.gz |
MDEV-19509 InnoDB skips the tablespace in rotation list
- If one of the encryption threads already started the initialization
of the tablespace then don't remove the other uninitialized tablespace
from the rotation list.
- If there is a change in innodb_encrypt_tables then
don't remove the processed tablespace from rotation list.
Diffstat (limited to 'storage/innobase/fil/fil0fil.cc')
-rw-r--r-- | storage/innobase/fil/fil0fil.cc | 58 |
1 files changed, 28 insertions, 30 deletions
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 595f9c3e729..08c3a699a04 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -5983,28 +5983,32 @@ fil_space_remove_from_keyrotation(fil_space_t* space) Once started, the caller must keep calling this until it returns NULL. fil_space_acquire() and fil_space_release() are invoked here which blocks a concurrent operation from dropping the tablespace. -@param[in] prev_space Pointer to the previous fil_space_t. +@param[in] prev_space Previous tablespace or NULL to start + from beginning of fil_system->rotation list +@param[in] recheck recheck of the tablespace is needed or + still encryption thread does write page0 for it +@param[in] key_version key version of the key state thread If NULL, use the first fil_space_t on fil_system->space_list. @return pointer to the next fil_space_t. -@retval NULL if this was the last*/ +@retval NULL if this was the last */ fil_space_t* -fil_space_keyrotate_next( - fil_space_t* prev_space) +fil_system_t::keyrotate_next( + fil_space_t* prev_space, + bool recheck, + uint key_version) { - fil_space_t* space = prev_space; - fil_space_t* old = NULL; - mutex_enter(&fil_system->mutex); - if (UT_LIST_GET_LEN(fil_system->rotation_list) == 0) { - if (space) { - ut_ad(space->n_pending_ops > 0); - space->n_pending_ops--; - fil_space_remove_from_keyrotation(space); - } - mutex_exit(&fil_system->mutex); - return(NULL); - } + /* If one of the encryption threads already started the encryption + of the table then don't remove the unencrypted spaces from + rotation list + + If there is a change in innodb_encrypt_tables variables value then + don't remove the last processed tablespace from the rotation list. */ + const bool remove = ((!recheck || prev_space->crypt_data) + && (!key_version == !srv_encrypt_tables)); + + fil_space_t* space = prev_space; if (prev_space == NULL) { space = UT_LIST_GET_FIRST(fil_system->rotation_list); @@ -6017,22 +6021,17 @@ fil_space_keyrotate_next( /* Move on to the next fil_space_t */ space->n_pending_ops--; - old = space; space = UT_LIST_GET_NEXT(rotation_list, space); - fil_space_remove_from_keyrotation(old); - } - - /* Skip spaces that are being created by fil_ibd_create(), - or dropped. Note that rotation_list contains only - space->purpose == FIL_TYPE_TABLESPACE. */ - while (space != NULL - && (UT_LIST_GET_LEN(space->chain) == 0 - || space->is_stopping())) { + while (space != NULL + && (UT_LIST_GET_LEN(space->chain) == 0 + || space->is_stopping())) { + space = UT_LIST_GET_NEXT(rotation_list, space); + } - old = space; - space = UT_LIST_GET_NEXT(rotation_list, space); - fil_space_remove_from_keyrotation(old); + if (remove) { + fil_space_remove_from_keyrotation(prev_space); + } } if (space != NULL) { @@ -6040,7 +6039,6 @@ fil_space_keyrotate_next( } mutex_exit(&fil_system->mutex); - return(space); } |