Commit 75f0c595 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge mariadb-10.2.41 into 10.2

parents 7c30bc38 561b6c7e
...@@ -68,6 +68,9 @@ f1 f2 f3 ...@@ -68,6 +68,9 @@ f1 f2 f3
10 10 0 10 10 0
INSERT INTO t1 VALUES (7,7,7); INSERT INTO t1 VALUES (7,7,7);
INSERT INTO t1 VALUES (8,8,8); INSERT INTO t1 VALUES (8,8,8);
SELECT COUNT(*) FROM t1;
COUNT(*)
7
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f3 f1 f2 f3
1 1 0 1 1 0
...@@ -78,6 +81,9 @@ f1 f2 f3 ...@@ -78,6 +81,9 @@ f1 f2 f3
8 8 8 8 8 8
10 10 0 10 10 0
connection node_1; connection node_1;
SELECT COUNT(*) FROM t1;
COUNT(*)
7
SELECT * FROM t1; SELECT * FROM t1;
f1 f2 f3 f1 f2 f3
1 1 0 1 1 0
...@@ -85,5 +91,6 @@ f1 f2 f3 ...@@ -85,5 +91,6 @@ f1 f2 f3
4 4 2 4 4 2
5 5 2 5 5 2
7 7 7 7 7 7
8 8 8
10 10 0 10 10 0
DROP TABLE t1; DROP TABLE t1;
connection node_1; connection node_1;
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); call mtr.add_suppression("WSREP: write_handler().*");
connection node_2; connection node_2;
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); call mtr.add_suppression("WSREP: write_handler():.*");
connection node_1; connection node_1;
connection node_2; connection node_2;
connection node_1; connection node_1;
...@@ -24,5 +24,7 @@ connection node_1; ...@@ -24,5 +24,7 @@ connection node_1;
SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
VARIABLE_VALUE = 2 VARIABLE_VALUE = 2
1 1
disconnect node_2; connection node_1;
disconnect node_1; call mtr.add_suppression("WSREP: write_handler().*");
connection node_2;
call mtr.add_suppression("WSREP: write_handler():.*");
connection node_1;
connection node_2;
connection node_1;
call mtr.add_suppression("WSREP: TO isolation failed for: ");
CREATE TABLE t2(a int not null auto_increment primary key, b int, key(b)) engine=innodb;
INSERT INTO t2 values (NULL,1),(NULL,2),(NULL,3),(NULL,4),(NULL,5),(NULL,6);
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1a;
BEGIN;
UPDATE t2 set b = b + 20 where b BETWEEN 2 and 5;;
connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1b;
connection node_2;
Killing server ...
connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1c;
CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB;
Got one of the listed errors
Got one of the listed errors
CREATE UNIQUE INDEX b2 ON t2(b);
Got one of the listed errors
connection node_1;
disconnect node_1a;
disconnect node_1b;
disconnect node_1c;
connection node_2;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
DROP TABLE t2;
disconnect node_2;
disconnect node_1;
...@@ -21,22 +21,6 @@ connection node_1a; ...@@ -21,22 +21,6 @@ connection node_1a;
connection node_1b; connection node_1b;
connection node_2; connection node_2;
connection node_2a; connection node_2a;
connection node_1;
SET SESSION wsrep_sync_wait=15;
SELECT COUNT(*) FROM parent;
COUNT(*)
20001
SELECT COUNT(*) FROM child;
COUNT(*)
10000
connection node_2;
SET SESSION wsrep_sync_wait=15;
SELECT COUNT(*) FROM parent;
COUNT(*)
20001
SELECT COUNT(*) FROM child;
COUNT(*)
10000
DROP TABLE child; DROP TABLE child;
DROP TABLE parent; DROP TABLE parent;
DROP TABLE ten; DROP TABLE ten;
...@@ -140,9 +140,13 @@ SELECT * FROM t1; ...@@ -140,9 +140,13 @@ SELECT * FROM t1;
# original state in node 1 # original state in node 1
INSERT INTO t1 VALUES (7,7,7); INSERT INTO t1 VALUES (7,7,7);
INSERT INTO t1 VALUES (8,8,8); INSERT INTO t1 VALUES (8,8,8);
SELECT COUNT(*) FROM t1;
SELECT * FROM t1; SELECT * FROM t1;
--connection node_1 --connection node_1
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1
--source include/wait_condition.inc
SELECT COUNT(*) FROM t1;
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
--source include/have_ssl_communication.inc --source include/have_ssl_communication.inc
--connection node_1 --connection node_1
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); call mtr.add_suppression("WSREP: write_handler().*");
--connection node_2 --connection node_2
call mtr.add_suppression("WSREP: write_handler(): protocol is shutdown.*"); call mtr.add_suppression("WSREP: write_handler():.*");
# Save original auto_increment_offset values. # Save original auto_increment_offset values.
--let $node_1=node_1 --let $node_1=node_1
...@@ -72,4 +72,8 @@ SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N ...@@ -72,4 +72,8 @@ SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N
# Restore original auto_increment_offset values. # Restore original auto_increment_offset values.
--source include/auto_increment_offset_restore.inc --source include/auto_increment_offset_restore.inc
--source include/galera_end.inc --connection node_1
call mtr.add_suppression("WSREP: write_handler().*");
--connection node_2
call mtr.add_suppression("WSREP: write_handler():.*");
#
# Confirm that with two nodes, killing one causes the other to stop accepting connections
#
--source include/galera_cluster.inc
--source include/have_innodb.inc
# Save original auto_increment_offset values.
--let $node_1=node_1
--let $node_2=node_2
--source include/auto_increment_offset_save.inc
--connection node_1
call mtr.add_suppression("WSREP: TO isolation failed for: ");
--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address`
CREATE TABLE t2(a int not null auto_increment primary key, b int, key(b)) engine=innodb;
INSERT INTO t2 values (NULL,1),(NULL,2),(NULL,3),(NULL,4),(NULL,5),(NULL,6);
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1a
BEGIN;
--send UPDATE t2 set b = b + 20 where b BETWEEN 2 and 5;
#
# Take thread id for above query
#
--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1b
--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1`
--connection node_2
--source include/kill_galera.inc
--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1c
--error ER_LOCK_DEADLOCK,ER_UNKNOWN_COM_ERROR
CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB;
--disable_query_log
--error ER_LOCK_DEADLOCK, ER_CANNOT_USER,ER_KILL_QUERY_DENIED_ERROR
--eval KILL QUERY $k_thread;
--enable_query_log
# Reset the master and restart the slave so that post-test checks can run
--error ER_LOCK_DEADLOCK,ER_UNKNOWN_COM_ERROR
CREATE UNIQUE INDEX b2 ON t2(b);
--connection node_1
--disconnect node_1a
--disconnect node_1b
--disconnect node_1c
--connection node_2
--source include/start_mysqld.inc
--source include/wait_until_connected_again.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--source include/wait_until_connected_again.inc
DROP TABLE t2;
# Restore original auto_increment_offset values.
--let $node_2=node_2a
--source include/auto_increment_offset_restore.inc
--source include/galera_end.inc
...@@ -54,15 +54,11 @@ INSERT INTO parent VALUES (1, 0); ...@@ -54,15 +54,11 @@ INSERT INTO parent VALUES (1, 0);
--connection node_2a --connection node_2a
--reap --reap
--connection node_1 #
SET SESSION wsrep_sync_wait=15; # ALTER TABLE could bf kill one or more of INSERTs to parent, so
SELECT COUNT(*) FROM parent; # the actual number of rows in PARENT depends on whether
SELECT COUNT(*) FROM child; # the INSERT is committed before ALTER TABLE is executed
#
--connection node_2
SET SESSION wsrep_sync_wait=15;
SELECT COUNT(*) FROM parent;
SELECT COUNT(*) FROM child;
DROP TABLE child; DROP TABLE child;
DROP TABLE parent; DROP TABLE parent;
......
...@@ -94,11 +94,13 @@ SELECT * FROM t1; ...@@ -94,11 +94,13 @@ SELECT * FROM t1;
--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig --eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig
--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node1 --eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node1
--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node1 --eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node1
--disconnect node_1a
--connection node_2 --connection node_2
--eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig --eval SET GLOBAL wsrep_auto_increment_control = $auto_increment_control_orig
--eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node2 --eval SET GLOBAL auto_increment_increment = $auto_increment_increment_node2
--eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node2 --eval SET GLOBAL auto_increment_offset = $auto_increment_offset_node2
--disconnect node_2a
--enable_query_log --enable_query_log
......
...@@ -66,7 +66,7 @@ call mtr.add_suppression("WSREP: Failed to get provider options"); ...@@ -66,7 +66,7 @@ call mtr.add_suppression("WSREP: Failed to get provider options");
#evalp SET GLOBAL wsrep_provider= '$WSREP_PROVIDER'; #evalp SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/ --replace_regex /.*libgalera.*/libgalera_smm.so/
SELECT @@global.wsrep_provider; SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_slave_threads; SELECT @@global.wsrep_slave_threads;
SELECT @@global.wsrep_cluster_address; SELECT @@global.wsrep_cluster_address;
...@@ -77,7 +77,7 @@ SHOW STATUS LIKE 'wsrep_thread_count'; ...@@ -77,7 +77,7 @@ SHOW STATUS LIKE 'wsrep_thread_count';
#evalp SET GLOBAL wsrep_provider= '$WSREP_PROVIDER'; #evalp SET GLOBAL wsrep_provider= '$WSREP_PROVIDER';
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/ --replace_regex /.*libgalera.*/libgalera_smm.so/
SELECT @@global.wsrep_provider; SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_cluster_address; SELECT @@global.wsrep_cluster_address;
SELECT @@global.wsrep_on; SELECT @@global.wsrep_on;
...@@ -101,7 +101,7 @@ SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VA ...@@ -101,7 +101,7 @@ SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VA
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_rollbacker_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_rollbacker_thread_count';
SELECT VARIABLE_VALUE AS EXPECT_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_thread_count';
--replace_regex /.*libgalera_smm.*/libgalera_smm.so/ --replace_regex /.*libgalera.*/libgalera_smm.so/
SELECT @@global.wsrep_provider; SELECT @@global.wsrep_provider;
SELECT @@global.wsrep_cluster_address; SELECT @@global.wsrep_cluster_address;
SELECT @@global.wsrep_on; SELECT @@global.wsrep_on;
......
...@@ -1863,6 +1863,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use, ...@@ -1863,6 +1863,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use,
if (needs_thr_lock_abort) if (needs_thr_lock_abort)
{ {
bool mutex_released= false;
mysql_mutex_lock(&in_use->LOCK_thd_data); mysql_mutex_lock(&in_use->LOCK_thd_data);
/* If not already dying */ /* If not already dying */
if (in_use->killed != KILL_CONNECTION_HARD) if (in_use->killed != KILL_CONNECTION_HARD)
...@@ -1879,18 +1880,21 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use, ...@@ -1879,18 +1880,21 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use,
thread can see those instances (e.g. see partitioning code). thread can see those instances (e.g. see partitioning code).
*/ */
if (!thd_table->needs_reopen()) if (!thd_table->needs_reopen())
{
signalled|= mysql_lock_abort_for_thread(this, thd_table); signalled|= mysql_lock_abort_for_thread(this, thd_table);
if (WSREP(this) && wsrep_thd_is_BF(this, FALSE))
{
WSREP_DEBUG("remove_table_from_cache: %llu",
(unsigned long long) this->real_id);
wsrep_abort_thd((void *)this, (void *)in_use, FALSE);
}
}
} }
#ifdef WITH_WSREP
if (WSREP(this) && wsrep_thd_is_BF(this, false))
{
WSREP_DEBUG("notify_shared_lock: BF thread %llu query %s"
" victim %llu query %s",
this->real_id, wsrep_thd_query(this),
in_use->real_id, wsrep_thd_query(in_use));
wsrep_abort_thd((void *)this, (void *)in_use, false);
mutex_released= true;
}
#endif /* WITH_WSREP */
} }
mysql_mutex_unlock(&in_use->LOCK_thd_data); if (!mutex_released) mysql_mutex_unlock(&in_use->LOCK_thd_data);
} }
DBUG_RETURN(signalled); DBUG_RETURN(signalled);
} }
......
/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. /* Copyright (c) 2000, 2017, Oracle and/or its affiliates.
Copyright (c) 2008, 2020, MariaDB Copyright (c) 2008, 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
...@@ -9069,6 +9069,18 @@ static ...@@ -9069,6 +9069,18 @@ static
void sql_kill(THD *thd, longlong id, killed_state state, killed_type type) void sql_kill(THD *thd, longlong id, killed_state state, killed_type type)
{ {
uint error; uint error;
#ifdef WITH_WSREP
if (WSREP(thd))
{
WSREP_DEBUG("sql_kill called");
if (thd->wsrep_applier)
{
WSREP_DEBUG("KILL in applying, bailing out here");
return;
}
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL)
}
#endif /* WITH_WSREP */
if (!(error= kill_one_thread(thd, id, state, type))) if (!(error= kill_one_thread(thd, id, state, type)))
{ {
if (!thd->killed) if (!thd->killed)
...@@ -9078,6 +9090,13 @@ void sql_kill(THD *thd, longlong id, killed_state state, killed_type type) ...@@ -9078,6 +9090,13 @@ void sql_kill(THD *thd, longlong id, killed_state state, killed_type type)
} }
else else
my_error(error, MYF(0), id); my_error(error, MYF(0), id);
#ifdef WITH_WSREP
return;
wsrep_error_label:
error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR :
ER_KILL_DENIED_ERROR);
my_error(error, MYF(0), id);
#endif /* WITH_WSREP */
} }
...@@ -9086,6 +9105,18 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state) ...@@ -9086,6 +9105,18 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state)
{ {
uint error; uint error;
ha_rows rows; ha_rows rows;
#ifdef WITH_WSREP
if (WSREP(thd))
{
WSREP_DEBUG("sql_kill_user called");
if (thd->wsrep_applier)
{
WSREP_DEBUG("KILL in applying, bailing out here");
return;
}
WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL)
}
#endif /* WITH_WSREP */
if (!(error= kill_threads_for_user(thd, user, state, &rows))) if (!(error= kill_threads_for_user(thd, user, state, &rows)))
my_ok(thd, rows); my_ok(thd, rows);
else else
...@@ -9096,6 +9127,11 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state) ...@@ -9096,6 +9127,11 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state)
*/ */
my_error(error, MYF(0), user->host.str, user->user.str); my_error(error, MYF(0), user->host.str, user->user.str);
} }
#ifdef WITH_WSREP
return;
wsrep_error_label:
my_error(ER_CANNOT_USER, MYF(0), user ? user->user.str : "NULL");
#endif /* WITH_WSREP */
} }
......
/* Copyright 2008-2015 Codership Oy <http://www.codership.com> /* Copyright 2008-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
...@@ -835,13 +835,25 @@ void wsrep_thr_init() ...@@ -835,13 +835,25 @@ void wsrep_thr_init()
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/* This is wrapper for wsrep_break_lock in thr_lock.c */
static int wsrep_thr_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal)
{
THD* victim_thd= (THD *) victim_thd_ptr;
/* We need to lock THD::LOCK_thd_data to protect victim
from concurrent usage or disconnect or delete. */
mysql_mutex_lock(&victim_thd->LOCK_thd_data);
int res= wsrep_abort_thd(bf_thd_ptr, victim_thd_ptr, signal);
return res;
}
void wsrep_init_startup (bool first) void wsrep_init_startup (bool first)
{ {
if (wsrep_init()) unireg_abort(1); if (wsrep_init()) unireg_abort(1);
wsrep_thr_lock_init( wsrep_thr_lock_init(
(wsrep_thd_is_brute_force_fun)wsrep_thd_is_BF, (wsrep_thd_is_brute_force_fun)wsrep_thd_is_BF,
(wsrep_abort_thd_fun)wsrep_abort_thd, (wsrep_abort_thd_fun)wsrep_thr_abort_thd,
wsrep_debug, wsrep_convert_LOCK_to_trx, wsrep_debug, wsrep_convert_LOCK_to_trx,
(wsrep_on_fun)wsrep_on); (wsrep_on_fun)wsrep_on);
...@@ -1694,6 +1706,11 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_, ...@@ -1694,6 +1706,11 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
case SQLCOM_DROP_TABLE: case SQLCOM_DROP_TABLE:
buf_err= wsrep_drop_table_query(thd, &buf, &buf_len); buf_err= wsrep_drop_table_query(thd, &buf, &buf_len);
break; break;
case SQLCOM_KILL:
WSREP_DEBUG("KILL as TOI: %s", thd->query());
buf_err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(),
&buf, &buf_len);
break;
case SQLCOM_CREATE_ROLE: case SQLCOM_CREATE_ROLE:
if (sp_process_definer(thd)) if (sp_process_definer(thd))
{ {
...@@ -2058,8 +2075,13 @@ bool wsrep_grant_mdl_exception(MDL_context *requestor_ctx, ...@@ -2058,8 +2075,13 @@ bool wsrep_grant_mdl_exception(MDL_context *requestor_ctx,
ticket->wsrep_report(true); ticket->wsrep_report(true);
} }
mysql_mutex_unlock(&granted_thd->LOCK_thd_data); /* This will call wsrep_abort_transaction so we should hold
wsrep_abort_thd((void *) request_thd, (void *) granted_thd, 1); THD::LOCK_thd_data to protect victim from concurrent usage
or disconnect or delete. */
if (request_thd->wsrep_exec_mode == REPL_RECV)
DEBUG_SYNC(request_thd, "wsrep_after_granted_lock");
wsrep_abort_thd((void *) request_thd, (void *) granted_thd, true);
ret= false; ret= false;
} }
} }
...@@ -2241,6 +2263,7 @@ pthread_handler_t start_wsrep_THD(void *arg) ...@@ -2241,6 +2263,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
static bool abort_replicated(THD *thd) static bool abort_replicated(THD *thd)
{ {
bool ret_code= false; bool ret_code= false;
mysql_mutex_lock(&thd->LOCK_thd_data);
if (thd->wsrep_query_state== QUERY_COMMITTING) if (thd->wsrep_query_state== QUERY_COMMITTING)
{ {
WSREP_DEBUG("aborting replicated trx: %llu", (ulonglong)(thd->real_id)); WSREP_DEBUG("aborting replicated trx: %llu", (ulonglong)(thd->real_id));
...@@ -2248,6 +2271,8 @@ static bool abort_replicated(THD *thd) ...@@ -2248,6 +2271,8 @@ static bool abort_replicated(THD *thd)
(void)wsrep_abort_thd(thd, thd, TRUE); (void)wsrep_abort_thd(thd, thd, TRUE);
ret_code= true; ret_code= true;
} }
else
mysql_mutex_unlock(&thd->LOCK_thd_data);
return ret_code; return ret_code;
} }
...@@ -2294,6 +2319,8 @@ static bool have_client_connections() ...@@ -2294,6 +2319,8 @@ static bool have_client_connections()
(longlong) tmp->thread_id)); (longlong) tmp->thread_id));
if (is_client_connection(tmp) && tmp->killed == KILL_CONNECTION) if (is_client_connection(tmp) && tmp->killed == KILL_CONNECTION)
{ {
WSREP_DEBUG("Informing thread %lld that it's time to die",
(longlong)tmp->thread_id);
(void)abort_replicated(tmp); (void)abort_replicated(tmp);
return true; return true;
} }
...@@ -2378,6 +2405,8 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd) ...@@ -2378,6 +2405,8 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
{ {
DBUG_PRINT("quit",("Informing thread %lld that it's time to die", DBUG_PRINT("quit",("Informing thread %lld that it's time to die",
(longlong) tmp->thread_id)); (longlong) tmp->thread_id));
WSREP_DEBUG("Informing thread %lld that it's time to die",
(longlong)tmp->thread_id);
/* We skip slave threads & scheduler on this first loop through. */ /* We skip slave threads & scheduler on this first loop through. */
if (!is_client_connection(tmp)) if (!is_client_connection(tmp))
continue; continue;
...@@ -2394,15 +2423,18 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd) ...@@ -2394,15 +2423,18 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
continue; continue;
} }
/* replicated transactions must be skipped */ /* replicated transactions must be skipped and aborted
with wsrep_abort_thd. */
if (abort_replicated(tmp)) if (abort_replicated(tmp))
continue; continue;
WSREP_DEBUG("closing connection %lld", (longlong) tmp->thread_id); WSREP_DEBUG("closing connection %lld", (longlong) tmp->thread_id);
/* /*
instead of wsrep_close_thread() we do now soft kill by THD::awake instead of wsrep_close_thread() we do now soft kill by
*/ THD::awake(). Here also victim needs to be protected from
concurrent usage or disconnect or delete.
*/
mysql_mutex_lock(&tmp->LOCK_thd_data); mysql_mutex_lock(&tmp->LOCK_thd_data);
tmp->awake(KILL_CONNECTION); tmp->awake(KILL_CONNECTION);
...@@ -2423,7 +2455,6 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd) ...@@ -2423,7 +2455,6 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
I_List_iterator<THD> it2(threads); I_List_iterator<THD> it2(threads);
while ((tmp=it2++)) while ((tmp=it2++))
{ {
#ifndef __bsdi__ // Bug in BSDI kernel
if (is_client_connection(tmp) && if (is_client_connection(tmp) &&
!abort_replicated(tmp) && !abort_replicated(tmp) &&
!is_replaying_connection(tmp) && !is_replaying_connection(tmp) &&
...@@ -2432,7 +2463,6 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd) ...@@ -2432,7 +2463,6 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
WSREP_INFO("killing local connection: %lld", (longlong) tmp->thread_id); WSREP_INFO("killing local connection: %lld", (longlong) tmp->thread_id);
close_connection(tmp,0); close_connection(tmp,0);
} }
#endif
} }
DBUG_PRINT("quit",("Waiting for threads to die (count=%u)",thread_count)); DBUG_PRINT("quit",("Waiting for threads to die (count=%u)",thread_count));
...@@ -2621,7 +2651,8 @@ extern "C" void wsrep_thd_set_query_state( ...@@ -2621,7 +2651,8 @@ extern "C" void wsrep_thd_set_query_state(
void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state) void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state)
{ {
if (WSREP(thd)) thd->wsrep_conflict_state= state; mysql_mutex_assert_owner(&thd->LOCK_thd_data);
thd->wsrep_conflict_state= state;
} }
...@@ -2762,6 +2793,9 @@ extern "C" void wsrep_thd_awake(THD *thd, my_bool signal) ...@@ -2762,6 +2793,9 @@ extern "C" void wsrep_thd_awake(THD *thd, my_bool signal)
{ {
if (signal) if (signal)
{ {
/* Here we should hold THD::LOCK_thd_data to
protect from concurrent usage. */
mysql_mutex_assert_owner(&thd->LOCK_thd_data);
thd->awake(KILL_QUERY); thd->awake(KILL_QUERY);
} }
else else
......
/* Copyright (C) 2013 Codership Oy <info@codership.com> /* Copyright (C) 2013-2021 Codership Oy <info@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
...@@ -804,10 +804,12 @@ my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync) ...@@ -804,10 +804,12 @@ my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync)
int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal) int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal)
{ {
THD *victim_thd = (THD *) victim_thd_ptr; THD *victim_thd= (THD *) victim_thd_ptr;
THD *bf_thd = (THD *) bf_thd_ptr; THD *bf_thd= (THD *) bf_thd_ptr;
DBUG_ENTER("wsrep_abort_thd"); DBUG_ENTER("wsrep_abort_thd");
mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data);
if ( (WSREP(bf_thd) || if ( (WSREP(bf_thd) ||
( (WSREP_ON || bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU) && ( (WSREP_ON || bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU) &&
bf_thd->wsrep_exec_mode == TOTAL_ORDER) ) && bf_thd->wsrep_exec_mode == TOTAL_ORDER) ) &&
...@@ -821,6 +823,7 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal) ...@@ -821,6 +823,7 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal)
"aborted. Ignoring.", "aborted. Ignoring.",
(bf_thd) ? (long long)bf_thd->real_id : 0, (bf_thd) ? (long long)bf_thd->real_id : 0,
(long long)victim_thd->real_id); (long long)victim_thd->real_id);
mysql_mutex_unlock(&victim_thd->LOCK_thd_data);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -831,6 +834,7 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal) ...@@ -831,6 +834,7 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal)
else else
{ {
WSREP_DEBUG("wsrep_abort_thd not effective: %p %p", bf_thd, victim_thd); WSREP_DEBUG("wsrep_abort_thd not effective: %p %p", bf_thd, victim_thd);
mysql_mutex_unlock(&victim_thd->LOCK_thd_data);
} }
DBUG_RETURN(1); DBUG_RETURN(1);
......
/*************** Colblk H Declares Source Code File (.H) ***************/ /*************** Colblk H Declares Source Code File (.H) ***************/
/* Name: COLBLK.H Version 1.7 */ /* Name: COLBLK.H Version 1.7 */
/* */ /* */
/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* (C) Copyright to the author Olivier BERTRAND 2005-2019 */
/* */ /* */
/* This file contains the COLBLK and derived classes declares. */ /* This file contains the COLBLK and derived classes declares. */
/***********************************************************************/ /***********************************************************************/
......
let $MONGO= C:/Applic/MongoDB/Server/3.6/bin/mongo; #let $MONGO= C:/Applic/MongoDB/Server/3.6/bin/mongo;
let $MONGOIMPORT= C:/Applic/MongoDB/Server/3.6/bin/mongoimport; #let $MONGOIMPORT= C:/Applic/MongoDB/Server/3.6/bin/mongoimport;
let $MONGO= mongo;
let $MONGOIMPORT= mongoimport;
/***********************************************************************/ /***********************************************************************/
/* Name: ODBCONN.CPP Version 2.3 */ /* Name: ODBCONN.CPP Version 2.4 */
/* */ /* */
/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ /* (C) Copyright to the author Olivier BERTRAND 1998-2021 */
/* */ /* */
/* This file contains the ODBC connection classes functions. */ /* This file contains the ODBC connection classes functions. */
/***********************************************************************/ /***********************************************************************/
...@@ -1509,7 +1509,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) ...@@ -1509,7 +1509,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols)
ThrowDBX(MSG(COL_NUM_MISM)); ThrowDBX(MSG(COL_NUM_MISM));
// Now bind the column buffers // Now bind the column buffers
for (n = 1, colp = tocols; colp; colp = (PODBCCOL)colp->GetNext()) for (colp = tocols; colp; colp = (PODBCCOL)colp->GetNext())
if (!colp->IsSpecial()) { if (!colp->IsSpecial()) {
buffer = colp->GetBuffer(m_RowsetSize); buffer = colp->GetBuffer(m_RowsetSize);
len = colp->GetBuflen(); len = colp->GetBuflen();
...@@ -1525,12 +1525,11 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) ...@@ -1525,12 +1525,11 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols)
htrc("Binding col=%u type=%d buf=%p len=%d slen=%p\n", htrc("Binding col=%u type=%d buf=%p len=%d slen=%p\n",
n, tp, buffer, len, colp->GetStrLen()); n, tp, buffer, len, colp->GetStrLen());
rc = SQLBindCol(hstmt, n, tp, buffer, len, colp->GetStrLen()); rc = SQLBindCol(hstmt, colp->GetIndex(), tp, buffer, len, colp->GetStrLen());
if (!Check(rc)) if (!Check(rc))
ThrowDBX(rc, "SQLBindCol", hstmt); ThrowDBX(rc, "SQLBindCol", hstmt);
n++;
} // endif pcol } // endif pcol
} catch(DBX *x) { } catch(DBX *x) {
......
...@@ -376,7 +376,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) ...@@ -376,7 +376,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
} // endswitch ReadDB } // endswitch ReadDB
} else } else
jsp = bp->GetArrayValue(bdp, i); jsp = bp->GetNext(jsp);
if (!(row = (jsp) ? bp->GetObject(jsp) : NULL)) if (!(row = (jsp) ? bp->GetObject(jsp) : NULL))
break; break;
...@@ -2185,7 +2185,9 @@ void BSONCOL::WriteColumn(PGLOBAL g) ...@@ -2185,7 +2185,9 @@ void BSONCOL::WriteColumn(PGLOBAL g)
TDBBSON::TDBBSON(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBBSN(g, tdp, txfp) TDBBSON::TDBBSON(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBBSN(g, tdp, txfp)
{ {
Docp = NULL; Docp = NULL;
Docrow = NULL;
Multiple = tdp->Multiple; Multiple = tdp->Multiple;
Docsize = 0;
Done = Changed = false; Done = Changed = false;
Bp->SetPretty(2); Bp->SetPretty(2);
} // end of TDBBSON standard constructor } // end of TDBBSON standard constructor
...@@ -2193,7 +2195,9 @@ TDBBSON::TDBBSON(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBBSN(g, tdp, txfp) ...@@ -2193,7 +2195,9 @@ TDBBSON::TDBBSON(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBBSN(g, tdp, txfp)
TDBBSON::TDBBSON(PBTDB tdbp) : TDBBSN(tdbp) TDBBSON::TDBBSON(PBTDB tdbp) : TDBBSN(tdbp)
{ {
Docp = tdbp->Docp; Docp = tdbp->Docp;
Docrow = tdbp->Docrow;
Multiple = tdbp->Multiple; Multiple = tdbp->Multiple;
Docsize = tdbp->Docsize;
Done = tdbp->Done; Done = tdbp->Done;
Changed = tdbp->Changed; Changed = tdbp->Changed;
} // end of TDBBSON copy constructor } // end of TDBBSON copy constructor
...@@ -2374,6 +2378,7 @@ int TDBBSON::MakeDocument(PGLOBAL g) ...@@ -2374,6 +2378,7 @@ int TDBBSON::MakeDocument(PGLOBAL g)
} // endif jsp } // endif jsp
Docsize = Bp->GetSize(Docp);
Done = true; Done = true;
return RC_OK; return RC_OK;
} // end of MakeDocument } // end of MakeDocument
...@@ -2388,7 +2393,7 @@ int TDBBSON::Cardinality(PGLOBAL g) ...@@ -2388,7 +2393,7 @@ int TDBBSON::Cardinality(PGLOBAL g)
else if (Cardinal < 0) { else if (Cardinal < 0) {
if (!Multiple) { if (!Multiple) {
if (MakeDocument(g) == RC_OK) if (MakeDocument(g) == RC_OK)
Cardinal = Bp->GetSize(Docp); Cardinal = Docsize;
} else } else
return 10; return 10;
...@@ -2417,6 +2422,7 @@ void TDBBSON::ResetSize(void) ...@@ -2417,6 +2422,7 @@ void TDBBSON::ResetSize(void)
MaxSize = Cardinal = -1; MaxSize = Cardinal = -1;
Fpos = -1; Fpos = -1;
N = 0; N = 0;
Docrow = NULL;
Done = false; Done = false;
} // end of ResetSize } // end of ResetSize
...@@ -2475,6 +2481,7 @@ bool TDBBSON::SetRecpos(PGLOBAL, int recpos) ...@@ -2475,6 +2481,7 @@ bool TDBBSON::SetRecpos(PGLOBAL, int recpos)
#endif // 0 #endif // 0
Fpos = recpos - 1; Fpos = recpos - 1;
Docrow = NULL;
return false; return false;
} // end of SetRecpos } // end of SetRecpos
...@@ -2490,6 +2497,7 @@ bool TDBBSON::OpenDB(PGLOBAL g) ...@@ -2490,6 +2497,7 @@ bool TDBBSON::OpenDB(PGLOBAL g)
Fpos = -1; Fpos = -1;
NextSame = false; NextSame = false;
SameRow = 0; SameRow = 0;
Docrow = NULL;
return false; return false;
} // endif use } // endif use
...@@ -2530,12 +2538,9 @@ int TDBBSON::ReadDB(PGLOBAL) ...@@ -2530,12 +2538,9 @@ int TDBBSON::ReadDB(PGLOBAL)
NextSame = false; NextSame = false;
M++; M++;
rc = RC_OK; rc = RC_OK;
} else if (++Fpos < (signed)Bp->GetSize(Docp)) { } else if (++Fpos < Docsize) {
Row = Bp->GetArrayValue(Docp, Fpos); Docrow = (Docrow) ? Bp->GetNext(Docrow) : Bp->GetArrayValue(Docp, Fpos);
Row = (Docrow->Type == TYPE_JVAL) ? Bp->GetBson(Docrow) : Docrow;
if (Row->Type == TYPE_JVAL)
Row = Bp->GetBson(Row);
SameRow = 0; SameRow = 0;
M = 1; M = 1;
rc = RC_OK; rc = RC_OK;
......
...@@ -318,7 +318,9 @@ class DllExport TDBBSON : public TDBBSN { ...@@ -318,7 +318,9 @@ class DllExport TDBBSON : public TDBBSN {
// Members // Members
PBVAL Docp; // The document array PBVAL Docp; // The document array
PBVAL Docrow; // Document row
int Multiple; // 0: No 1: DIR 2: Section 3: filelist int Multiple; // 0: No 1: DIR 2: Section 3: filelist
int Docsize; // The document size
bool Done; // True when document parsing is done bool Done; // True when document parsing is done
bool Changed; // After Update, Insert or Delete bool Changed; // After Update, Insert or Delete
}; // end of class TDBBSON }; // end of class TDBBSON
......
This diff is collapsed.
...@@ -233,12 +233,11 @@ innobase_casedn_str( ...@@ -233,12 +233,11 @@ innobase_casedn_str(
char* a); /*!< in/out: string to put in lower case */ char* a); /*!< in/out: string to put in lower case */
#ifdef WITH_WSREP #ifdef WITH_WSREP
UNIV_INTERN
void void
wsrep_innobase_kill_one_trx(MYSQL_THD const thd_ptr, wsrep_innobase_kill_one_trx(MYSQL_THD const thd_ptr,
const trx_t * const bf_trx, const trx_t * const bf_trx,
trx_t *victim_trx, trx_t *victim_trx,
ibool signal); my_bool signal);
int wsrep_innobase_mysql_sort(int mysql_type, uint charset_number, int wsrep_innobase_mysql_sort(int mysql_type, uint charset_number,
unsigned char* str, unsigned int str_length, unsigned char* str, unsigned int str_length,
unsigned int buf_length); unsigned int buf_length);
......
...@@ -184,13 +184,11 @@ lock_wait_table_reserve_slot( ...@@ -184,13 +184,11 @@ lock_wait_table_reserve_slot(
check if lock timeout was for priority thread, check if lock timeout was for priority thread,
as a side effect trigger lock monitor as a side effect trigger lock monitor
@param[in] trx transaction owning the lock @param[in] trx transaction owning the lock
@param[in] locked true if trx and lock_sys_mutex is ownd
@return false for regular lock timeout */ @return false for regular lock timeout */
static static
bool bool
wsrep_is_BF_lock_timeout( wsrep_is_BF_lock_timeout(
const trx_t* trx, const trx_t* trx)
bool locked = true)
{ {
bool long_wait= (trx->error_state != DB_DEADLOCK && bool long_wait= (trx->error_state != DB_DEADLOCK &&
trx->is_wsrep() && trx->is_wsrep() &&
...@@ -204,18 +202,6 @@ wsrep_is_BF_lock_timeout( ...@@ -204,18 +202,6 @@ wsrep_is_BF_lock_timeout(
ib::info() << "WSREP: BF lock wait long for trx:" << trx->id ib::info() << "WSREP: BF lock wait long for trx:" << trx->id
<< " query: " << wsrep_thd_query(trx->mysql_thd); << " query: " << wsrep_thd_query(trx->mysql_thd);
if (!locked)
lock_mutex_enter();
ut_ad(lock_mutex_own());
wsrep_trx_print_locking(stderr, trx, 3000);
/* Note this will release lock_sys mutex */
lock_print_info_all_transactions(stderr);
if (locked)
lock_mutex_enter();
return was_wait; return was_wait;
} else } else
return false; return false;
...@@ -407,7 +393,7 @@ lock_wait_suspend_thread( ...@@ -407,7 +393,7 @@ lock_wait_suspend_thread(
&& wait_time > (double) lock_wait_timeout && wait_time > (double) lock_wait_timeout
#ifdef WITH_WSREP #ifdef WITH_WSREP
&& (!trx->is_wsrep() && (!trx->is_wsrep()
|| (!wsrep_is_BF_lock_timeout(trx, false) || (!wsrep_is_BF_lock_timeout(trx)
&& trx->error_state != DB_DEADLOCK)) && trx->error_state != DB_DEADLOCK))
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
) { ) {
......
...@@ -55,7 +55,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. ...@@ -55,7 +55,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
#include <toku_pthread.h> #include <toku_pthread.h>
int toku_pthread_yield(void) { int toku_pthread_yield(void) {
#if defined(HAVE_PTHREAD_YIELD) #if defined(HAVE_SCHED_YIELD)
return sched_yield();
#elif defined(HAVE_PTHREAD_YIELD)
# if defined(PTHREAD_YIELD_RETURNS_INT) # if defined(PTHREAD_YIELD_RETURNS_INT)
return pthread_yield(); return pthread_yield();
# elif defined(PTHREAD_YIELD_RETURNS_VOID) # elif defined(PTHREAD_YIELD_RETURNS_VOID)
......
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