diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2021-07-09 21:20:29 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2021-07-09 21:22:40 +0530 |
commit | 79016c9e2db6036b1f94b31cb9bb4a713aef39c6 (patch) | |
tree | e4e144f0cfe9ae22380058d743f4567dc139df16 | |
parent | a8410693dccf206ca58089c72449cc78d03dd612 (diff) | |
download | mariadb-git-bb-10.6-MDEV-25998.tar.gz |
MDEV-25998 InnoDB removes the tablespace from default encrypt list earlybb-10.6-MDEV-25998
Avoid the removal of tablespace from default_encrypt_list
only when
1) Another active encryption thread working on tablespace
2) Eligible for tablespace key rotation
3) Tablespace is in flushing phase
-rw-r--r-- | storage/innobase/fil/fil0crypt.cc | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index a0b4b45287f..d02646396d2 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1146,6 +1146,49 @@ struct rotate_thread_t { } }; +/** Avoid the removal of the tablespace from +default_encrypt_list only when +1) Another active encryption thread working on tablespace +2) Eligible for tablespace key rotation +3) Tablespace is in flushing phase +@return true if tablespace should be removed from +default encrypt */ +static bool fil_crypt_space_remove_list(const fil_space_t *space) +{ + ut_ad(space->purpose == FIL_TYPE_TABLESPACE); + + fil_space_crypt_t *crypt_data = space->crypt_data; + + if (crypt_data == NULL) { return srv_encrypt_tables == false;} + + if (!crypt_data->is_key_found()) { return true; } + + mysql_mutex_lock(&crypt_data->mutex); + + if (space->is_stopping() || crypt_data->not_encrypted()) + { +func_exit: + mysql_mutex_unlock(&crypt_data->mutex); + return true; + } + + if (crypt_data->rotate_state.flushing) + goto non_remove; + + if ((crypt_data->min_key_version && !srv_encrypt_tables) + || (crypt_data->min_key_version == 0 && srv_encrypt_tables)) + goto non_remove; + + if (crypt_data->rotate_state.active_threads > 0) + { +non_remove: + mysql_mutex_unlock(&crypt_data->mutex); + return false; + } + + goto func_exit; +} + /*********************************************************************** Check if space needs rotation given a key_state @param[in,out] state Key rotation state @@ -1446,8 +1489,7 @@ inline fil_space_t *fil_system_t::default_encrypt_next(fil_space_t *space, If there is a change in innodb_encrypt_tables variables value then don't remove the last processed tablespace from the default encrypt list. */ - if (released && (!recheck || space->crypt_data) && - !encrypt == !srv_encrypt_tables) + if (released && !recheck && fil_crypt_space_remove_list(space)) { ut_a(!default_encrypt_tables.empty()); default_encrypt_tables.remove(*space); |