mirror of
https://github.com/MariaDB/server.git
synced 2025-02-12 00:15:35 +01:00
![Thirunarayanan Balathandayuthapani](/assets/img/avatar_default.png)
Problem: ========= As a part of MDEV-14398 patch, InnoDB added and removed the tablespace from default encrypt list. But InnoDB removes the tablespace from the default encrypt list too early due to i) other encryption thread working on the tablespace ii) When tablespace is being flushed at the end of key rotation InnoDB fails to decrypt/encrypt the tablespace since the tablespace removed too early and it leads to test case failure. Solution: ========= 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 Removed the workaround in encryption.innodb_encryption_filekeys test case.
133 lines
3.6 KiB
Text
133 lines
3.6 KiB
Text
-- source include/have_innodb.inc
|
|
-- source include/have_file_key_management_plugin.inc
|
|
|
|
--disable_query_log
|
|
let $encrypt_tables = `SELECT @@innodb_encrypt_tables`;
|
|
let $threads = `SELECT @@innodb_encryption_threads`;
|
|
let $key_id = `SELECT @@innodb_default_encryption_key_id`;
|
|
--enable_query_log
|
|
|
|
SET GLOBAL innodb_encrypt_tables = OFF;
|
|
SET GLOBAL innodb_encryption_threads = 4;
|
|
|
|
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB;
|
|
SHOW CREATE TABLE t1;
|
|
CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=YES;
|
|
CREATE TABLE t3 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO;
|
|
CREATE TABLE t4 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=YES ENCRYPTION_KEY_ID=4;
|
|
|
|
--disable_warnings
|
|
--disable_query_log
|
|
begin;
|
|
let $i = 10;
|
|
while ($i)
|
|
{
|
|
INSERT INTO t1 values(NULL, substring(MD5(RAND()), -128));
|
|
dec $i;
|
|
}
|
|
|
|
INSERT INTO t2 select * from t1;
|
|
INSERT INTO t3 select * from t1;
|
|
INSERT INTO t4 select * from t1;
|
|
commit;
|
|
--enable_warnings
|
|
--enable_query_log
|
|
|
|
SET GLOBAL innodb_encrypt_tables = on;
|
|
|
|
--echo # Wait max 10 min for key encryption threads to encrypt required all spaces
|
|
let $cnt=600;
|
|
while ($cnt)
|
|
{
|
|
let $success=`SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`;
|
|
if ($success)
|
|
{
|
|
let $cnt=0;
|
|
}
|
|
if (!$success)
|
|
{
|
|
real_sleep 1;
|
|
dec $cnt;
|
|
}
|
|
}
|
|
if (!$success)
|
|
{
|
|
SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION;
|
|
SHOW STATUS LIKE 'innodb_encryption%';
|
|
-- die Timeout waiting for encryption threads
|
|
}
|
|
--echo # Success!
|
|
|
|
SELECT COUNT(1) FROM t1;
|
|
SELECT COUNT(1) FROM t2;
|
|
SELECT COUNT(1) FROM t3;
|
|
SELECT COUNT(1) FROM t4;
|
|
|
|
SET GLOBAL innodb_encrypt_tables = off;
|
|
|
|
--echo # Wait max 10 min for key encryption threads to decrypt all required spaces
|
|
let $cnt=600;
|
|
while ($cnt)
|
|
{
|
|
let $success=`SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0`;
|
|
if ($success)
|
|
{
|
|
let $cnt=0;
|
|
}
|
|
if (!$success)
|
|
{
|
|
real_sleep 1;
|
|
dec $cnt;
|
|
}
|
|
}
|
|
if (!$success)
|
|
{
|
|
SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION;
|
|
SHOW STATUS LIKE 'innodb_encryption%';
|
|
-- die Timeout waiting for encryption threads
|
|
}
|
|
--echo # Success!
|
|
|
|
SET GLOBAL innodb_encrypt_tables = ON;
|
|
set GLOBAL innodb_default_encryption_key_id=4;
|
|
CREATE TABLE t5 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB;
|
|
SHOW CREATE TABLE t5;
|
|
INSERT INTO t5 select * from t1;
|
|
|
|
--echo # Wait max 10 min for key encryption threads to encrypt required all spaces
|
|
let $cnt=600;
|
|
while ($cnt)
|
|
{
|
|
let $success=`SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`;
|
|
if ($success)
|
|
{
|
|
let $cnt=0;
|
|
}
|
|
if (!$success)
|
|
{
|
|
real_sleep 1;
|
|
dec $cnt;
|
|
}
|
|
}
|
|
if (!$success)
|
|
{
|
|
SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION;
|
|
SHOW STATUS LIKE 'innodb_encryption%';
|
|
-- die Timeout waiting for encryption threads
|
|
}
|
|
--echo # Success!
|
|
|
|
SELECT COUNT(1) FROM t1;
|
|
SELECT COUNT(1) FROM t2;
|
|
SELECT COUNT(1) FROM t3;
|
|
SELECT COUNT(1) FROM t4;
|
|
SELECT COUNT(1) FROM t5;
|
|
|
|
drop table t1,t2,t3,t4, t5;
|
|
|
|
# reset system
|
|
--disable_query_log
|
|
EVAL SET GLOBAL innodb_encrypt_tables = $encrypt_tables;
|
|
EVAL SET GLOBAL innodb_encryption_threads = $threads;
|
|
EVAL set GLOBAL innodb_default_encryption_key_id = $key_id;
|
|
--enable_query_log
|