MXS-1506: Test interrupted SELECTs

Expanded the test to cover interrupted SELECT statements.
This commit is contained in:
Markus Mäkelä
2018-04-10 11:49:16 +03:00
parent 15bb90afc4
commit eafdd61888
2 changed files with 54 additions and 31 deletions

View File

@ -6,7 +6,7 @@ log_info=1
type=monitor type=monitor
module=mysqlmon module=mysqlmon
###repl51### ###repl51###
servers=server1,server2,server3,server4 servers=server1,server2
user=maxskysql user=maxskysql
passwd=skysql passwd=skysql
monitor_interval=1000 monitor_interval=1000
@ -16,7 +16,7 @@ backend_connect_timeout=1
[RW Split Router] [RW Split Router]
type=service type=service
router=readwritesplit router=readwritesplit
servers=server1,server2,server3,server4 servers=server1,server2
user=maxskysql user=maxskysql
passwd=skysql passwd=skysql
master_failure_mode=fail_on_write master_failure_mode=fail_on_write
@ -51,15 +51,3 @@ type=server
address=###node_server_IP_2### address=###node_server_IP_2###
port=###node_server_port_2### port=###node_server_port_2###
protocol=MySQLBackend protocol=MySQLBackend
[server3]
type=server
address=###node_server_IP_3###
port=###node_server_port_3###
protocol=MySQLBackend
[server4]
type=server
address=###node_server_IP_4###
port=###node_server_port_4###
protocol=MySQLBackend

View File

@ -30,13 +30,18 @@ int main(int argc, char** argv)
return execute_query_silent(test.maxscales->conn_rwsplit[0], q.c_str()) == 0; return execute_query_silent(test.maxscales->conn_rwsplit[0], q.c_str()) == 0;
}; };
auto check = [&test](string q, string res) auto compare = [&test](string q, string res)
{
auto rc = execute_query_check_one(test.maxscales->conn_rwsplit[0], q.c_str(), res.c_str()) == 0;
test.assert(rc, "Query '%s' did not produce result of '%s'", q.c_str(), res.c_str());
};
auto check = [&test, &compare](string q, string res)
{ {
test.repl->sync_slaves(); test.repl->sync_slaves();
test.maxscales->connect(); test.maxscales->connect();
auto rc = execute_query_check_one(test.maxscales->conn_rwsplit[0], q.c_str(), res.c_str()) == 0; compare(q, res);
test.maxscales->disconnect(); test.maxscales->disconnect();
test.assert(rc, "Query '%s' did not produce result of '%s'", q.c_str(), res.c_str());
}; };
auto ok = [&test, &query](string q, int t = 0) auto ok = [&test, &query](string q, int t = 0)
@ -49,78 +54,108 @@ int main(int argc, char** argv)
test.assert(!query(q, t), "Query should fail: %s", q.c_str()); test.assert(!query(q, t), "Query should fail: %s", q.c_str());
}; };
auto block_master = [&test](int pre = 0) auto block = [&test](int pre = 0, int node = 0)
{ {
sleep(pre); sleep(pre);
test.repl->block_node(0); test.repl->block_node(node);
sleep(10); sleep(10);
test.repl->unblock_node(0); test.repl->unblock_node(node);
}; };
auto noop = [](){};
vector<TestCase> tests( vector<TestCase> tests(
{ {
{ {
"Normal insert", "Normal insert",
bind(ok, "SELECT 1"), noop,
bind(block_master, 0), block,
bind(ok, "INSERT INTO test.t1 VALUES (1)", 5), bind(ok, "INSERT INTO test.t1 VALUES (1)", 5),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 1", "1") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 1", "1")
}, },
{ {
"Insert with user variables", "Insert with user variables",
bind(ok, "SET @a = 2"), bind(ok, "SET @a = 2"),
bind(block_master, 0), block,
bind(ok, "INSERT INTO test.t1 VALUES (@a)", 5), bind(ok, "INSERT INTO test.t1 VALUES (@a)", 5),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 2", "1") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 2", "1")
}, },
{ {
"Normal transaction", "Normal transaction",
bind(ok, "START TRANSACTION"), bind(ok, "START TRANSACTION"),
bind(block_master, 0), block,
bind(err, "INSERT INTO test.t1 VALUES (3)", 5), bind(err, "INSERT INTO test.t1 VALUES (3)", 5),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 3", "0") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 3", "0")
}, },
{ {
"Read-only transaction", "Read-only transaction",
bind(ok, "START TRANSACTION READ ONLY"), bind(ok, "START TRANSACTION READ ONLY"),
bind(block_master, 0), block,
bind(err, "INSERT INTO test.t1 VALUES (4)", 5), bind(err, "INSERT INTO test.t1 VALUES (4)", 5),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 4", "0") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 4", "0")
}, },
{ {
"Insert with autocommit=0", "Insert with autocommit=0",
bind(ok, "SET autocommit=0"), bind(ok, "SET autocommit=0"),
bind(block_master, 0), block,
bind(err, "INSERT INTO test.t1 VALUES (5)", 5), bind(err, "INSERT INTO test.t1 VALUES (5)", 5),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 5", "0") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 5", "0")
}, },
{ {
"Interrupted insert (should cause duplicate statement execution)", "Interrupted insert (should cause duplicate statement execution)",
bind(ok, "SELECT 1"), noop,
bind(block_master, 5), bind(block, 5),
bind(ok, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 6))", 0), bind(ok, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 6))", 0),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 6", "2") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 6", "2")
}, },
{ {
"Interrupted insert with user variable (should cause duplicate statement execution)", "Interrupted insert with user variable (should cause duplicate statement execution)",
bind(ok, "SET @b = 7"), bind(ok, "SET @b = 7"),
bind(block_master, 5), bind(block, 5),
bind(ok, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + @b))", 0), bind(ok, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + @b))", 0),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 7", "2") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 7", "2")
}, },
{ {
"Interrupted insert in transaction", "Interrupted insert in transaction",
bind(ok, "START TRANSACTION"), bind(ok, "START TRANSACTION"),
bind(block_master, 5), bind(block, 5),
bind(err, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 8))", 0), bind(err, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 8))", 0),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 8", "0") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 8", "0")
}, },
{ {
"Interrupted insert in read-only transaction", "Interrupted insert in read-only transaction",
bind(ok, "START TRANSACTION READ ONLY"), bind(ok, "START TRANSACTION READ ONLY"),
bind(block_master, 5), bind(block, 5),
bind(err, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 9))", 0), bind(err, "INSERT INTO test.t1 VALUES ((SELECT SLEEP(10) + 9))", 0),
bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 9", "0") bind(check, "SELECT COUNT(*) FROM test.t1 WHERE id = 9", "0")
},
{
"Interrupted select",
noop,
bind(block, 5, 1),
bind(compare, "SELECT SLEEP(10) + 10", "10"),
noop
},
{
"Interrupted select with user variable",
bind(ok, "SET @c = 11"),
bind(block, 5, 1),
bind(compare, "SELECT SLEEP(10) + @c", "11"),
noop
},
{
"Interrupted select in transaction",
bind(ok, "START TRANSACTION"),
bind(block, 5, 0),
bind(err, "SELECT SLEEP(10)"),
noop
},
{
"Interrupted select in read-only transaction",
bind(ok, "START TRANSACTION READ ONLY"),
bind(block, 5, 1),
bind(err, "SELECT SLEEP(10)"),
noop
} }
}); });