diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-02-28 12:58:58 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-02-28 12:58:58 +0200 |
commit | 3c58cdd91d86aa03d3a5204dbfea5948810e8bc9 (patch) | |
tree | 84ff52a463fcdfe47bf424e6721175e2c8b4fa29 | |
parent | f5ff7d09c73b5527cb6e0540cd470db9d8a82108 (diff) | |
parent | 0635088deb7a8440d918d5f988c7042f9deb59e3 (diff) | |
download | mariadb-git-3c58cdd91d86aa03d3a5204dbfea5948810e8bc9.tar.gz |
Merge 10.3 into 10.4
-rw-r--r-- | mysql-test/main/partition_debug_sync.result | 7 | ||||
-rw-r--r-- | mysql-test/main/partition_debug_sync.test | 19 | ||||
-rw-r--r-- | mysql-test/main/query_cache_debug.test | 11 | ||||
-rw-r--r-- | mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test | 6 | ||||
-rw-r--r-- | storage/innobase/trx/trx0undo.cc | 14 |
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); |