Skip to content

Commit

Permalink
Merge 10.5 into 10.6
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-m committed Feb 28, 2022
2 parents 6daf8f8 + 13076bd commit 5c21cba
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 46 deletions.
18 changes: 0 additions & 18 deletions mysql-test/main/alter_table.result
Original file line number Diff line number Diff line change
Expand Up @@ -3415,23 +3415,5 @@ ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITH
delete from t1 where a = 11;
drop table t1;
#
# MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
# Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
#
SET @max_session_mem_used_save= @@max_session_mem_used;
CREATE TABLE t1 (a INT);
SELECT * FROM t1;
a
ALTER TABLE x MODIFY xx INT;
ERROR 42S02: Table 'test.x' doesn't exist
SET SESSION max_session_mem_used= 8192;
LOCK TABLE t1 WRITE;
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
Warnings:
Note 1054 Unknown column 'b' in 't1'
SET SESSION max_session_mem_used = @max_session_mem_used_save;
UNLOCK TABLES;
DROP TABLE t1;
#
# End of 10.5 tests
#
22 changes: 0 additions & 22 deletions mysql-test/main/alter_table.test
Original file line number Diff line number Diff line change
Expand Up @@ -2661,28 +2661,6 @@ delete from t1 where a = 11;
# cleanup
drop table t1;

--echo #
--echo # MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
--echo # Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
--echo #

SET @max_session_mem_used_save= @@max_session_mem_used;

CREATE TABLE t1 (a INT);
SELECT * FROM t1;

--error ER_NO_SUCH_TABLE
ALTER TABLE x MODIFY xx INT;

SET SESSION max_session_mem_used= 8192;
LOCK TABLE t1 WRITE;

ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;

SET SESSION max_session_mem_used = @max_session_mem_used_save;
UNLOCK TABLES;
DROP TABLE t1;

--echo #
--echo # End of 10.5 tests
--echo #
19 changes: 19 additions & 0 deletions mysql-test/main/alter_table_lock.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#
# MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
# Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
#
SET @max_session_mem_used_save= @@max_session_mem_used;
CREATE TABLE t1 (a INT);
SELECT * FROM t1;
a
ALTER TABLE x MODIFY xx INT;
ERROR 42S02: Table 'test.x' doesn't exist
SET SESSION max_session_mem_used= 8192;
LOCK TABLE t1 WRITE;
ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;
Warnings:
Note 1054 Unknown column 'b' in 't1'
SET SESSION max_session_mem_used = @max_session_mem_used_save;
UNLOCK TABLES;
DROP TABLE t1;
# End of 10.5 tests
25 changes: 25 additions & 0 deletions mysql-test/main/alter_table_lock.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
--source include/not_msan.inc

--echo #
--echo # MDEV-23836: Assertion `! is_set() || m_can_overwrite_status' in
--echo # Diagnostics_area::set_error_status (interrupted ALTER TABLE under LOCK)
--echo #

SET @max_session_mem_used_save= @@max_session_mem_used;

CREATE TABLE t1 (a INT);
SELECT * FROM t1;

--error ER_NO_SUCH_TABLE
ALTER TABLE x MODIFY xx INT;

SET SESSION max_session_mem_used= 8192;
LOCK TABLE t1 WRITE;

ALTER TABLE t1 CHANGE COLUMN IF EXISTS b c INT;

SET SESSION max_session_mem_used = @max_session_mem_used_save;
UNLOCK TABLES;
DROP TABLE t1;

--echo # End of 10.5 tests
3 changes: 3 additions & 0 deletions mysql-test/main/cte_recursive.test
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
--source include/default_optimizer_switch.inc
# This is too slow on MSAN
--source include/not_msan.inc
--source include/not_valgrind.inc

create table t1 (a int, b varchar(32));
insert into t1 values
Expand Down
7 changes: 6 additions & 1 deletion mysql-test/main/partition_debug_sync.result
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
19 changes: 17 additions & 2 deletions mysql-test/main/partition_debug_sync.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions mysql-test/main/query_cache_debug.test
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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 *************************************************************************
Expand Down
1 change: 1 addition & 0 deletions mysql-test/main/ssl-big.test
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
-- source include/have_64bit.inc
# No point in running with valgrind as it takes 1.5 hours
-- source include/not_valgrind.inc
-- source include/not_msan.inc

# Save the initial number of concurrent sessions
--source include/count_sessions.inc
Expand Down
2 changes: 2 additions & 0 deletions mysql-test/suite/innodb/t/redo_log_during_checkpoint.test
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
# We are crashing the server on purpose
--source include/not_valgrind.inc
--source include/not_crashrep.inc
# This often fails under MSAN builder due timing differences
--source include/not_msan.inc

# The test does work with any page size, but we want to reduce the
# test running time by limiting the combinations. The redo log format
Expand Down
6 changes: 6 additions & 0 deletions mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 14 additions & 3 deletions storage/innobase/trx/trx0undo.cc
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -465,6 +465,10 @@ static uint16_t trx_undo_header_create(buf_block_t *undo_page, trx_id_t trx_id,
undo_page->page.frame, free);
mtr->write<8,mtr_t::MAYBE_NOP>(*undo_page, free + TRX_UNDO_TRX_ID +
undo_page->page.frame, trx_id);
if (UNIV_UNLIKELY(mach_read_from_8(free + TRX_UNDO_TRX_NO +
undo_page->page.frame)))
mtr->memset(undo_page, free + TRX_UNDO_TRX_NO, 8, 0);

/* Write TRX_UNDO_NEEDS_PURGE=1 and TRX_UNDO_LOG_START. */
mach_write_to_2(buf, 1);
memcpy_aligned<2>(buf + 2, start, 2);
Expand Down Expand Up @@ -882,12 +886,19 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no,
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);
Expand Down

0 comments on commit 5c21cba

Please sign in to comment.