summaryrefslogtreecommitdiffstats
path: root/storage/rocksdb/mysql-test/rocksdb_rpl/t/singledelete_idempotent_recovery.test
blob: 6d953ead4e97f81b6180eeaf92d86652dbc3a2be (plain)
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
--source include/have_binlog_format_row.inc
--source include/have_rocksdb.inc
--source include/master-slave.inc
--source include/have_gtid.inc
--source include/not_valgrind.inc

# This is a test case for issue#655 -- SingleDelete on Primary Key may
# cause extra rows than Secondary Keys

call mtr.add_suppression("Recovery from master pos");

connection master;
--disable_warnings
drop table if exists r1;
--enable_warnings
create table r1 (id1 int, id2 int, primary key (id1, id2), index i (id2)) engine=rocksdb;
insert into r1 values (1, 1000);

sync_slave_with_master;
connection slave;
set global rocksdb_force_flush_memtable_now=1;
--let slave_data_dir= query_get_value(SELECT @@DATADIR, @@DATADIR, 1)
--let slave_binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
--let slave_pid_file= query_get_value(SELECT @@pid_file, @@pid_file, 1)
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect

--write_file $MYSQL_TMP_DIR/truncate_tail_binlog.sh
#!/bin/bash

F=$slave_data_dir/$slave_binlog_file
SIZE=`stat -c %s $F`
NEW_SIZE=`expr $SIZE - 100`
truncate -s $NEW_SIZE $F
rc=$?
if [[ $rc != 0 ]]; then
  exit 1
fi

kill -9 `head -1 $slave_pid_file`

exit 0
EOF
--chmod 0755 $MYSQL_TMP_DIR/truncate_tail_binlog.sh
--exec $MYSQL_TMP_DIR/truncate_tail_binlog.sh

--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect

# Crash recovery (losing some binlogs) with slave_use_idempotent_for_recovery may 
# replay same transactions with slave_exec_mode=idempotent implicitly enabled.
# On slave, the last insert is converted to update with the same key.
# It should be treated as SD and Put (same as singledelete_idempotent_table.test).

--source include/rpl_start_server.inc
--source include/start_slave.inc

# Due to the binlogs being truncated, the slave may still think it's processed up to
# the truncated binlog and select master_pos_wait() can return prematurely. Add
# a new transaction to the master to force master_pos_wait() to wait.
connection master;
insert into r1 values (2,2000);
sync_slave_with_master;

connection slave;
delete r1 from r1 force index (i) where id2=1000;
select id1,id2 from r1 force index (primary) where id1=1 and id2=1000;
select id2 from r1 force index (i) where id1=1 and id2=1000;
set global rocksdb_compact_cf='default';
select id1,id2 from r1 force index (primary) where id1=1 and id2=1000;
select id2 from r1 force index (i) where id1=1 and id2=1000;

connection master;
drop table r1;

--remove_file $MYSQL_TMP_DIR/truncate_tail_binlog.sh
--source include/rpl_end.inc