Commit 0f9acce3 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.5 into 10.6

parents cce76df5 7de0c7b5
...@@ -45,7 +45,7 @@ extern "C" { ...@@ -45,7 +45,7 @@ extern "C" {
/* The max key length of all supported algorithms */ /* The max key length of all supported algorithms */
#define MY_AES_MAX_KEY_LENGTH 32 #define MY_AES_MAX_KEY_LENGTH 32
#define MY_AES_CTX_SIZE 1024 #define MY_AES_CTX_SIZE 1040
enum my_aes_mode { enum my_aes_mode {
MY_AES_ECB, MY_AES_CBC MY_AES_ECB, MY_AES_CBC
......
...@@ -27,7 +27,6 @@ SET SESSION wsrep_sync_wait = 0; ...@@ -27,7 +27,6 @@ SET SESSION wsrep_sync_wait = 0;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
--connection node_2 --connection node_2
--sleep 1
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc --source include/wait_condition.inc
...@@ -47,7 +46,6 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5); ...@@ -47,7 +46,6 @@ INSERT INTO t1 VALUES (1),(2),(3),(4),(5);
--connection node_2 --connection node_2
--sleep 5 --sleep 5
--let $value = query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1) --let $value = query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1)
--connection node_1 --connection node_1
--disable_query_log --disable_query_log
......
...@@ -2,14 +2,14 @@ include/master-slave.inc ...@@ -2,14 +2,14 @@ include/master-slave.inc
[connection master] [connection master]
connection slave; connection slave;
include/stop_slave.inc include/stop_slave.inc
set @save_par_thds= @@global.slave_parallel_threads;
set @save_strict_mode= @@global.gtid_strict_mode;
set @save_innodb_lock_wait_timeout= @@global.innodb_lock_wait_timeout;
change master to master_use_gtid=slave_pos; change master to master_use_gtid=slave_pos;
set @@global.slave_parallel_threads= 4; set @@global.slave_parallel_threads= 4;
set @@global.slave_parallel_mode= optimistic; set @@global.slave_parallel_mode= optimistic;
set @@global.gtid_strict_mode=ON; set @@global.gtid_strict_mode=ON;
set sql_log_bin= 0; set statement sql_log_bin=0 for alter table mysql.gtid_slave_pos engine=innodb;
alter table mysql.gtid_slave_pos engine=innodb;
call mtr.add_suppression("Deadlock found.*");
set sql_log_bin= 1;
include/start_slave.inc include/start_slave.inc
connection master; connection master;
create table t1 (a int primary key, b int) engine=innodb; create table t1 (a int primary key, b int) engine=innodb;
...@@ -27,25 +27,25 @@ xa end '1'; ...@@ -27,25 +27,25 @@ xa end '1';
xa prepare '1'; xa prepare '1';
xa commit '1'; xa commit '1';
include/save_master_gtid.inc include/save_master_gtid.inc
connection slave;
connection slave1; connection slave1;
BEGIN; BEGIN;
SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=100 FOR UPDATE; SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=100 FOR UPDATE;
domain_id sub_id server_id seq_no domain_id sub_id server_id seq_no
connection slave; connection slave;
include/start_slave.inc include/start_slave.inc
include/wait_for_slave_sql_error.inc [errno=1942,1213] include/wait_for_slave_sql_error.inc [errno=1942]
include/stop_slave_io.inc
connection slave1; connection slave1;
ROLLBACK; ROLLBACK;
# Cleanup # Cleanup
connection master; connection master;
drop table t1; drop table t1;
connection slave; connection slave;
include/stop_slave.inc # TODO: Remove after fixing MDEV-21777
set @@global.gtid_slave_pos= "0-1-100"; set @@global.gtid_slave_pos= "0-1-100";
set @@global.slave_parallel_threads= 0; set @@global.slave_parallel_threads= @save_par_thds;
set @@global.gtid_strict_mode= 0; set @@global.gtid_strict_mode= @save_strict_mode;
set @@global.innodb_lock_wait_timeout= 50; set @@global.innodb_lock_wait_timeout= @save_innodb_lock_wait_timeout;
include/start_slave.inc include/start_slave.inc
include/rpl_end.inc include/rpl_end.inc
# End of rpl_xa_prepare_gtid_fail.test # End of rpl_xa_prepare_gtid_fail.test
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
# GTID slave state, then the slave should immediately quit in error, without # GTID slave state, then the slave should immediately quit in error, without
# retry. # retry.
# #
# This tests validates the above behavior by simulating a deadlock on the # This tests validates the above behavior by forcing a lock-wait timeout on
# GTID slave state table during the second part of XA PREPARE's commit, to # the GTID slave state table during the second part of XA PREPARE's commit, to
# ensure that the appropriate error is reported and the transaction was never # ensure that the appropriate error is reported and the transaction was never
# retried. # retried.
# #
...@@ -23,23 +23,19 @@ source include/have_innodb.inc; ...@@ -23,23 +23,19 @@ source include/have_innodb.inc;
--connection slave --connection slave
--source include/stop_slave.inc --source include/stop_slave.inc
--let $save_par_thds= `SELECT @@global.slave_parallel_threads` set @save_par_thds= @@global.slave_parallel_threads;
--let $save_strict_mode= `SELECT @@global.gtid_strict_mode` set @save_strict_mode= @@global.gtid_strict_mode;
--let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` set @save_innodb_lock_wait_timeout= @@global.innodb_lock_wait_timeout;
change master to master_use_gtid=slave_pos; change master to master_use_gtid=slave_pos;
set @@global.slave_parallel_threads= 4; set @@global.slave_parallel_threads= 4;
set @@global.slave_parallel_mode= optimistic; set @@global.slave_parallel_mode= optimistic;
set @@global.gtid_strict_mode=ON; set @@global.gtid_strict_mode=ON;
set sql_log_bin= 0; set statement sql_log_bin=0 for alter table mysql.gtid_slave_pos engine=innodb;
alter table mysql.gtid_slave_pos engine=innodb;
call mtr.add_suppression("Deadlock found.*");
set sql_log_bin= 1;
--source include/start_slave.inc --source include/start_slave.inc
--connection master --connection master
let $datadir= `select @@datadir`;
create table t1 (a int primary key, b int) engine=innodb; create table t1 (a int primary key, b int) engine=innodb;
insert t1 values (1,1); insert t1 values (1,1);
--source include/save_master_gtid.inc --source include/save_master_gtid.inc
...@@ -64,11 +60,6 @@ xa prepare '1'; ...@@ -64,11 +60,6 @@ xa prepare '1';
xa commit '1'; xa commit '1';
--source include/save_master_gtid.inc --source include/save_master_gtid.inc
--connection slave
#--eval set statement sql_log_bin=0 for insert into mysql.gtid_slave_pos values ($gtid_domain_id, 5, $gtid_server_id, $xap_seq_no)
--connection slave1 --connection slave1
BEGIN; BEGIN;
--eval SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=$xap_seq_no FOR UPDATE --eval SELECT * FROM mysql.gtid_slave_pos WHERE seq_no=$xap_seq_no FOR UPDATE
...@@ -76,9 +67,14 @@ BEGIN; ...@@ -76,9 +67,14 @@ BEGIN;
--connection slave --connection slave
--source include/start_slave.inc --source include/start_slave.inc
--let $slave_sql_errno= 1942,1213 --let $slave_sql_errno= 1942
--source include/wait_for_slave_sql_error.inc --source include/wait_for_slave_sql_error.inc
# TODO: Remove after fixing MDEV-21777
# Stop the IO thread too, so the existing relay logs are force purged on slave
# restart, as to not re-execute the already-prepared transaction
--source include/stop_slave_io.inc
--let $retried_tx_test= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) --let $retried_tx_test= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1)
if ($retried_tx_initial != $retried_tx_test) if ($retried_tx_initial != $retried_tx_test)
{ {
...@@ -95,11 +91,11 @@ ROLLBACK; ...@@ -95,11 +91,11 @@ ROLLBACK;
drop table t1; drop table t1;
--connection slave --connection slave
--source include/stop_slave.inc --echo # TODO: Remove after fixing MDEV-21777
--eval set @@global.gtid_slave_pos= "$new_gtid" --eval set @@global.gtid_slave_pos= "$new_gtid"
--eval set @@global.slave_parallel_threads= $save_par_thds set @@global.slave_parallel_threads= @save_par_thds;
--eval set @@global.gtid_strict_mode= $save_strict_mode set @@global.gtid_strict_mode= @save_strict_mode;
--eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout set @@global.innodb_lock_wait_timeout= @save_innodb_lock_wait_timeout;
--source include/start_slave.inc --source include/start_slave.inc
--source include/rpl_end.inc --source include/rpl_end.inc
......
...@@ -5778,7 +5778,8 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) ...@@ -5778,7 +5778,8 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi)
ignored_error_code(actual_error) : 0); ignored_error_code(actual_error) : 0);
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (WSREP(thd) && wsrep_ignored_error_code(this, actual_error)) if (WSREP(thd) && thd->wsrep_applier &&
wsrep_ignored_error_code(this, actual_error))
{ {
idempotent_error= true; idempotent_error= true;
thd->wsrep_has_ignored_error= true; thd->wsrep_has_ignored_error= true;
......
...@@ -820,6 +820,10 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt, ...@@ -820,6 +820,10 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt,
event_count= 0; event_count= 0;
err= 0; err= 0;
errmsg= NULL; errmsg= NULL;
#ifdef WITH_WSREP
thd->wsrep_cs().reset_error();
WSREP_DEBUG("retrying async replication event");
#endif /* WITH_WSREP */
/* /*
If we already started committing before getting the deadlock (or other If we already started committing before getting the deadlock (or other
...@@ -920,6 +924,7 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt, ...@@ -920,6 +924,7 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt,
err= rgi->worker_error= 1; err= rgi->worker_error= 1;
my_error(ER_PRIOR_COMMIT_FAILED, MYF(0)); my_error(ER_PRIOR_COMMIT_FAILED, MYF(0));
mysql_mutex_unlock(&entry->LOCK_parallel_entry); mysql_mutex_unlock(&entry->LOCK_parallel_entry);
goto err; goto err;
} }
mysql_mutex_unlock(&entry->LOCK_parallel_entry); mysql_mutex_unlock(&entry->LOCK_parallel_entry);
...@@ -961,7 +966,17 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt, ...@@ -961,7 +966,17 @@ retry_event_group(rpl_group_info *rgi, rpl_parallel_thread *rpt,
possibility of an old deadlock kill lingering on beyond this point. possibility of an old deadlock kill lingering on beyond this point.
*/ */
thd->reset_killed(); thd->reset_killed();
#ifdef WITH_WSREP
if (wsrep_before_command(thd))
{
WSREP_WARN("Parallel slave worker failed at wsrep_before_command() hook");
err= 1;
goto err;
}
wsrep_start_trx_if_not_started(thd);
WSREP_DEBUG("parallel slave retry, after trx start");
#endif /* WITH_WSREP */
strmake_buf(log_name, ir->name); strmake_buf(log_name, ir->name);
if ((fd= open_binlog(&rlog, log_name, &errmsg)) <0) if ((fd= open_binlog(&rlog, log_name, &errmsg)) <0)
{ {
......
...@@ -3908,9 +3908,19 @@ apply_event_and_update_pos_apply(Log_event* ev, THD* thd, rpl_group_info *rgi, ...@@ -3908,9 +3908,19 @@ apply_event_and_update_pos_apply(Log_event* ev, THD* thd, rpl_group_info *rgi,
default: default:
WSREP_DEBUG("SQL apply failed, res %d conflict state: %s", WSREP_DEBUG("SQL apply failed, res %d conflict state: %s",
exec_res, wsrep_thd_transaction_state_str(thd)); exec_res, wsrep_thd_transaction_state_str(thd));
rli->abort_slave= 1; /*
rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(), async replication thread should be stopped, if failure was
"Node has dropped from cluster"); not due to optimistic parallel applying or if node
has dropped from cluster
*/
if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL &&
((rli->mi->using_parallel() &&
rli->mi->parallel_mode <= SLAVE_PARALLEL_CONSERVATIVE) ||
wsrep_ready == 0)) {
rli->abort_slave= 1;
rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(),
"Node has dropped from cluster");
}
break; break;
} }
mysql_mutex_unlock(&thd->LOCK_thd_data); mysql_mutex_unlock(&thd->LOCK_thd_data);
......
...@@ -318,7 +318,8 @@ buf_read_page_low( ...@@ -318,7 +318,8 @@ buf_read_page_low(
auto fio = space->io(IORequest(sync auto fio = space->io(IORequest(sync
? IORequest::READ_SYNC ? IORequest::READ_SYNC
: IORequest::READ_ASYNC), : IORequest::READ_ASYNC),
page_id.page_no() * len, len, dst, bpage); os_offset_t{page_id.page_no()} * len, len,
dst, bpage);
if (UNIV_UNLIKELY(fio.err != DB_SUCCESS)) { if (UNIV_UNLIKELY(fio.err != DB_SUCCESS)) {
buf_pool.corrupted_evict(bpage, buf_page_t::READ_FIX); buf_pool.corrupted_evict(bpage, buf_page_t::READ_FIX);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment