1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00
- Eliminates code duplication in query cache patch
- Reduces the number of iterations in mysql-wsrep#201.test
  to shorten the execution time
- Adds a new test case that exercises more scenarios
This commit is contained in:
Daniele Sciascia
2015-10-22 17:30:20 +02:00
committed by Nirbhay Choubey
parent 17ac959716
commit 235bebe02e
5 changed files with 148 additions and 12 deletions

View File

@ -0,0 +1,45 @@
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S";
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
SET SESSION wsrep_sync_wait = 7;
SELECT MAX(id) FROM t1;
MAX(id)
1
INSERT INTO t1 VALUES (2);
SELECT MAX(id) FROM t1;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
FLUSH QUERY CACHE;
SET SESSION wsrep_sync_wait = 7;
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
INSERT INTO t1 VALUES (3);
SELECT MAX(id) FROM t1;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
INSERT INTO t1 VALUES (4);
SET SESSION wsrep_sync_wait = 7;
SELECT MAX(id) FROM t1;
MAX(id)
4
SET SESSION wsrep_sync_wait = 7;
FLUSH STATUS;
SELECT MAX(id) FROM t1;
MAX(id)
4
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits';
VARIABLE_VALUE = 1
1
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
INSERT INTO t1 VALUES (5);
SET SESSION wsrep_sync_wait = 7;
SELECT MAX(id) FROM t1 ;
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
MAX(id)
5
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits';
VARIABLE_VALUE = 1
1

View File

@ -0,0 +1 @@
--query_cache_type=1

View File

@ -0,0 +1,90 @@
--source include/galera_cluster.inc
--source include/have_innodb.inc
--source include/have_debug_sync.inc
--source include/have_query_cache.inc
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
--connection node_2
--let $wsrep_provider_options_orig = `SELECT @@wsrep_provider_options`
SET GLOBAL wsrep_provider_options = "repl.causal_read_timeout=PT1S";
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
SET SESSION wsrep_sync_wait = 7;
SELECT MAX(id) FROM t1; # first lookup miss
#
# Query cache hit, wait timeout
#
--connection node_1
INSERT INTO t1 VALUES (2);
--connection node_2
--error ER_LOCK_WAIT_TIMEOUT
SELECT MAX(id) FROM t1;
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
FLUSH QUERY CACHE;
SET SESSION wsrep_sync_wait = 7;
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
#
# Query cache miss, wait timeout
#
--connection node_1
INSERT INTO t1 VALUES (3);
--connection node_2
--error ER_LOCK_WAIT_TIMEOUT
SELECT MAX(id) FROM t1;
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
#
# Query cache miss
#
--connection node_1
INSERT INTO t1 VALUES (4);
--connection node_2
SET SESSION wsrep_sync_wait = 7;
SELECT MAX(id) FROM t1;
SET SESSION wsrep_sync_wait = 7;
#
# Query cache hit
#
FLUSH STATUS;
SELECT MAX(id) FROM t1;
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits';
SET GLOBAL DEBUG = "d,sync.wsrep_apply_cb";
#
# Query cache invalidated
#
--connection node_1
INSERT INTO t1 VALUES (5);
--connection node_2
SET SESSION wsrep_sync_wait = 7;
--send SELECT MAX(id) FROM t1
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connection node_2a
SET GLOBAL DEBUG = "";
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
--connection node_2
--reap
SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'Qcache_hits';
--disable_query_log
--eval SET GLOBAL wsrep_provider_options = "$wsrep_provider_options_orig"
DROP TABLE t1;

View File

@ -12,7 +12,7 @@ SET SESSION wsrep_sync_wait = 7;
--disable_query_log --disable_query_log
--let $count = 10000 --let $count = 500
while ($count) while ($count)
{ {
--connection node_1 --connection node_1

View File

@ -1846,7 +1846,6 @@ Query_cache::send_result_to_client(THD *thd, char *org_sql, uint query_length)
goto err; goto err;
} }
} }
/* /*
Try to obtain an exclusive lock on the query cache. If the cache is Try to obtain an exclusive lock on the query cache. If the cache is
disabled or if a full cache flush is in progress, the attempt to disabled or if a full cache flush is in progress, the attempt to
@ -1946,6 +1945,13 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
(int)flags.autocommit)); (int)flags.autocommit));
memcpy((uchar *)(sql + (tot_length - QUERY_CACHE_FLAGS_SIZE)), memcpy((uchar *)(sql + (tot_length - QUERY_CACHE_FLAGS_SIZE)),
(uchar*) &flags, QUERY_CACHE_FLAGS_SIZE); (uchar*) &flags, QUERY_CACHE_FLAGS_SIZE);
#ifdef WITH_WSREP
bool once_more;
once_more= true;
lookup:
#endif /* WITH_WSREP */
query_block = (Query_cache_block *) my_hash_search(&queries, (uchar*) sql, query_block = (Query_cache_block *) my_hash_search(&queries, (uchar*) sql,
tot_length); tot_length);
/* Quick abort on unlocked data */ /* Quick abort on unlocked data */
@ -1959,21 +1965,15 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
DBUG_PRINT("qcache", ("Query in query hash 0x%lx", (ulong)query_block)); DBUG_PRINT("qcache", ("Query in query hash 0x%lx", (ulong)query_block));
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (WSREP_CLIENT(thd) && wsrep_must_sync_wait(thd)) { if (once_more && WSREP_CLIENT(thd) && wsrep_must_sync_wait(thd))
{
unlock(); unlock();
if (wsrep_sync_wait(thd)) if (wsrep_sync_wait(thd))
goto err; goto err;
if (try_lock(thd, Query_cache::TIMEOUT)) if (try_lock(thd, Query_cache::TIMEOUT))
goto err; goto err;
query_block = (Query_cache_block *) my_hash_search(&queries, once_more= false;
(uchar*) sql, goto lookup;
tot_length);
if (query_block == 0 ||
query_block->query()->result() == 0 ||
query_block->query()->result()->type != Query_cache_block::RESULT)
{
goto err_unlock;
}
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */