summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-11-16 13:58:22 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-11-16 13:58:22 +0200
commit0269d491eaf02556817654e6365ebf50eb4616fc (patch)
treea1fd8a60456a50a2b3c716a5e3a999f87bd2b088
parent079516f00efc526682aca727ac918ebf2322a16d (diff)
downloadmariadb-git-0269d491eaf02556817654e6365ebf50eb4616fc.tar.gz
MDEV-27047: Replication fails to remove affected queries from query cache
Rows_log_event::do_apply_event(): Correct the mistake that was made in the merge 5f8561a6bcdb66e05ca539365cce33a9fc1817a2. In Galera, the query cache will be invalidated near the end of the function.
-rw-r--r--mysql-test/suite/rpl/r/rpl_query_cache.result29
-rw-r--r--mysql-test/suite/rpl/t/rpl_query_cache.test27
-rw-r--r--sql/log_event_server.cc8
3 files changed, 61 insertions, 3 deletions
diff --git a/mysql-test/suite/rpl/r/rpl_query_cache.result b/mysql-test/suite/rpl/r/rpl_query_cache.result
new file mode 100644
index 00000000000..6256ddb37f4
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_query_cache.result
@@ -0,0 +1,29 @@
+include/master-slave.inc
+[connection master]
+connection slave;
+SET @qtype= @@global.query_cache_type;
+SET GLOBAL query_cache_type= ON;
+SET query_cache_type= ON;
+connection master;
+create table t1 (i int) engine=innodb;
+insert into t1 set i=1;
+connection slave;
+select * from t1;
+i
+1
+connection master;
+insert into t1 set i=2;
+connection slave;
+select * from t1;
+i
+1
+2
+select sql_no_cache * from t1;
+i
+1
+2
+connection master;
+DROP TABLE t1;
+connection slave;
+SET GLOBAL query_cache_type= @qtype;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_query_cache.test b/mysql-test/suite/rpl/t/rpl_query_cache.test
new file mode 100644
index 00000000000..b23f2b20b47
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_query_cache.test
@@ -0,0 +1,27 @@
+-- source include/have_binlog_format_row.inc
+-- source include/have_innodb.inc
+-- source include/master-slave.inc
+
+--connection slave
+SET @qtype= @@global.query_cache_type;
+SET GLOBAL query_cache_type= ON;
+SET query_cache_type= ON;
+
+--connection master
+create table t1 (i int) engine=innodb;
+insert into t1 set i=1;
+
+--sync_slave_with_master
+select * from t1;
+--connection master
+insert into t1 set i=2;
+
+--sync_slave_with_master
+select * from t1;
+select sql_no_cache * from t1;
+
+--connection master
+DROP TABLE t1;
+--sync_slave_with_master
+SET GLOBAL query_cache_type= @qtype;
+--source include/rpl_end.inc
diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc
index 79f197d4ec3..093adebf536 100644
--- a/sql/log_event_server.cc
+++ b/sql/log_event_server.cc
@@ -5573,14 +5573,16 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi)
}
}
-#if defined(WITH_WSREP) && defined(HAVE_QUERY_CACHE)
+#ifdef HAVE_QUERY_CACHE
/*
Moved invalidation right before the call to rows_event_stmt_cleanup(),
to avoid query cache being polluted with stale entries,
*/
- if (WSREP(thd) && wsrep_thd_is_applying(thd))
+# ifdef WITH_WSREP
+ if (!WSREP(thd) && !wsrep_thd_is_applying(thd))
+# endif /* WITH_WSREP */
query_cache.invalidate_locked_for_write(thd, rgi->tables_to_lock);
-#endif /* WITH_WSREP && HAVE_QUERY_CACHE */
+#endif /* HAVE_QUERY_CACHE */
}
table= m_table= rgi->m_table_map.get_table(m_table_id);