Skip to content

Commit 836d4e7

Browse files
committed
Write proper tests for MDEV-12634: Uninitialised ROW_MERGE_RESERVE_SIZE bytes
Introduce innodb_encrypt_log.combinations and prove that the encryption and decryption take place during both online ADD INDEX (WL#5266) and online table-rebuilding ALTER (WL#6625).
1 parent f24d36a commit 836d4e7

15 files changed

+365
-160
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[crypt]
2+
innodb_encrypt_log=ON
3+
innodb_encryption_rotate_key_age=1
4+
plugin_load_add=$DEBUG_KEY_MANAGEMENT_SO
5+
6+
[clear]
7+
skip_innodb_encrypt_log
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# The goal of including this file is to enable innodb_encrypt_log combinations
2+
# (see include/innodb_encrypt_log.combinations)
3+
4+
--source include/have_innodb.inc

mysql-test/suite/encryption/r/innodb-rowlog.result

Lines changed: 0 additions & 30 deletions
This file was deleted.

mysql-test/suite/encryption/t/innodb-rowlog.opt

Lines changed: 0 additions & 7 deletions
This file was deleted.

mysql-test/suite/encryption/t/innodb-rowlog.test

Lines changed: 0 additions & 90 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--- innodb-index-online.result
2+
+++ innodb-index-online,crypt.reject
3+
@@ -260,7 +260,7 @@
4+
@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0,
5+
@rowlog_encrypt_1>@rowlog_encrypt_0;
6+
sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0
7+
-0 0 0 0
8+
+0 1 1 1
9+
SET DEBUG_SYNC = 'now SIGNAL dml2_done';
10+
ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
11+
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
12+
@@ -364,7 +364,7 @@
13+
@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted,
14+
@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted;
15+
sort_encrypted sort_decrypted log_encrypted log_decrypted
16+
-0 0 0 0
17+
+1 1 1 1
18+
SELECT COUNT(c22f) FROM t1;
19+
COUNT(c22f)
20+
320

mysql-test/suite/innodb/r/innodb-index-online.result

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,15 @@ t1 CREATE TABLE `t1` (
180180
PRIMARY KEY (`c1`),
181181
KEY `c2d` (`c2`)
182182
) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=1
183+
SET @merge_encrypt_0=
184+
(SELECT variable_value FROM information_schema.global_status
185+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted');
186+
SET @merge_decrypt_0=
187+
(SELECT variable_value FROM information_schema.global_status
188+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted');
189+
SET @rowlog_encrypt_0=
190+
(SELECT variable_value FROM information_schema.global_status
191+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted');
183192
SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2e_created WAIT_FOR dml2_done';
184193
SET lock_wait_timeout = 10;
185194
ALTER TABLE t1 DROP INDEX c2d, ADD INDEX c2e(c2),
@@ -209,6 +218,22 @@ BEGIN;
209218
UPDATE t1 SET c2 = c2 + 1;
210219
DELETE FROM t1;
211220
ROLLBACK;
221+
BEGIN;
222+
DELETE FROM t1;
223+
ROLLBACK;
224+
UPDATE t1 SET c2 = c2 + 1;
225+
BEGIN;
226+
UPDATE t1 SET c2 = c2 + 1;
227+
DELETE FROM t1;
228+
ROLLBACK;
229+
BEGIN;
230+
DELETE FROM t1;
231+
ROLLBACK;
232+
UPDATE t1 SET c2 = c2 + 1;
233+
BEGIN;
234+
UPDATE t1 SET c2 = c2 + 1;
235+
DELETE FROM t1;
236+
ROLLBACK;
212237
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
213238
name count
214239
ddl_background_drop_indexes 0
@@ -220,6 +245,22 @@ INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_FIELDS sf
220245
ON si.index_id = sf.index_id WHERE si.name = '?c2e';
221246
name pos
222247
c2 0
248+
SET @merge_encrypt_1=
249+
(SELECT variable_value FROM information_schema.global_status
250+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted');
251+
SET @merge_decrypt_1=
252+
(SELECT variable_value FROM information_schema.global_status
253+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted');
254+
SET @rowlog_encrypt_1=
255+
(SELECT variable_value FROM information_schema.global_status
256+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted');
257+
SELECT
258+
(@merge_encrypt_1-@merge_encrypt_0)-
259+
(@merge_decrypt_1-@merge_decrypt_0) as sort_balance,
260+
@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0,
261+
@rowlog_encrypt_1>@rowlog_encrypt_0;
262+
sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0
263+
0 0 0 0
223264
SET DEBUG_SYNC = 'now SIGNAL dml2_done';
224265
ERROR HY000: Creating index 'c2e' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
225266
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
@@ -245,6 +286,18 @@ ddl_background_drop_indexes 0
245286
ddl_background_drop_tables 0
246287
ddl_online_create_index 0
247288
ddl_pending_alter_table 0
289+
SET @merge_encrypt_1=
290+
(SELECT variable_value FROM information_schema.global_status
291+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted');
292+
SET @merge_decrypt_1=
293+
(SELECT variable_value FROM information_schema.global_status
294+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted');
295+
SET @rowlog_encrypt_1=
296+
(SELECT variable_value FROM information_schema.global_status
297+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted');
298+
SET @rowlog_decrypt_1=
299+
(SELECT variable_value FROM information_schema.global_status
300+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted');
248301
SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done';
249302
ALTER TABLE t1 ADD INDEX c2f(c2);
250303
SET DEBUG_SYNC = 'now WAIT_FOR c2f_created';
@@ -262,6 +315,14 @@ BEGIN;
262315
UPDATE t1 SET c2 = c2 + 1;
263316
DELETE FROM t1;
264317
ROLLBACK;
318+
BEGIN;
319+
INSERT INTO t1 SELECT 320 + c1, c2, c3 FROM t1 WHERE c1 > 160;
320+
DELETE FROM t1 WHERE c1 > 320;
321+
ROLLBACK;
322+
BEGIN;
323+
UPDATE t1 SET c2 = c2 + 1;
324+
DELETE FROM t1;
325+
ROLLBACK;
265326
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
266327
name count
267328
ddl_background_drop_indexes 0
@@ -278,6 +339,32 @@ ddl_background_drop_indexes 0
278339
ddl_background_drop_tables 0
279340
ddl_online_create_index 0
280341
ddl_pending_alter_table 0
342+
SET @merge_encrypt_2=
343+
(SELECT variable_value FROM information_schema.global_status
344+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted');
345+
SET @merge_decrypt_2=
346+
(SELECT variable_value FROM information_schema.global_status
347+
WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted');
348+
SET @rowlog_encrypt_2=
349+
(SELECT variable_value FROM information_schema.global_status
350+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted');
351+
SET @rowlog_decrypt_2=
352+
(SELECT variable_value FROM information_schema.global_status
353+
WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted');
354+
SELECT
355+
(@merge_encrypt_2-@merge_encrypt_1)-
356+
(@merge_decrypt_2-@merge_decrypt_1) as sort_balance,
357+
(@rowlog_encrypt_2-@rowlog_encrypt_1)-
358+
(@rowlog_decrypt_2-@rowlog_decrypt_1) as log_balance;
359+
sort_balance log_balance
360+
0 0
361+
SELECT
362+
@merge_encrypt_2-@merge_encrypt_1>0 as sort_encrypted,
363+
@merge_decrypt_2-@merge_decrypt_1>0 as sort_decrypted,
364+
@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted,
365+
@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted;
366+
sort_encrypted sort_decrypted log_encrypted log_decrypted
367+
0 0 0 0
281368
SELECT COUNT(c22f) FROM t1;
282369
COUNT(c22f)
283370
320
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--- innodb-table-online.result
2+
+++ innodb-table-online,crypt.reject
3+
@@ -254,7 +254,7 @@
4+
@merge_encrypt_1>@merge_encrypt_0, @merge_decrypt_1>@merge_decrypt_0,
5+
@rowlog_encrypt_1>@rowlog_encrypt_0;
6+
sort_balance @merge_encrypt_1>@merge_encrypt_0 @merge_decrypt_1>@merge_decrypt_0 @rowlog_encrypt_1>@rowlog_encrypt_0
7+
-0 0 0 0
8+
+0 1 1 1
9+
SET DEBUG_SYNC = 'now SIGNAL dml2_done';
10+
# session con1
11+
ERROR HY000: Creating index 'PRIMARY' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
12+
@@ -345,7 +345,7 @@
13+
@rowlog_encrypt_2-@rowlog_encrypt_1>0 as log_encrypted,
14+
@rowlog_decrypt_2-@rowlog_decrypt_1>0 as log_decrypted;
15+
sort_encrypted sort_decrypted log_encrypted log_decrypted
16+
-0 0 0 0
17+
+1 1 1 1
18+
ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY c3p5(c3(5));
19+
ERROR 23000: Duplicate entry '' for key 'PRIMARY'
20+
UPDATE t1 SET c3 = NULL WHERE c3 = '';

0 commit comments

Comments
 (0)