summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-02-28 12:58:58 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2022-02-28 12:58:58 +0200
commit3c58cdd91d86aa03d3a5204dbfea5948810e8bc9 (patch)
tree84ff52a463fcdfe47bf424e6721175e2c8b4fa29
parentf5ff7d09c73b5527cb6e0540cd470db9d8a82108 (diff)
parent0635088deb7a8440d918d5f988c7042f9deb59e3 (diff)
downloadmariadb-git-3c58cdd91d86aa03d3a5204dbfea5948810e8bc9.tar.gz
Merge 10.3 into 10.4
-rw-r--r--mysql-test/main/partition_debug_sync.result7
-rw-r--r--mysql-test/main/partition_debug_sync.test19
-rw-r--r--mysql-test/main/query_cache_debug.test11
-rw-r--r--mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test6
-rw-r--r--storage/innobase/trx/trx0undo.cc14
5 files changed, 51 insertions, 6 deletions
diff --git a/mysql-test/main/partition_debug_sync.result b/mysql-test/main/partition_debug_sync.result
index 7006491fcaa..635f7735e6c 100644
--- a/mysql-test/main/partition_debug_sync.result
+++ b/mysql-test/main/partition_debug_sync.result
@@ -53,9 +53,14 @@ SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
ALTER TABLE t2 REMOVE PARTITIONING;
connection default;
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
-SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter';
+SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter WAIT_FOR mtr_continue';
SET DEBUG_SYNC= 'rm_table_no_locks_before_binlog SIGNAL delete_done';
DROP TABLE IF EXISTS t2;
+# Create a new connection thread to orchestrate the ALTER and DROP
+# threads' DEBUG_SYNC points to avoid lost signals
+connect con2,localhost,root,,;
+SET DEBUG_SYNC= 'now SIGNAL mtr_continue';
+connection default;
connection con1;
ERROR 42S02: Table 'test.t2' doesn't exist
SET DEBUG_SYNC= 'RESET';
diff --git a/mysql-test/main/partition_debug_sync.test b/mysql-test/main/partition_debug_sync.test
index 09ebba0b0e2..bc49153f803 100644
--- a/mysql-test/main/partition_debug_sync.test
+++ b/mysql-test/main/partition_debug_sync.test
@@ -66,12 +66,27 @@ SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
--send ALTER TABLE t2 REMOVE PARTITIONING
connection default;
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
-SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter';
+
+SET DEBUG_SYNC= 'rm_table_no_locks_before_delete_table SIGNAL waiting_for_alter WAIT_FOR mtr_continue';
SET DEBUG_SYNC= 'rm_table_no_locks_before_binlog SIGNAL delete_done';
-DROP TABLE IF EXISTS t2;
+--send DROP TABLE IF EXISTS t2
+
+--echo # Create a new connection thread to orchestrate the ALTER and DROP
+--echo # threads' DEBUG_SYNC points to avoid lost signals
+connect(con2,localhost,root,,);
+let $wait_condition= select count(*)=0 from information_schema.processlist where state like "debug sync point: alter_table_before_open_tables";
+source include/wait_condition.inc;
+SET DEBUG_SYNC= 'now SIGNAL mtr_continue';
+
+# Return execution for DROP TABLE
+connection default;
+--reap
+
+# Return execution for ALTER TABLE
connection con1;
--error ER_NO_SUCH_TABLE
--reap
+
SET DEBUG_SYNC= 'RESET';
disconnect con1;
--source include/wait_until_disconnected.inc
diff --git a/mysql-test/main/query_cache_debug.test b/mysql-test/main/query_cache_debug.test
index 90b76077cac..af82927245b 100644
--- a/mysql-test/main/query_cache_debug.test
+++ b/mysql-test/main/query_cache_debug.test
@@ -197,8 +197,17 @@ SET DEBUG_SYNC="now WAIT_FOR parked1_2";
--echo ** and finally release the mutex. The threads will continue to wait
--echo ** until a broadcast signal reaches them causing both threads to
--echo ** come alive and check the condition.
+
+# Before sending signals back-to-back, we have to ensure the previous signal
+# was received
+let $wait_condition= select count(*)=3 from information_schema.processlist where state like "%debug%";
+source include/wait_condition.inc;
SET DEBUG_SYNC="now SIGNAL go2";
+let $wait_condition= select count(*)=2 from information_schema.processlist where state like "%debug%";
+source include/wait_condition.inc;
SET DEBUG_SYNC="now SIGNAL go3";
+let $wait_condition= select count(*)=1 from information_schema.processlist where state like "%debug%";
+source include/wait_condition.inc;
--echo **
--echo ** Finally signal the DELETE statement on THD1 one last time.
@@ -208,6 +217,8 @@ SET DEBUG_SYNC="now SIGNAL go3";
--echo ** invalidations and a broadcast signal will be sent to the thread
--echo ** group holding result set writers.
SET DEBUG_SYNC="now SIGNAL go1_2";
+let $wait_condition= select count(*)=0 from information_schema.processlist where state like "%debug%";
+source include/wait_condition.inc;
--echo **
--echo *************************************************************************
diff --git a/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test b/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test
index d750d44ae71..1ee043623ae 100644
--- a/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test
+++ b/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test
@@ -43,6 +43,12 @@ START SLAVE;
SET DEBUG_SYNC= 'now WAIT_FOR parked';
SET @@GLOBAL.debug_dbug = @saved_dbug;
SET DEBUG_SYNC= 'now SIGNAL continue';
+
+# Ensure the last DEBUG_SYNC signal was received by the target thread before
+# reset; otherwise, the reset can drop the last signal before it gets
+# acknowledged
+let $wait_condition= select count(*)=0 from information_schema.processlist where state like "%debug%";
+source include/wait_condition.inc;
SET DEBUG_SYNC= 'RESET';
--source include/wait_for_slave_io_to_start.inc
diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc
index 7860a6010bf..8768b934dba 100644
--- a/storage/innobase/trx/trx0undo.cc
+++ b/storage/innobase/trx/trx0undo.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2014, 2021, MariaDB Corporation.
+Copyright (c) 2014, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -638,6 +638,7 @@ trx_undo_header_create(
mach_write_to_2(log_hdr + TRX_UNDO_NEEDS_PURGE, 1);
mach_write_to_8(log_hdr + TRX_UNDO_TRX_ID, trx_id);
+ memset(log_hdr + TRX_UNDO_TRX_NO, 0, 8);
mach_write_to_2(log_hdr + TRX_UNDO_LOG_START, new_free);
mach_write_to_1(log_hdr + TRX_UNDO_XID_EXISTS, FALSE);
@@ -1121,12 +1122,19 @@ corrupted:
sql_print_error("InnoDB: unsupported undo header state %u",
state);
goto corrupted;
+ case TRX_UNDO_CACHED:
+ if (UNIV_UNLIKELY(type != 0)) {
+ /* This undo page was not updated by MariaDB
+ 10.3 or later. The TRX_UNDO_TRX_NO field may
+ contain garbage. */
+ break;
+ }
+ goto read_trx_no;
case TRX_UNDO_TO_PURGE:
if (UNIV_UNLIKELY(type == 1)) {
goto corrupted_type;
}
- /* fall through */
- case TRX_UNDO_CACHED:
+ read_trx_no:
trx_id_t id = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header);
if (id >> 48) {
sql_print_error("InnoDB: corrupted TRX_NO %llx", id);