summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/flush-innodb.result5
-rw-r--r--mysql-test/t/flush-innodb.test9
-rw-r--r--sql/lock.cc9
3 files changed, 23 insertions, 0 deletions
diff --git a/mysql-test/r/flush-innodb.result b/mysql-test/r/flush-innodb.result
new file mode 100644
index 00000000000..cea4f81e2a2
--- /dev/null
+++ b/mysql-test/r/flush-innodb.result
@@ -0,0 +1,5 @@
+FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT;
+UNLOCK TABLES;
+CREATE TABLE t1 ( m MEDIUMTEXT ) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ( REPEAT('i',1048576) );
+DROP TABLE t1;
diff --git a/mysql-test/t/flush-innodb.test b/mysql-test/t/flush-innodb.test
new file mode 100644
index 00000000000..207032b1acb
--- /dev/null
+++ b/mysql-test/t/flush-innodb.test
@@ -0,0 +1,9 @@
+--source include/have_innodb.inc
+
+# MDEV-254: Server hang with FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT
+FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT;
+UNLOCK TABLES;
+CREATE TABLE t1 ( m MEDIUMTEXT ) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ( REPEAT('i',1048576) );
+
+DROP TABLE t1;
diff --git a/sql/lock.cc b/sql/lock.cc
index c5a4674bfb0..3a1a6d41ce3 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -1041,6 +1041,15 @@ void Global_read_lock::unlock_global_read_lock(THD *thd)
DBUG_ASSERT(m_mdl_global_shared_lock && m_state);
+ if (thd->global_disable_checkpoint)
+ {
+ thd->global_disable_checkpoint= 0;
+ if (!--global_disable_checkpoint)
+ {
+ ha_checkpoint_state(0); // Enable checkpoints
+ }
+ }
+
if (m_mdl_blocks_commits_lock)
{
thd->mdl_context.release_lock(m_mdl_blocks_commits_lock);