mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 03:47:17 +02:00
MDEV-26352 : Add new thread states for certain WSREP scenarios
This adds following new thread states: * waiting to execute in isolation - DDL is waiting to execute in TOI mode. * waiting for TOI DDL - some other statement is waiting for DDL to complete. * waiting for flow control - some statement is paused while flow control is in effect. * waiting for certification - the transaction is being certified.
This commit is contained in:
parent
21ce69123c
commit
1bc82aaf0a
15 changed files with 137 additions and 51 deletions
|
|
@ -10,31 +10,31 @@ INSERT INTO t1 VALUES (1);
|
||||||
INSERT INTO t2 VALUES (1);
|
INSERT INTO t2 VALUES (1);
|
||||||
connection node_2a;
|
connection node_2a;
|
||||||
SET SESSION wsrep_sync_wait=0;
|
SET SESSION wsrep_sync_wait=0;
|
||||||
SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committing%';
|
SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification');
|
||||||
COUNT(*) = 1
|
EXPECT_1
|
||||||
1
|
1
|
||||||
SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
|
SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
|
||||||
COUNT(*) = 1
|
EXPECT_1
|
||||||
1
|
|
||||||
SELECT COUNT(*) = 0 FROM t1;
|
|
||||||
COUNT(*) = 0
|
|
||||||
1
|
|
||||||
SELECT COUNT(*) = 0 FROM t2;
|
|
||||||
COUNT(*) = 0
|
|
||||||
1
|
1
|
||||||
|
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||||
|
EXPECT_0
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) AS EXPECT_0 FROM t2;
|
||||||
|
EXPECT_0
|
||||||
|
0
|
||||||
connection node_2;
|
connection node_2;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
connection node_2a;
|
connection node_2a;
|
||||||
SET SESSION wsrep_sync_wait = 15;;
|
SET SESSION wsrep_sync_wait = 15;;
|
||||||
SELECT COUNT(*) = 1 FROM t1;
|
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||||
COUNT(*) = 1
|
EXPECT_1
|
||||||
1
|
1
|
||||||
SELECT COUNT(*) = 1 FROM t2;
|
SELECT COUNT(*) AS EXPECT_1 FROM t2;
|
||||||
COUNT(*) = 1
|
EXPECT_1
|
||||||
1
|
|
||||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committed%';
|
|
||||||
COUNT(*) = 2
|
|
||||||
1
|
1
|
||||||
|
SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committed%' or STATE = 'Waiting for certification');
|
||||||
|
EXPECT_2
|
||||||
|
2
|
||||||
SET GLOBAL wsrep_slave_threads = 1;;
|
SET GLOBAL wsrep_slave_threads = 1;;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ ALTER TABLE t1 ADD COLUMN (f4 int(10));
|
||||||
# reach commit stage. In the unlikely case the interleaving is different, the
|
# reach commit stage. In the unlikely case the interleaving is different, the
|
||||||
# result of the test should not change.
|
# result of the test should not change.
|
||||||
--connection node_1c
|
--connection node_1c
|
||||||
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id
|
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE (State='Commit' OR State='Waiting for certification') AND ID=$insert_id
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
|
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
|
|
@ -83,11 +83,11 @@ ALTER TABLE t1 ADD COLUMN (f4 int(10));
|
||||||
|
|
||||||
# wait for insert to get blocked
|
# wait for insert to get blocked
|
||||||
--connection node_1c
|
--connection node_1c
|
||||||
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE State='Commit' AND ID=$insert_id
|
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.processlist WHERE (State='Commit' OR State='Waiting for certification') AND ID=$insert_id
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
|
--let $wait_condition = SELECT COUNT(*)=1 FROM information_schema.metadata_lock_info WHERE TABLE_NAME='t1' AND THREAD_ID=$insert_id
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
--let $wait_condition = SELECT COUNT(*)=2 FROM information_schema.processlist WHERE Info like 'INSERT INTO t1 (f1) values("node1%")' AND State = 'Commit'
|
--let $wait_condition = SELECT COUNT(*)=2 FROM information_schema.processlist WHERE Info like 'INSERT INTO t1 (f1) values("node1%")' AND (State = 'Commit' OR State='Waiting for certification')
|
||||||
--source include/wait_condition.inc
|
--source include/wait_condition.inc
|
||||||
|
|
||||||
# nothing after BLOCK_DDL is applied
|
# nothing after BLOCK_DDL is applied
|
||||||
|
|
|
||||||
|
|
@ -32,19 +32,19 @@ INSERT INTO t2 VALUES (1);
|
||||||
--connection node_2a
|
--connection node_2a
|
||||||
--sleep 1
|
--sleep 1
|
||||||
SET SESSION wsrep_sync_wait=0;
|
SET SESSION wsrep_sync_wait=0;
|
||||||
SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committing%';
|
SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification');
|
||||||
SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
|
SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%';
|
||||||
SELECT COUNT(*) = 0 FROM t1;
|
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||||
SELECT COUNT(*) = 0 FROM t2;
|
SELECT COUNT(*) AS EXPECT_0 FROM t2;
|
||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
--connection node_2a
|
--connection node_2a
|
||||||
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig;
|
--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig;
|
||||||
SELECT COUNT(*) = 1 FROM t1;
|
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||||
SELECT COUNT(*) = 1 FROM t2;
|
SELECT COUNT(*) AS EXPECT_1 FROM t2;
|
||||||
SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%committed%';
|
SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committed%' or STATE = 'Waiting for certification');
|
||||||
|
|
||||||
--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig;
|
--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
|
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
||||||
|
connection node_1;
|
||||||
|
connection node_2;
|
||||||
|
connection node_3;
|
||||||
|
connection node_1;
|
||||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
SET GLOBAL wsrep_on=OFF;
|
SET GLOBAL wsrep_on=OFF;
|
||||||
|
|
@ -9,7 +14,6 @@ connection node_2;
|
||||||
SET GLOBAL wsrep_on=OFF;
|
SET GLOBAL wsrep_on=OFF;
|
||||||
INSERT INTO t1 VALUES (1, 'a');
|
INSERT INTO t1 VALUES (1, 'a');
|
||||||
SET GLOBAL wsrep_on=ON;
|
SET GLOBAL wsrep_on=ON;
|
||||||
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
|
||||||
connection node_3;
|
connection node_3;
|
||||||
INSERT INTO t1 VALUES (1, 'b');
|
INSERT INTO t1 VALUES (1, 'b');
|
||||||
SET SESSION wsrep_sync_wait = 0;
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,15 @@
|
||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
|
||||||
|
|
||||||
|
# Save original auto_increment_offset values.
|
||||||
|
--let $node_1=node_1
|
||||||
|
--let $node_2=node_2
|
||||||
|
--let $node_3=node_3
|
||||||
|
--source ../galera/include/auto_increment_offset_save.inc
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
|
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB;
|
||||||
|
|
||||||
--connection node_1
|
--connection node_1
|
||||||
|
|
@ -20,7 +29,6 @@ SET GLOBAL wsrep_on=OFF;
|
||||||
INSERT INTO t1 VALUES (1, 'a');
|
INSERT INTO t1 VALUES (1, 'a');
|
||||||
SET GLOBAL wsrep_on=ON;
|
SET GLOBAL wsrep_on=ON;
|
||||||
|
|
||||||
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
|
|
||||||
--connection node_3
|
--connection node_3
|
||||||
INSERT INTO t1 VALUES (1, 'b');
|
INSERT INTO t1 VALUES (1, 'b');
|
||||||
SET SESSION wsrep_sync_wait = 0;
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
|
|
@ -63,4 +71,4 @@ CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent
|
||||||
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on ");
|
CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on ");
|
||||||
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
|
CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown");
|
||||||
|
|
||||||
|
--source ../galera/include/auto_increment_offset_restore.inc
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2018, 2020, MariaDB Corporation.
|
/* Copyright (c) 2018, 2021, MariaDB Corporation.
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; version 2 of the License.
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
@ -381,6 +381,9 @@ bool backup_end(THD *thd)
|
||||||
if (WSREP_NNULL(thd) && thd->wsrep_desynced_backup_stage)
|
if (WSREP_NNULL(thd) && thd->wsrep_desynced_backup_stage)
|
||||||
{
|
{
|
||||||
Wsrep_server_state &server_state= Wsrep_server_state::instance();
|
Wsrep_server_state &server_state= Wsrep_server_state::instance();
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_flow);
|
||||||
|
WSREP_DEBUG("backup_end: waiting for flow control for %s",
|
||||||
|
wsrep_thd_query(thd));
|
||||||
server_state.resume_and_resync();
|
server_state.resume_and_resync();
|
||||||
thd->wsrep_desynced_backup_stage= false;
|
thd->wsrep_desynced_backup_stage= false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2020, MariaDB
|
Copyright (c) 2020, 2021, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -1138,6 +1138,9 @@ void Global_read_lock::unlock_global_read_lock(THD *thd)
|
||||||
else if (WSREP_NNULL(thd) &&
|
else if (WSREP_NNULL(thd) &&
|
||||||
server_state.state() == Wsrep_server_state::s_synced)
|
server_state.state() == Wsrep_server_state::s_synced)
|
||||||
{
|
{
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_flow);
|
||||||
|
WSREP_DEBUG("unlock_global_read_lock: waiting for flow control for %s",
|
||||||
|
wsrep_thd_query(thd));
|
||||||
server_state.resume_and_resync();
|
server_state.resume_and_resync();
|
||||||
wsrep_locked_seqno= WSREP_SEQNO_UNDEFINED;
|
wsrep_locked_seqno= WSREP_SEQNO_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
sql/mdl.cc
16
sql/mdl.cc
|
|
@ -1,5 +1,5 @@
|
||||||
/* Copyright (c) 2007, 2012, Oracle and/or its affiliates.
|
/* Copyright (c) 2007, 2012, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2020, MariaDB
|
Copyright (c) 2020, 2021, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -2304,6 +2304,20 @@ MDL_context::acquire_lock(MDL_request *mdl_request, double lock_wait_timeout)
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
if (WSREP(get_thd()))
|
||||||
|
{
|
||||||
|
THD* requester= get_thd();
|
||||||
|
bool requester_toi= wsrep_thd_is_toi(requester) || wsrep_thd_is_applying(requester);
|
||||||
|
WSREP_DEBUG("::acquire_lock is TOI %d for %s", requester_toi,
|
||||||
|
wsrep_thd_query(requester));
|
||||||
|
if (requester_toi)
|
||||||
|
THD_STAGE_INFO(requester, stage_waiting_ddl);
|
||||||
|
else
|
||||||
|
THD_STAGE_INFO(requester, stage_waiting_isolation);
|
||||||
|
}
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
lock->m_waiting.add_ticket(ticket);
|
lock->m_waiting.add_ticket(ticket);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -9183,6 +9183,14 @@ PSI_stage_info stage_starting= { 0, "starting", 0};
|
||||||
PSI_stage_info stage_waiting_for_flush= { 0, "Waiting for non trans tables to be flushed", 0};
|
PSI_stage_info stage_waiting_for_flush= { 0, "Waiting for non trans tables to be flushed", 0};
|
||||||
PSI_stage_info stage_waiting_for_ddl= { 0, "Waiting for DDLs", 0};
|
PSI_stage_info stage_waiting_for_ddl= { 0, "Waiting for DDLs", 0};
|
||||||
|
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
// Aditional Galera thread states
|
||||||
|
PSI_stage_info stage_waiting_isolation= { 0, "Waiting to execute in isolation", 0};
|
||||||
|
PSI_stage_info stage_waiting_certification= {0, "Waiting for certification", 0};
|
||||||
|
PSI_stage_info stage_waiting_ddl= {0, "Waiting for TOI DDL", 0};
|
||||||
|
PSI_stage_info stage_waiting_flow= {0, "Waiting for flow control", 0};
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
PSI_memory_key key_memory_DATE_TIME_FORMAT;
|
PSI_memory_key key_memory_DATE_TIME_FORMAT;
|
||||||
PSI_memory_key key_memory_DDL_LOG_MEMORY_ENTRY;
|
PSI_memory_key key_memory_DDL_LOG_MEMORY_ENTRY;
|
||||||
PSI_memory_key key_memory_Event_queue_element_for_exec_names;
|
PSI_memory_key key_memory_Event_queue_element_for_exec_names;
|
||||||
|
|
@ -9402,6 +9410,13 @@ PSI_stage_info *all_server_stages[]=
|
||||||
& stage_reading_semi_sync_ack,
|
& stage_reading_semi_sync_ack,
|
||||||
& stage_waiting_for_deadlock_kill,
|
& stage_waiting_for_deadlock_kill,
|
||||||
& stage_starting
|
& stage_starting
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
,
|
||||||
|
& stage_waiting_isolation,
|
||||||
|
& stage_waiting_certification,
|
||||||
|
& stage_waiting_ddl,
|
||||||
|
& stage_waiting_flow
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
};
|
};
|
||||||
|
|
||||||
PSI_socket_key key_socket_tcpip, key_socket_unix, key_socket_client_connection;
|
PSI_socket_key key_socket_tcpip, key_socket_unix, key_socket_client_connection;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* Copyright (c) 2006, 2016, Oracle and/or its affiliates.
|
/* Copyright (c) 2006, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2020, MariaDB Corporation.
|
Copyright (c) 2010, 2021, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -679,6 +679,13 @@ extern PSI_stage_info stage_slave_background_process_request;
|
||||||
extern PSI_stage_info stage_slave_background_wait_request;
|
extern PSI_stage_info stage_slave_background_wait_request;
|
||||||
extern PSI_stage_info stage_waiting_for_deadlock_kill;
|
extern PSI_stage_info stage_waiting_for_deadlock_kill;
|
||||||
extern PSI_stage_info stage_starting;
|
extern PSI_stage_info stage_starting;
|
||||||
|
#ifdef WITH_WSREP
|
||||||
|
// Aditional Galera thread states
|
||||||
|
extern PSI_stage_info stage_waiting_isolation;
|
||||||
|
extern PSI_stage_info stage_waiting_certification;
|
||||||
|
extern PSI_stage_info stage_waiting_ddl;
|
||||||
|
extern PSI_stage_info stage_waiting_flow;
|
||||||
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
#ifdef HAVE_PSI_STATEMENT_INTERFACE
|
#ifdef HAVE_PSI_STATEMENT_INTERFACE
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -5059,7 +5059,8 @@ bool select_create::send_eof()
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("select_create commit failed, thd: %llu err: %s %s",
|
WSREP_DEBUG("select_create commit failed, thd: %llu err: %s %s",
|
||||||
thd->thread_id,
|
thd->thread_id,
|
||||||
wsrep_thd_transaction_state_str(thd), wsrep_thd_query(thd));
|
wsrep_thd_transaction_state_str(thd),
|
||||||
|
wsrep_thd_query(thd));
|
||||||
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||||
abort_result_set();
|
abort_result_set();
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
|
|
|
||||||
|
|
@ -6126,7 +6126,12 @@ finish:
|
||||||
thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK;
|
thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK;
|
||||||
|
|
||||||
if (wsrep_thd_is_toi(thd) || wsrep_thd_is_in_rsu(thd))
|
if (wsrep_thd_is_toi(thd) || wsrep_thd_is_in_rsu(thd))
|
||||||
|
{
|
||||||
|
WSREP_DEBUG("mysql_execute_command for %s", wsrep_thd_query(thd));
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_isolation);
|
||||||
wsrep_to_isolation_end(thd);
|
wsrep_to_isolation_end(thd);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Force release of transactional locks if not in active MST and wsrep is on.
|
Force release of transactional locks if not in active MST and wsrep is on.
|
||||||
*/
|
*/
|
||||||
|
|
@ -7890,7 +7895,8 @@ static bool wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||||
DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
|
DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
|
||||||
});
|
});
|
||||||
WSREP_DEBUG("wsrep retrying AC query: %lu %s",
|
WSREP_DEBUG("wsrep retrying AC query: %lu %s",
|
||||||
thd->wsrep_retry_counter, wsrep_thd_query(thd));
|
thd->wsrep_retry_counter,
|
||||||
|
wsrep_thd_query(thd));
|
||||||
wsrep_prepare_for_autocommit_retry(thd, rawbuf, length, parser_state);
|
wsrep_prepare_for_autocommit_retry(thd, rawbuf, length, parser_state);
|
||||||
if (thd->lex->explain)
|
if (thd->lex->explain)
|
||||||
delete_explain_query(thd->lex);
|
delete_explain_query(thd->lex);
|
||||||
|
|
|
||||||
|
|
@ -2552,6 +2552,8 @@ static int wsrep_TOI_begin(THD *thd, const char *db, const char *table,
|
||||||
}
|
}
|
||||||
|
|
||||||
thd_proc_info(thd, "acquiring total order isolation");
|
thd_proc_info(thd, "acquiring total order isolation");
|
||||||
|
WSREP_DEBUG("wsrep_TOI_begin for %s", wsrep_thd_query(thd));
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_isolation);
|
||||||
|
|
||||||
wsrep::client_state& cs(thd->wsrep_cs());
|
wsrep::client_state& cs(thd->wsrep_cs());
|
||||||
|
|
||||||
|
|
@ -2894,39 +2896,49 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
||||||
const MDL_ticket *ticket,
|
const MDL_ticket *ticket,
|
||||||
const MDL_key *key)
|
const MDL_key *key)
|
||||||
{
|
{
|
||||||
/* Fallback to the non-wsrep behaviour */
|
|
||||||
if (!WSREP_ON) return;
|
|
||||||
|
|
||||||
THD *request_thd= requestor_ctx->get_thd();
|
THD *request_thd= requestor_ctx->get_thd();
|
||||||
THD *granted_thd= ticket->get_ctx()->get_thd();
|
THD *granted_thd= ticket->get_ctx()->get_thd();
|
||||||
|
|
||||||
|
/* Fallback to the non-wsrep behaviour */
|
||||||
|
if (!WSREP(request_thd)) return;
|
||||||
|
|
||||||
const char* schema= key->db_name();
|
const char* schema= key->db_name();
|
||||||
int schema_len= key->db_name_length();
|
int schema_len= key->db_name_length();
|
||||||
|
|
||||||
mysql_mutex_lock(&request_thd->LOCK_thd_data);
|
mysql_mutex_lock(&request_thd->LOCK_thd_data);
|
||||||
if (wsrep_thd_is_toi(request_thd) ||
|
|
||||||
wsrep_thd_is_applying(request_thd)) {
|
|
||||||
|
|
||||||
|
if (wsrep_thd_is_toi(request_thd) ||
|
||||||
|
wsrep_thd_is_applying(request_thd))
|
||||||
|
{
|
||||||
|
WSREP_DEBUG("wsrep_handle_mdl_conflict request TOI/APPLY for %s",
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_isolation);
|
||||||
mysql_mutex_unlock(&request_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&request_thd->LOCK_thd_data);
|
||||||
WSREP_MDL_LOG(DEBUG, "MDL conflict ", schema, schema_len,
|
WSREP_MDL_LOG(DEBUG, "MDL conflict ", schema, schema_len,
|
||||||
request_thd, granted_thd);
|
request_thd, granted_thd);
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
|
|
||||||
mysql_mutex_lock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_lock(&granted_thd->LOCK_thd_data);
|
||||||
|
|
||||||
if (wsrep_thd_is_toi(granted_thd) ||
|
if (wsrep_thd_is_toi(granted_thd) ||
|
||||||
wsrep_thd_is_applying(granted_thd))
|
wsrep_thd_is_applying(granted_thd))
|
||||||
{
|
{
|
||||||
if (wsrep_thd_is_aborting(granted_thd))
|
if (wsrep_thd_is_aborting(granted_thd))
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("BF thread waiting for SR in aborting state");
|
WSREP_DEBUG("BF thread waiting for SR in aborting state for %s",
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_isolation);
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
}
|
}
|
||||||
else if (wsrep_thd_is_SR(granted_thd) && !wsrep_thd_is_SR(request_thd))
|
else if (wsrep_thd_is_SR(granted_thd) && !wsrep_thd_is_SR(request_thd))
|
||||||
{
|
{
|
||||||
WSREP_MDL_LOG(INFO, "MDL conflict, DDL vs SR",
|
WSREP_MDL_LOG(INFO, "MDL conflict, DDL vs SR",
|
||||||
schema, schema_len, request_thd, granted_thd);
|
schema, schema_len, request_thd, granted_thd);
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
|
WSREP_DEBUG("wsrep_handle_mdl_conflict DDL vs SR for %s",
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_isolation);
|
||||||
wsrep_abort_thd(request_thd, granted_thd, 1);
|
wsrep_abort_thd(request_thd, granted_thd, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -2941,14 +2953,18 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
||||||
else if (granted_thd->lex->sql_command == SQLCOM_FLUSH ||
|
else if (granted_thd->lex->sql_command == SQLCOM_FLUSH ||
|
||||||
granted_thd->mdl_context.has_explicit_locks())
|
granted_thd->mdl_context.has_explicit_locks())
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("BF thread waiting for FLUSH");
|
WSREP_DEBUG("BF thread waiting for FLUSH for %s",
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_ddl);
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
}
|
}
|
||||||
else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE)
|
else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE)
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("DROP caused BF abort, conf %s",
|
WSREP_DEBUG("DROP caused BF abort, conf %s for %s",
|
||||||
wsrep_thd_transaction_state_str(granted_thd));
|
wsrep_thd_transaction_state_str(granted_thd),
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_isolation);
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
wsrep_abort_thd(request_thd, granted_thd, 1);
|
wsrep_abort_thd(request_thd, granted_thd, 1);
|
||||||
|
|
@ -2957,7 +2973,11 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
||||||
{
|
{
|
||||||
WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", schema, schema_len,
|
WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", schema, schema_len,
|
||||||
request_thd, granted_thd);
|
request_thd, granted_thd);
|
||||||
|
WSREP_DEBUG("wsrep_handle_mdl_conflict -> BF abort for %s",
|
||||||
|
wsrep_thd_query(request_thd));
|
||||||
|
THD_STAGE_INFO(request_thd, stage_waiting_isolation);
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
|
|
||||||
if (granted_thd->wsrep_trx().active())
|
if (granted_thd->wsrep_trx().active())
|
||||||
{
|
{
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
|
|
@ -2970,14 +2990,16 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
||||||
thd is BF, BF abort and wait.
|
thd is BF, BF abort and wait.
|
||||||
*/
|
*/
|
||||||
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
mysql_mutex_unlock(&granted_thd->LOCK_thd_data);
|
||||||
|
|
||||||
if (wsrep_thd_is_BF(request_thd, FALSE))
|
if (wsrep_thd_is_BF(request_thd, FALSE))
|
||||||
{
|
{
|
||||||
ha_abort_transaction(request_thd, granted_thd, TRUE);
|
ha_abort_transaction(request_thd, granted_thd, TRUE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WSREP_MDL_LOG(INFO, "MDL unknown BF-BF conflict", schema, schema_len,
|
WSREP_MDL_LOG(INFO, "MDL unknown BF-BF conflict",
|
||||||
request_thd, granted_thd);
|
schema, schema_len,
|
||||||
|
request_thd, granted_thd);
|
||||||
ticket->wsrep_report(true);
|
ticket->wsrep_report(true);
|
||||||
unireg_abort(1);
|
unireg_abort(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright 2016-2019 Codership Oy <http://www.codership.com>
|
/* Copyright 2016-2021 Codership Oy <http://www.codership.com>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -272,12 +272,14 @@ static inline int wsrep_before_commit(THD* thd, bool all)
|
||||||
WSREP_DEBUG("wsrep_before_commit: %d, %lld",
|
WSREP_DEBUG("wsrep_before_commit: %d, %lld",
|
||||||
wsrep_is_real(thd, all),
|
wsrep_is_real(thd, all),
|
||||||
(long long)wsrep_thd_trx_seqno(thd));
|
(long long)wsrep_thd_trx_seqno(thd));
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_certification);
|
||||||
int ret= 0;
|
int ret= 0;
|
||||||
DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
|
DBUG_ASSERT(wsrep_run_commit_hook(thd, all));
|
||||||
|
|
||||||
if ((ret= thd->wsrep_cs().before_commit()) == 0)
|
if ((ret= thd->wsrep_cs().before_commit()) == 0)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(!thd->wsrep_trx().ws_meta().gtid().is_undefined());
|
DBUG_ASSERT(!thd->wsrep_trx().ws_meta().gtid().is_undefined());
|
||||||
if (!thd->variables.gtid_seq_no &&
|
if (!thd->variables.gtid_seq_no &&
|
||||||
(thd->wsrep_trx().ws_meta().flags() & wsrep::provider::flag::commit))
|
(thd->wsrep_trx().ws_meta().flags() & wsrep::provider::flag::commit))
|
||||||
{
|
{
|
||||||
uint64 seqno= 0;
|
uint64 seqno= 0;
|
||||||
|
|
|
||||||
|
|
@ -836,10 +836,11 @@ bool wsrep_desync_check (sys_var *self, THD* thd, set_var* var)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
THD_STAGE_INFO(thd, stage_waiting_flow);
|
||||||
ret= Wsrep_server_state::instance().provider().resync();
|
ret= Wsrep_server_state::instance().provider().resync();
|
||||||
if (ret != WSREP_OK) {
|
if (ret != WSREP_OK) {
|
||||||
WSREP_WARN ("SET resync failed %d for schema: %s, query: %s", ret,
|
WSREP_WARN ("SET resync failed %d for schema: %s, query: %s", ret,
|
||||||
thd->get_db(), thd->query());
|
thd->get_db(), wsrep_thd_query(thd));
|
||||||
my_error (ER_CANNOT_USER, MYF(0), "'resync'", thd->query());
|
my_error (ER_CANNOT_USER, MYF(0), "'resync'", thd->query());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue