Skip to content
This repository was archived by the owner on Jun 12, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
CREATE TABLE test.t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT) ENGINE=TOKUDB;
INSERT INTO test.t1 VALUES(1111,1111,11111);
SET GLOBAL tokudb_checkpoint_on_flush_logs=ON;
FLUSH LOGS;
SET GLOBAL tokudb_checkpoint_on_flush_logs=OFF;
INSERT INTO test.t1 VALUES(1,1,1);
SET GLOBAL TOKUDB_CHECKPOINT_LOCK=ON;
INSERT INTO test.t1 VALUES(2,2,2);
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
INSERT INTO test.t1 VALUES(22,22,22);
FLUSH TABLES;
SET GLOBAL TOKUDB_CHECKPOINT_LOCK=OFF;
shutdown server
OPTIMIZE TABLE test.t1;
Table Op Msg_type Msg_text
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
test.t1 optimize status OK
SELECT * FROM test.t1;
c1 c2 c3
1 1 1
2 2 2
1111 1111 11111
CREATE TABLE test.t2 (c1 INT, c2 INT, PRIMARY KEY(c1), CLUSTERING KEY(c2)) ENGINE=TOKUDB;
1
SELECT COUNT(*) FROM test.t2;
COUNT(*)
1000
DROP TABLE test.t1;
DROP TABLE test.t2;
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# conn1 mocks hot backup
# conn2 mocks writing during TokuDB data file copying
--source include/linux.inc
--source include/have_tokudb.inc

# mkdir the tmp backup dir
--mkdir $MYSQL_TMP_DIR/backupdir
let $MYSQLD_DATADIR= `select @@datadir`;
CREATE TABLE test.t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT) ENGINE=TOKUDB;
INSERT INTO test.t1 VALUES(1111,1111,11111);

# do checkpoint
SET GLOBAL tokudb_checkpoint_on_flush_logs=ON;
FLUSH LOGS;
SET GLOBAL tokudb_checkpoint_on_flush_logs=OFF;

connect (conn1, localhost, root,,);
connection conn1;

#conn1 write(1,1,1)
INSERT INTO test.t1 VALUES(1,1,1);
# fake hot backup 1) tokudb checkpoint lock
SET GLOBAL TOKUDB_CHECKPOINT_LOCK=ON;

connect (conn2, localhost, root,,);
connection conn2;
# conn2 write(2,2,2)
INSERT INTO test.t1 VALUES(2,2,2);

connection conn1;
# fake hot backup 2) FLUSH TABLES WITH READ LOCK
FLUSH TABLES WITH READ LOCK;

# fake hot backup 3) copy tokudb.* and redo-log to backup dir
--exec cp -rf $MYSQLD_DATADIR/tokudb.* $MYSQL_TMP_DIR/backupdir/
--exec cp -rf $MYSQLD_DATADIR/log000* $MYSQL_TMP_DIR/backupdir/

# fake hot backup 4) unlock tables
UNLOCK TABLES;

connection conn2;
# conn2 write(22,22,22), this row can't be visible in new backup instance
INSERT INTO test.t1 VALUES(22,22,22);
FLUSH TABLES;

connection conn1;
# fake hot backup 5) copy tokudb datas file to backup dir
--exec cp -rf $MYSQLD_DATADIR/_test_t1* $MYSQL_TMP_DIR/backupdir/

# fake hot backup 6) release tokudb checkpoint lock
SET GLOBAL TOKUDB_CHECKPOINT_LOCK=OFF;

--echo shutdown server
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--shutdown_server 10
--source include/wait_until_disconnected.inc

# cleanup tokudb files
--exec rm -rf $MYSQLD_DATADIR/tokudb.*
--exec rm -rf $MYSQLD_DATADIR/log000*
--exec rm -rf $MYSQLD_DATADIR/_test_t1*

# fake backup recovery: copy tokudb.* and redo-log, data files from backup dir
--exec cp -rf $MYSQL_TMP_DIR/backupdir/* $MYSQLD_DATADIR/

--enable_reconnect
--exec echo "restart: --innodb_buffer_pool_size=100M --tokudb_cache_size=100M" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/wait_until_connected_again.inc

OPTIMIZE TABLE test.t1;
SELECT * FROM test.t1;

# crash and recover test
CREATE TABLE test.t2 (c1 INT, c2 INT, PRIMARY KEY(c1), CLUSTERING KEY(c2)) ENGINE=TOKUDB;

--disable_query_log
--let $i=1000
while ($i)
{
--eval INSERT INTO test.t2 VALUES($i, $i)
--dec $i
}
--enable_query_log

--disable_query_log
call mtr.add_suppression("Attempting backtrace");
--enable_query_log

# make mtr expect the "crash"
--let $_server_id= `SELECT @@server_id`
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect
--exec echo "wait" > $_expect_file_name
--let $_mysqld_datadir= `SELECT @@datadir`

# crashed, sending SIGSEGV
--let $pid_file_name = `select @@pid_file`
--exec kill -9 `cat $pid_file_name`;
--echo 1
--source include/wait_until_disconnected.inc

--enable_reconnect
# start mysqld
--exec echo "restart" > $_expect_file_name
--source include/wait_until_connected_again.inc
SELECT COUNT(*) FROM test.t2;

--exec rm -rf $MYSQL_TMP_DIR/backupdir/
DROP TABLE test.t1;
DROP TABLE test.t2;