Commit 7da351d8 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.5 into 10.6

parents 2aed566d a9adfc0f
call mtr.add_suppression("(mysqld|mariadbd).*: File .*");
call mtr.add_suppression("mariadbd.*: File .*");
call mtr.add_suppression("Plugin 'file_key_management' .*");
call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available");
call mtr.add_suppression("InnoDB: We do not continue the crash recovery");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\.");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[0-9]+, page number=[0-9]+\\] in file '.*test.t[1-4]\\.ibd' cannot be decrypted\\.");
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
SET GLOBAL innodb_file_per_table = ON;
create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20;
create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed;
create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes;
create table t3(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=20;
create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb;
create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes;
begin;
insert into t2 select * from t1;
insert into t3 select * from t1;
insert into t4 select * from t1;
commit;
CREATE TABLE t5 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
begin;
update t1 set c = repeat('secret3', 20);
......@@ -26,8 +27,13 @@ insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000));
insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000));
insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000));
insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000));
INSERT INTO t5 VALUES ('foo'),('bar');
COMMIT;
# Kill the server
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys-not-found.txt
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
drop table t1, t2,t3,t4;
drop table t1,t2,t3,t4,t5;
--innodb-change-buffering=none
--innodb-encrypt-tables=on
--innodb-default-encryption-key-id=20
......@@ -3,13 +3,13 @@
# embedded does not support restart
-- source include/not_embedded.inc
call mtr.add_suppression("(mysqld|mariadbd).*: File .*");
call mtr.add_suppression("mariadbd.*: File .*");
call mtr.add_suppression("Plugin 'file_key_management' .*");
call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available");
call mtr.add_suppression("InnoDB: We do not continue the crash recovery");
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\.");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
call mtr.add_suppression("InnoDB: The page \\[page id: space=[0-9]+, page number=[0-9]+\\] in file '.*test.t[1-4]\\.ibd' cannot be decrypted\\.");
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/restart_mysqld.inc
......@@ -17,9 +17,9 @@ call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]
SET GLOBAL innodb_file_per_table = ON;
create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20;
create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed;
create table t2(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes;
create table t3(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes encryption_key_id=20;
create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb;
create table t4(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb encrypted=yes;
begin;
--disable_query_log
......@@ -45,6 +45,7 @@ commit;
# happens, InnoDB refuses to start as used
# encryption key is not found.
#
CREATE TABLE t5 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
begin;
update t1 set c = repeat('secret3', 20);
......@@ -55,12 +56,19 @@ insert into t1 (c,b) values (repeat('secret5',20), repeat('secret6',6000));
insert into t2 (c,b) values (repeat('secret7',20), repeat('secret8',6000));
insert into t3 (c,b) values (repeat('secret9',20), repeat('secre10',6000));
insert into t4 (c,b) values (repeat('secre11',20), repeat('secre12',6000));
INSERT INTO t5 VALUES ('foo'),('bar');
COMMIT;
let $cleanup= drop table t1,t2,t3,t4;
let $cleanup= drop table t1,t2,t3,t4,t5;
--let CLEANUP_IF_CHECKPOINT= $cleanup;
--source ../../suite/innodb/include/no_checkpoint_end.inc
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys-not-found.txt
-- source include/start_mysqld.inc
SELECT * FROM INFORMATION_SCHEMA.ENGINES
WHERE engine = 'innodb'
AND support IN ('YES', 'DEFAULT', 'ENABLED');
#
# In above server does start but InnoDB refuses to start
# thus we need to restart server with correct key file
......@@ -68,4 +76,4 @@ let $cleanup= drop table t1,t2,t3,t4;
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/restart_mysqld.inc
drop table t1, t2,t3,t4;
drop table t1,t2,t3,t4,t5;
......@@ -2651,6 +2651,13 @@ fil_ibd_load(
? fil_space_read_crypt_data(fil_space_t::zip_size(flags),
first_page)
: NULL;
if (crypt_data && !crypt_data->is_key_found()) {
crypt_data->~fil_space_crypt_t();
ut_free(crypt_data);
return FIL_LOAD_INVALID;
}
space = fil_space_t::create(
space_id, flags, FIL_TYPE_TABLESPACE, crypt_data);
......
......@@ -779,11 +779,18 @@ static struct
@param flags FSP_SPACE_FLAGS
@param crypt_data encryption metadata
@param size tablespace size in pages
@return tablespace */
@return tablespace
@retval nullptr if crypt_data is invalid */
static fil_space_t *create(const recv_spaces_t::const_iterator &it,
const std::string &name, uint32_t flags,
fil_space_crypt_t *crypt_data, uint32_t size)
{
if (crypt_data && !crypt_data->is_key_found())
{
crypt_data->~fil_space_crypt_t();
ut_free(crypt_data);
return nullptr;
}
fil_space_t *space= fil_space_t::create(it->first, flags,
FIL_TYPE_TABLESPACE, crypt_data);
ut_ad(space);
......@@ -828,6 +835,9 @@ static struct
fil_space_read_crypt_data(fil_space_t::zip_size(flags), page),
size);
if (!space)
goto next_item;
space->free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT);
space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page);
fil_node_t *node= UT_LIST_GET_FIRST(space->chain);
......@@ -838,7 +848,8 @@ static struct
goto next_item;
}
if (os_file_write(IORequestWrite, node->name, node->handle,
page, 0, fil_space_t::physical_size(flags)) != DB_SUCCESS)
page, 0, fil_space_t::physical_size(flags)) !=
DB_SUCCESS)
{
space->release();
goto free_space;
......@@ -898,6 +909,11 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p,
fil_space_read_crypt_data
(fil_space_t::zip_size(flags),
page), size);
if (!space)
{
block->page.lock.x_unlock();
goto fail;
}
space->free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT);
space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page);
block->page.lock.x_unlock();
......@@ -1363,7 +1379,7 @@ inline void recv_sys_t::clear()
mysql_mutex_assert_owner(&mutex);
apply_log_recs= false;
apply_batch_on= false;
ut_ad(!after_apply || !UT_LIST_GET_LAST(blocks));
ut_ad(!after_apply || found_corrupt_fs || !UT_LIST_GET_LAST(blocks));
pages.clear();
for (buf_block_t *block= UT_LIST_GET_LAST(blocks); block; )
......
wait_timeout : MDEV-26045
mdev_27239 : failed with ASAN build
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment