From 47f8a18fec604983e47fdf7c822d94b26d85cade Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Wed, 7 Aug 2019 12:35:04 +0530 Subject: [PATCH] MDEV-20247 Replication hangs with "preparing" and never starts - The commit ab6dd774082c57f48d998e03655c06b672799b2d wrongly sets the condition inside innobase_srv_conc_enter_innodb(). Problem is that InnoDB makes the thread to sleep indefinitely if it is a replication slave thread. Thanks to Sujatha Sivakumar for contributing the replication test case. --- .../r/rpl_sync_with_innodb_thd_conc.result | 13 ++++++ .../rpl/t/rpl_sync_with_innodb_thd_conc.test | 41 +++++++++++++++++++ storage/innobase/handler/ha_innodb.cc | 6 +-- storage/xtradb/handler/ha_innodb.cc | 6 +-- 4 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result create mode 100644 mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test diff --git a/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result b/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result new file mode 100644 index 000000000000..0ed894336a1c --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result @@ -0,0 +1,13 @@ +include/master-slave.inc +[connection master] +SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency; +SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay; +SET GLOBAL innodb_thread_concurrency = 100; +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); +include/diff_tables.inc [master:t, slave:t] +"===== Clean up=======" +DROP TABLE t; +SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; +SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test b/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test new file mode 100644 index 000000000000..b4c2971d2fbc --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test @@ -0,0 +1,41 @@ +# ==== Purpose ==== +# +# Test verifies that replication shouldn't hang when number of active threads +# on the slave server are less than the allowed innodb_thread_concurrency value. +# +# ==== Implementation ==== +# +# Steps: +# 0 - Have master slave replication setup with engine being Innodb. +# 1 - Configure innodb_thread_concurrency = 100. +# 2 - Do some DML on master and sync the slave with master. +# 3 - Ensure replication doesn't hang. +# +# ==== References ==== +# +# MDEV-20247: Replication hangs with "preparing" and never starts +# + +--source include/master-slave.inc +--source include/have_innodb.inc + +--connection slave +SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency; +SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay; +SET GLOBAL innodb_thread_concurrency = 100; + +--connection master +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); +--sync_slave_with_master + +--let $diff_tables=master:t, slave:t +--source include/diff_tables.inc + +--echo "===== Clean up=======" +--connection master +DROP TABLE t; +--sync_slave_with_master +SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; +SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay; +--source include/rpl_end.inc diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 081fcbd9c51e..5dfe240631b8 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1686,9 +1686,9 @@ innobase_srv_conc_enter_innodb( && thd_is_replication_slave_thread(trx->mysql_thd)) { const ulonglong end = my_interval_timer() + ulonglong(srv_replication_delay) * 1000000; - while (srv_conc_get_active_threads() - >= srv_thread_concurrency - || my_interval_timer() >= end) { + while ((srv_conc_get_active_threads() + >= srv_thread_concurrency) + && my_interval_timer() < end) { os_thread_sleep(2000 /* 2 ms */); } } else { diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 5e7482ff6bfa..b5002187e3b2 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -1949,9 +1949,9 @@ innobase_srv_conc_enter_innodb( && thd_is_replication_slave_thread(trx->mysql_thd)) { const ulonglong end = my_interval_timer() + ulonglong(srv_replication_delay) * 1000000; - while (srv_conc_get_active_threads() - >= srv_thread_concurrency - || my_interval_timer() >= end) { + while ((srv_conc_get_active_threads() + >= srv_thread_concurrency) + && my_interval_timer() < end) { os_thread_sleep(2000 /* 2 ms */); } } else {