diff --git a/mysql-test/suite/innodb/r/recovery_shutdown_debug.result b/mysql-test/suite/innodb/r/recovery_shutdown_debug.result
new file mode 100644
index 0000000..697a899
--- /dev/null
+++ b/mysql-test/suite/innodb/r/recovery_shutdown_debug.result
@@ -0,0 +1,10 @@
+#
+# MDEV-16125 Shutdown crash when innodb_force_recovery > 2
+#
+CREATE TABLE t2(f1 INT NOT NULL)ENGINE=InnoDB;
+SHOW CREATE TABLE t2;
+Table	Create Table
+t2	CREATE TABLE `t2` (
+  `f1` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1
+SET global debug_dbug='+d,delay_master_thread';
diff --git a/mysql-test/suite/innodb/t/recovery_shutdown_debug.test b/mysql-test/suite/innodb/t/recovery_shutdown_debug.test
new file mode 100644
index 0000000..8a22c4a
--- /dev/null
+++ b/mysql-test/suite/innodb/t/recovery_shutdown_debug.test
@@ -0,0 +1,14 @@
+--source include/have_innodb.inc
+--source include/have_debug.inc
+
+--echo #
+--echo # MDEV-16125 Shutdown crash when innodb_force_recovery > 2
+--echo #
+
+--let $restart_parameters= --innodb-force-recovery=3
+--source include/restart_mysqld.inc
+CREATE TABLE t2(f1 INT NOT NULL)ENGINE=InnoDB;
+SHOW CREATE TABLE t2;
+
+SET global debug_dbug='+d,delay_master_thread';
+--source include/restart_mysqld.inc
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 47c4f25..604d0b1 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -2011,6 +2011,8 @@ logs_empty_and_mark_files_at_shutdown(void)
 	here to let it complete the flushing of the buffer pools
 	before proceeding further. */
 
+	DBUG_EXECUTE_IF("delay_master_thread",
+			os_thread_sleep(1000000););
 	count = 0;
 	service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2,
 		"Waiting for page cleaner");
diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc
index 2ad5064..4dad0d6 100644
--- a/storage/innobase/srv/srv0srv.cc
+++ b/storage/innobase/srv/srv0srv.cc
@@ -930,6 +930,9 @@ srv_resume_thread(srv_slot_t* slot, int64_t sig_count = 0, bool wait = true,
 		os_event_wait_low(slot->event, sig_count);
 	}
 
+	DBUG_EXECUTE_IF("delay_master_thread",
+			os_thread_sleep(1000000););
+
 	srv_sys_mutex_enter();
 	ut_ad(slot->in_use);
 	ut_ad(slot->suspended);
@@ -2468,11 +2471,11 @@ DECLARE_THREAD(srv_master_thread)(
 suspend_thread:
 	switch (srv_shutdown_state) {
 	case SRV_SHUTDOWN_NONE:
-		break;
 	case SRV_SHUTDOWN_FLUSH_PHASE:
 	case SRV_SHUTDOWN_LAST_PHASE:
-		ut_ad(0);
-		/* fall through */
+		/* Suspend the master thread till shutdown state set to
+		SRV_SHUTDOWN_EXIT_THREADS or SRV_SHUTDOWN_CLEANUP. */
+		break;
 	case SRV_SHUTDOWN_EXIT_THREADS:
 		/* srv_init_abort() must have been invoked */
 	case SRV_SHUTDOWN_CLEANUP:
