File: undo_encrypt_crash.inc

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (97 lines) | stat: -rw-r--r-- 5,170 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
--echo #
--echo # bug#30209760 : ASSERTION FAILURE: SRV0START.CC:969:SUCCESS THREAD
--echo #

--echo #########
--echo # SETUP #
--echo #########
let $MYSQLD_BASEDIR= `select @@basedir`;
let $START_PAGE_SIZE= `select @@innodb_page_size`;
let $LOG_SIZE= `select @@innodb_redo_log_capacity`;

--echo # Create path for ibdata* & undo* files
--mkdir $MYSQL_TMP_DIR/innodb_undo_data_dir
--mkdir $MYSQL_TMP_DIR/innodb_data_home_dir
--mkdir $MYSQL_TMP_DIR/datadir

# Set path for --datadir
let $MYSQLD_DATADIR = $MYSQL_TMP_DIR/datadir/data;

# Set path for undo* files.
let $MYSQLD_UNDO_DATADIR = $MYSQL_TMP_DIR/innodb_undo_data_dir;

# Set path for ibdata* files.
let $MYSQLD_HOME_DATA_DIR = $MYSQL_TMP_DIR/innodb_data_home_dir;

--echo # create bootstrap file
let $BOOTSTRAP_SQL=$MYSQL_TMP_DIR/boot.sql;
write_file $BOOTSTRAP_SQL;
CREATE DATABASE test;
EOF

--echo # Stop the MTR default DB server
--source include/shutdown_mysqld.inc

--echo #########################################################################
--echo # INITIALIZE NEW SERVER
--echo #########################################################################
--source include/keyring_tests/helper/binary_backup_manifest.inc
let NEW_CMD = $MYSQLD --no-defaults $PLUGIN_DIR_OPT --innodb_dedicated_server=OFF --initialize-insecure --innodb_redo_log_capacity=$LOG_SIZE --innodb_page_size=$START_PAGE_SIZE --innodb_data_home_dir=$MYSQLD_HOME_DATA_DIR --innodb_undo_directory=$MYSQLD_UNDO_DATADIR --basedir=$MYSQLD_BASEDIR --datadir=$MYSQLD_DATADIR --init-file=$BOOTSTRAP_SQL --secure-file-priv="" $PLUGIN_DIR_OPT;

--echo # Server should be initialized successfully.
--exec $NEW_CMD

--echo #########################################################################
--echo # RESTART 2 : WITH KEYRING.
--echo               innodb_undo_log_encrypt=ON.
--echo               Crash server before purge thread could start.
--echo #########################################################################
# Restart the server with undo_log_encrypt=ON and make sure it asserts before
# Purge thread is started (i.e. before master thread could have started to
# rotate default master key. At this time,
# - UNDO tablespace would have been encrypted with default master key
# - Header page for UNDO tablespace wouldn't have been flushed
# - So encryption information is still in REDO Log.
--source include/keyring_tests/helper/binary_restore_manifest.inc
let $NEW_CMD = $MYSQLD --no-defaults $PLUGIN_DIR_OPT --innodb_dedicated_server=OFF --innodb_redo_log_capacity=$LOG_SIZE --innodb_page_size=$START_PAGE_SIZE --innodb_data_home_dir=$MYSQLD_HOME_DATA_DIR --innodb_undo_directory=$MYSQLD_UNDO_DATADIR --basedir=$MYSQLD_BASEDIR --datadir=$MYSQLD_DATADIR --innodb_undo_log_encrypt=ON --debug=d,crash_before_purge_thread $PLUGIN_DIR_OPT;
--error 1,2,42,137
--exec $NEW_CMD

--echo #########################################################################
--echo # RESTART 3 : WITH KEYRING.
--echo               innodb_undo_log_encrypt=ON.
--echo               Skip rotating default master key in master thread
--echo #########################################################################
# Here server would start and UNDO encryption key would be loaded in-mem
# successfully after reading them from REDO Log during scan.
# NOTE: without the fix
# - the encryption information wouldn't be applied on page 0.
# - And as we don't allow master thread to rotate default master key, UNDO
#   tablespace encryption information will be lost at next restart.
let $restart_parameters = restart: $PLUGIN_DIR_OPT --innodb_dedicated_server=OFF --innodb_redo_log_capacity=$LOG_SIZE --innodb_page_size=$START_PAGE_SIZE --innodb_data_home_dir=$MYSQLD_HOME_DATA_DIR --innodb_undo_directory=$MYSQLD_UNDO_DATADIR --basedir=$MYSQLD_BASEDIR --datadir=$MYSQLD_DATADIR --innodb_undo_log_encrypt=ON --debug=d,skip_rotating_default_master_key;
--source include/start_mysqld_no_echo.inc

--echo #########################################################################
--echo # RESTART 4 : WITH KEYRING.
--echo               innodb_undo_log_encrypt=OFF.
--echo #########################################################################
# During this restart, without the fix:
# - Encryption information will be looked for on page 0. But as it wasn't
#   applied in previous start, it wouldn't be found thus ASSERT will be hit.
let $restart_parameters = restart: $PLUGIN_DIR_OPT --innodb_dedicated_server=OFF --innodb_redo_log_capacity=$LOG_SIZE --innodb_page_size=$START_PAGE_SIZE --innodb_data_home_dir=$MYSQLD_HOME_DATA_DIR --innodb_undo_directory=$MYSQLD_UNDO_DATADIR --basedir=$MYSQLD_BASEDIR --datadir=$MYSQLD_DATADIR --innodb_undo_log_encrypt=OFF;
--source include/restart_mysqld_no_echo.inc

--echo ###########
--echo # CLEANUP #
--echo ###########
# Reset to initial state
--source include/shutdown_mysqld.inc
--source include/wait_until_disconnected.inc
--let $restart_parameters="restart: $PLUGIN_DIR_OPT"
--source include/start_mysqld_no_echo.inc

# Remove residue files
--remove_file $BOOTSTRAP_SQL
--force-rmdir $MYSQL_TMP_DIR/datadir
--force-rmdir $MYSQL_TMP_DIR/innodb_data_home_dir
--force-rmdir $MYSQL_TMP_DIR/innodb_undo_data_dir