1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge branch '10.5' into 10.6

This commit is contained in:
Sergei Golubchik
2022-09-30 12:29:24 +02:00
19 changed files with 600 additions and 557 deletions

View File

@@ -935,7 +935,7 @@ static int run_mysqlcheck_upgrade(my_bool mysql_db_only)
return 0; return 0;
} }
verbose("Phase %d/%d: Checking and upgrading %s", ++phase, phases_total, what); verbose("Phase %d/%d: Checking and upgrading %s", ++phase, phases_total, what);
print_conn_args("mysqlcheck"); print_conn_args("mariadb-check");
retch= run_tool(mysqlcheck_path, retch= run_tool(mysqlcheck_path,
NULL, /* Send output from mysqlcheck directly to screen */ NULL, /* Send output from mysqlcheck directly to screen */
defaults_file, defaults_file,
@@ -1451,7 +1451,7 @@ int main(int argc, char **argv)
} }
/* Find mysql */ /* Find mysql */
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name); find_tool(mysql_path, IF_WIN("mariadb.exe", "mariadb"), self_name);
open_mysql_upgrade_file(); open_mysql_upgrade_file();
@@ -1459,7 +1459,7 @@ int main(int argc, char **argv)
exit(upgrade_already_done(0) == 0); exit(upgrade_already_done(0) == 0);
/* Find mysqlcheck */ /* Find mysqlcheck */
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name); find_tool(mysqlcheck_path, IF_WIN("mariadb-check.exe", "mariadb-check"), self_name);
if (opt_systables_only && !opt_silent) if (opt_systables_only && !opt_silent)
printf("The --upgrade-system-tables option was used, user tables won't be touched.\n"); printf("The --upgrade-system-tables option was used, user tables won't be touched.\n");

View File

@@ -436,6 +436,7 @@ void safe_mutex_free_deadlock_data(safe_mutex_t *mp);
#define my_cond_wait(A,B) safe_cond_wait((A), (B), __FILE__, __LINE__) #define my_cond_wait(A,B) safe_cond_wait((A), (B), __FILE__, __LINE__)
#else #else
#define safe_mutex_is_owner(mp) (1)
#define safe_mutex_assert_owner(mp) do {} while (0) #define safe_mutex_assert_owner(mp) do {} while (0)
#define safe_mutex_assert_not_owner(mp) do {} while (0) #define safe_mutex_assert_not_owner(mp) do {} while (0)
#define safe_mutex_setflags(mp, F) do {} while (0) #define safe_mutex_setflags(mp, F) do {} while (0)

View File

@@ -1,225 +1,7 @@
set local sql_mode=""; set local sql_mode="";
set global sql_mode=""; set global sql_mode="";
SET DEBUG_SYNC = 'RESET'; connect con1, localhost, root;
DROP TABLE IF EXISTS t1, t2, t3; connect con2, localhost, root;
DROP FUNCTION IF EXISTS MY_KILL;
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
KILL tid;
RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
END|
connect con1, localhost, root,,;
connect con2, localhost, root,,;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
connection con2;
SET DEBUG_SYNC='now WAIT_FOR con1_read';
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection con2;
SELECT 4;
4
4
connection default;
KILL (SELECT COUNT(*) FROM mysql.user);
ERROR 42000: KILL does not support subqueries or stored functions
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection con2;
SELECT 4;
4
4
connection default;
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
INSERT INTO t1 VALUES
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
INSERT INTO t2 SELECT id FROM t1;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
SELECT id FROM t1 WHERE id IN
(SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
GROUP BY ACOS(1/a.id), b.id, c.id, d.id
HAVING a.id BETWEEN 10 AND 20);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL @id;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
Got one of the listed errors
SELECT 1;
1
1
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
SELECT ACOS(0);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ACOS(0)
1.5707963267948966
SELECT 1;
1
1
SELECT @id = CONNECTION_ID();
@id = CONNECTION_ID()
1
connection default;
SET DEBUG_SYNC = 'RESET';
CREATE TABLE t1 (f1 INT);
CREATE FUNCTION bug27563() RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
RETURN 1;
END|
connection con1;
connection con2;
connection con1;
INSERT INTO t1 VALUES (bug27563());
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
connection default;
SET DEBUG_SYNC = 'RESET';
INSERT INTO t1 VALUES(0);
connection con1;
UPDATE t1 SET f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
connection default;
SET DEBUG_SYNC = 'RESET';
INSERT INTO t1 VALUES(1);
connection con1;
DELETE FROM t1 WHERE bug27563() IS NULL;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
connection default;
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT * FROM t1 WHERE f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION bug27563;
CREATE TABLE t2 (f2 INT);
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
INSERT INTO t2 VALUES(0);
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
INSERT INTO t2 VALUES(1);
END|
connection con1;
INSERT INTO t1 VALUES(2),(3);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
SELECT * FROM t2;
f2
0
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
#
# Bug#19723: kill of active connection yields different error code
# depending on platform.
#
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
KILL @id;
ERROR 70100: Connection was killed
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
# ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
# depending on the timing of close of the connection socket
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection default;
SET DEBUG_SYNC = 'RESET';
# #
# Additional test for WL#3726 "DDL locking for all metadata objects" # Additional test for WL#3726 "DDL locking for all metadata objects"
# Check that DDL and DML statements waiting for metadata locks can # Check that DDL and DML statements waiting for metadata locks can
@@ -227,7 +9,6 @@ SET DEBUG_SYNC = 'RESET';
# can be tricky to write test case for some of them (e.g. REPAIR or # can be tricky to write test case for some of them (e.g. REPAIR or
# ALTER and other statements under LOCK TABLES). # ALTER and other statements under LOCK TABLES).
# #
drop tables if exists t1, t2, t3;
create table t1 (i int primary key); create table t1 (i int primary key);
connect blocker, localhost, root, , ; connect blocker, localhost, root, , ;
connect dml, localhost, root, , ; connect dml, localhost, root, , ;
@@ -380,9 +161,9 @@ connection default;
ERROR 70100: Query execution was interrupted ERROR 70100: Query execution was interrupted
disconnect con5; disconnect con5;
DROP USER u1@localhost; DROP USER u1@localhost;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL;
set global sql_mode=default; set global sql_mode=default;
disconnect con1;
disconnect con2;
# #
# MDEV-17998 # MDEV-17998
# Deadlock and eventual Assertion `!table->pos_in_locked_tables' failed # Deadlock and eventual Assertion `!table->pos_in_locked_tables' failed

View File

@@ -8,294 +8,11 @@
# #
-- source include/not_embedded.inc -- source include/not_embedded.inc
-- source include/have_debug_sync.inc
set local sql_mode=""; set local sql_mode="";
set global sql_mode=""; set global sql_mode="";
--disable_warnings connect con1, localhost, root;
SET DEBUG_SYNC = 'RESET'; connect con2, localhost, root;
DROP TABLE IF EXISTS t1, t2, t3;
DROP FUNCTION IF EXISTS MY_KILL;
--enable_warnings
delimiter |;
# Helper function used to repeatedly kill a session.
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
KILL tid;
RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
END|
delimiter ;|
connect (con1, localhost, root,,);
connect (con2, localhost, root,,);
# Save id of con1
connection con1;
--disable_reconnect
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
# Signal when this connection is terminating.
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
# See if we can kill read().
# Run into read() immediately after hitting 'before_do_command_net_read'.
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
# Kill con1
connection con2;
SET DEBUG_SYNC='now WAIT_FOR con1_read';
# At this point we have no way to figure out, when con1 is blocked in
# reading from the socket. Sending KILL to early would not terminate
# con1. So we repeat KILL until con1 terminates.
let $wait_condition= SELECT MY_KILL(@id);
--source include/wait_condition.inc
# If KILL missed the read(), sync point wait will time out.
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
--error 1053,2006,2013,5014
SELECT 1;
--enable_reconnect
# this should work, and we should have a new connection_id()
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
#make sure the server is still alive
connection con2;
SELECT 4;
connection default;
--error ER_SUBQUERIES_NOT_SUPPORTED
KILL (SELECT COUNT(*) FROM mysql.user);
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
disable_reconnect;
# Signal when this connection is terminating.
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
# See if we can kill the sync point itself.
# Wait in 'before_do_command_net_read' until killed.
# It doesn't wait for a signal 'kill' but for to be killed.
# The signal name doesn't matter here.
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
# Repeat KILL until con1 terminates.
let $wait_condition= SELECT MY_KILL(@id);
--source include/wait_condition.inc
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
--error 1053,2006,2013,5014
SELECT 1;
enable_reconnect;
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
connection con2;
SELECT 4;
connection default;
#
# BUG#14851: killing long running subquery processed via a temporary table.
#
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
INSERT INTO t1 VALUES
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
INSERT INTO t2 SELECT id FROM t1;
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
# This is a very long running query. If this test start failing,
# it may be necessary to change to an even longer query.
send SELECT id FROM t1 WHERE id IN
(SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
GROUP BY ACOS(1/a.id), b.id, c.id, d.id
HAVING a.id BETWEEN 10 AND 20);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL @id;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
--error 1317,1053,2006,2013,5014
reap;
SELECT 1;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
#
# Test of blocking of sending ERROR after OK or EOF
#
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
send SELECT ACOS(0);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
reap;
SELECT 1;
SELECT @id = CONNECTION_ID();
connection default;
SET DEBUG_SYNC = 'RESET';
#
# Bug#27563: Stored functions and triggers wasn't throwing an error when killed.
#
CREATE TABLE t1 (f1 INT);
delimiter |;
CREATE FUNCTION bug27563() RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
RETURN 1;
END|
delimiter ;|
# Test stored functions
# Test INSERT
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
send INSERT INTO t1 VALUES (bug27563());
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test UPDATE
INSERT INTO t1 VALUES(0);
connection con1;
send UPDATE t1 SET f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test DELETE
INSERT INTO t1 VALUES(1);
connection con1;
send DELETE FROM t1 WHERE bug27563() IS NULL;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test SELECT
connection con1;
send SELECT * FROM t1 WHERE f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION bug27563;
# Test TRIGGERS
CREATE TABLE t2 (f2 INT);
delimiter |;
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
INSERT INTO t2 VALUES(0);
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
INSERT INTO t2 VALUES(1);
END|
delimiter ;|
connection con1;
send INSERT INTO t1 VALUES(2),(3);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
SELECT * FROM t2;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
--echo #
--echo # Bug#19723: kill of active connection yields different error code
--echo # depending on platform.
--echo #
--connection con1
let $ID= `SELECT @id := CONNECTION_ID()`;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
--disable_reconnect
--error ER_CONNECTION_KILLED
KILL @id;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
--echo # ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
--echo # depending on the timing of close of the connection socket
--error 1053,2006,2013,5014
SELECT 1;
--enable_reconnect
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
connection default;
SET DEBUG_SYNC = 'RESET';
--echo # --echo #
--echo # Additional test for WL#3726 "DDL locking for all metadata objects" --echo # Additional test for WL#3726 "DDL locking for all metadata objects"
@@ -304,9 +21,6 @@ SET DEBUG_SYNC = 'RESET';
--echo # can be tricky to write test case for some of them (e.g. REPAIR or --echo # can be tricky to write test case for some of them (e.g. REPAIR or
--echo # ALTER and other statements under LOCK TABLES). --echo # ALTER and other statements under LOCK TABLES).
--echo # --echo #
--disable_warnings
drop tables if exists t1, t2, t3;
--enable_warnings
create table t1 (i int primary key); create table t1 (i int primary key);
connect (blocker, localhost, root, , ); connect (blocker, localhost, root, , );
@@ -570,11 +284,9 @@ reap;
disconnect con5; disconnect con5;
DROP USER u1@localhost; DROP USER u1@localhost;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL;
set global sql_mode=default; set global sql_mode=default;
disconnect con1;
disconnect con2;
--echo # --echo #
--echo # MDEV-17998 --echo # MDEV-17998

View File

@@ -0,0 +1,239 @@
set local sql_mode="";
set global sql_mode="";
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
KILL tid;
RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
END|
connect con1, localhost, root;
connect con2, localhost, root;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
connection con2;
SET DEBUG_SYNC='now WAIT_FOR con1_read';
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection con2;
SELECT 4;
4
4
connection default;
KILL (SELECT COUNT(*) FROM mysql.user);
ERROR 42000: KILL does not support subqueries or stored functions
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection con2;
SELECT 4;
4
4
connection default;
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
INSERT INTO t1 VALUES
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
INSERT INTO t2 SELECT id FROM t1;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
SELECT id FROM t1 WHERE id IN
(SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
GROUP BY ACOS(1/a.id), b.id, c.id, d.id
HAVING a.id BETWEEN 10 AND 20);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL @id;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
Got one of the listed errors
SELECT 1;
1
1
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
connection con1;
connection con2;
connection con1;
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
SELECT ACOS(0);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ACOS(0)
1.5707963267948966
SELECT 1;
1
1
SELECT @id = CONNECTION_ID();
@id = CONNECTION_ID()
1
connection default;
SET DEBUG_SYNC = 'RESET';
CREATE TABLE t1 (f1 INT);
CREATE FUNCTION bug27563() RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
RETURN 1;
END|
connection con1;
connection con2;
connection con1;
INSERT INTO t1 VALUES (bug27563());
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
connection default;
SET DEBUG_SYNC = 'RESET';
INSERT INTO t1 VALUES(0);
connection con1;
UPDATE t1 SET f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
connection default;
SET DEBUG_SYNC = 'RESET';
INSERT INTO t1 VALUES(1);
connection con1;
DELETE FROM t1 WHERE bug27563() IS NULL;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
connection default;
SET DEBUG_SYNC = 'RESET';
connection con1;
SELECT * FROM t1 WHERE f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION bug27563;
CREATE TABLE t2 (f2 INT);
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
INSERT INTO t2 VALUES(0);
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
INSERT INTO t2 VALUES(1);
END|
connection con1;
INSERT INTO t1 VALUES(2),(3);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
ERROR 70100: Query execution was interrupted
SELECT * FROM t1;
f1
0
1
SELECT * FROM t2;
f2
0
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
#
# Bug#19723: kill of active connection yields different error code
# depending on platform.
#
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
KILL @id;
ERROR 70100: Connection was killed
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
# ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
# depending on the timing of close of the connection socket
SELECT 1;
Got one of the listed errors
SELECT 1;
1
1
SELECT @id != CONNECTION_ID();
@id != CONNECTION_ID()
1
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL;
set global sql_mode=default;
disconnect con1;
disconnect con2;
#
# MDEV-29368 Assertion `trx->mysql_thd == thd' failed in innobase_kill_query from process_timers/timer_handler and use-after-poison in innobase_kill_query
#
connect foo,localhost,root;
create table t1 (a int) engine=innodb;
insert t1 values (1);
set debug_sync='THD_cleanup_after_set_killed SIGNAL go0 WAIT_FOR go1';
set debug_sync='innobase_connection_closed SIGNAL go2 WAIT_FOR go3';
disconnect foo;
connection default;
set debug_sync='now WAIT_FOR go0';
set debug_sync='found_killee SIGNAL go1 WAIT_FOR go2';
kill $id;
set debug_sync='now SIGNAL go3';
drop table t1;
set debug_sync='reset';

View File

@@ -0,0 +1,318 @@
#
# Test KILL and KILL QUERY statements.
#
# Killing a connection in an embedded server does not work like in a normal
# server, if it is waiting for a new statement. In an embedded server, the
# connection does not read() from a socket, but returns control to the
# application. 'mysqltest' does not handle the kill request.
#
-- source include/not_embedded.inc
-- source include/have_debug_sync.inc
-- source include/have_innodb.inc
set local sql_mode="";
set global sql_mode="";
delimiter |;
# Helper function used to repeatedly kill a session.
CREATE FUNCTION MY_KILL(tid INT) RETURNS INT
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
KILL tid;
RETURN (SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = tid);
END|
delimiter ;|
connect con1, localhost, root;
connect con2, localhost, root;
# Save id of con1
connection con1;
--disable_reconnect
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
# Signal when this connection is terminating.
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
# See if we can kill read().
# Run into read() immediately after hitting 'before_do_command_net_read'.
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read';
# Kill con1
connection con2;
SET DEBUG_SYNC='now WAIT_FOR con1_read';
# At this point we have no way to figure out, when con1 is blocked in
# reading from the socket. Sending KILL to early would not terminate
# con1. So we repeat KILL until con1 terminates.
let $wait_condition= SELECT MY_KILL(@id);
--source include/wait_condition.inc
# If KILL missed the read(), sync point wait will time out.
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
--error 1053,2006,2013,5014
SELECT 1;
--enable_reconnect
# this should work, and we should have a new connection_id()
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
#make sure the server is still alive
connection con2;
SELECT 4;
connection default;
--error ER_SUBQUERIES_NOT_SUPPORTED
KILL (SELECT COUNT(*) FROM mysql.user);
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
disable_reconnect;
# Signal when this connection is terminating.
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
# See if we can kill the sync point itself.
# Wait in 'before_do_command_net_read' until killed.
# It doesn't wait for a signal 'kill' but for to be killed.
# The signal name doesn't matter here.
SET DEBUG_SYNC= 'before_do_command_net_read SIGNAL con1_read WAIT_FOR kill';
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_read';
# Repeat KILL until con1 terminates.
let $wait_condition= SELECT MY_KILL(@id);
--source include/wait_condition.inc
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
SET DEBUG_SYNC = 'RESET';
connection con1;
--error 1053,2006,2013,5014
SELECT 1;
enable_reconnect;
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
connection con2;
SELECT 4;
connection default;
#
# BUG#14851: killing long running subquery processed via a temporary table.
#
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE t2 (id INT UNSIGNED NOT NULL);
INSERT INTO t1 VALUES
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0),
(0),(0),(0),(0),(0),(0),(0),(0), (0),(0),(0),(0),(0),(0),(0),(0);
INSERT t1 SELECT 0 FROM t1 AS a1, t1 AS a2 LIMIT 4032;
INSERT INTO t2 SELECT id FROM t1;
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync';
# This is a very long running query. If this test start failing,
# it may be necessary to change to an even longer query.
send SELECT id FROM t1 WHERE id IN
(SELECT DISTINCT a.id FROM t2 a, t2 b, t2 c, t2 d
GROUP BY ACOS(1/a.id), b.id, c.id, d.id
HAVING a.id BETWEEN 10 AND 20);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL @id;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
--error 1317,1053,2006,2013,5014
reap;
SELECT 1;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
#
# Test of blocking of sending ERROR after OK or EOF
#
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
SET DEBUG_SYNC= 'before_acos_function SIGNAL in_sync WAIT_FOR kill';
send SELECT ACOS(0);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
reap;
SELECT 1;
SELECT @id = CONNECTION_ID();
connection default;
SET DEBUG_SYNC = 'RESET';
#
# Bug#27563: Stored functions and triggers wasn't throwing an error when killed.
#
CREATE TABLE t1 (f1 INT);
delimiter |;
CREATE FUNCTION bug27563() RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
RETURN 1;
END|
delimiter ;|
# Test stored functions
# Test INSERT
connection con1;
let $ID= `SELECT @id := CONNECTION_ID()`;
connection con2;
let $ignore= `SELECT @id := $ID`;
connection con1;
send INSERT INTO t1 VALUES (bug27563());
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test UPDATE
INSERT INTO t1 VALUES(0);
connection con1;
send UPDATE t1 SET f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test DELETE
INSERT INTO t1 VALUES(1);
connection con1;
send DELETE FROM t1 WHERE bug27563() IS NULL;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
# Test SELECT
connection con1;
send SELECT * FROM t1 WHERE f1= bug27563();
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION bug27563;
# Test TRIGGERS
CREATE TABLE t2 (f2 INT);
delimiter |;
CREATE TRIGGER trg27563 BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '70100' SET @a:= 'killed';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
INSERT INTO t2 VALUES(0);
SET DEBUG_SYNC= 'now SIGNAL in_sync WAIT_FOR kill';
INSERT INTO t2 VALUES(1);
END|
delimiter ;|
connection con1;
send INSERT INTO t1 VALUES(2),(3);
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
KILL QUERY @id;
connection con1;
--error 1317
reap;
SELECT * FROM t1;
SELECT * FROM t2;
connection default;
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
--echo #
--echo # Bug#19723: kill of active connection yields different error code
--echo # depending on platform.
--echo #
--connection con1
let $ID= `SELECT @id := CONNECTION_ID()`;
SET DEBUG_SYNC= 'thread_end SIGNAL con1_end';
--disable_reconnect
--error ER_CONNECTION_KILLED
KILL @id;
connection con2;
SET DEBUG_SYNC= 'now WAIT_FOR con1_end';
connection con1;
--echo # ER_SERVER_SHUTDOWN, CR_SERVER_GONE_ERROR, CR_SERVER_LOST,
--echo # depending on the timing of close of the connection socket
--error 1053,2006,2013,5014
SELECT 1;
--enable_reconnect
SELECT 1;
let $ignore= `SELECT @id := $ID`;
SELECT @id != CONNECTION_ID();
connection default;
SET DEBUG_SYNC = 'RESET';
DROP FUNCTION MY_KILL;
set global sql_mode=default;
disconnect con1;
disconnect con2;
--echo #
--echo # MDEV-29368 Assertion `trx->mysql_thd == thd' failed in innobase_kill_query from process_timers/timer_handler and use-after-poison in innobase_kill_query
--echo #
connect foo,localhost,root;
let $id=`select connection_id()`;
create table t1 (a int) engine=innodb;
insert t1 values (1);
set debug_sync='THD_cleanup_after_set_killed SIGNAL go0 WAIT_FOR go1';
set debug_sync='innobase_connection_closed SIGNAL go2 WAIT_FOR go3';
disconnect foo;
connection default;
set debug_sync='now WAIT_FOR go0';
set debug_sync='found_killee SIGNAL go1 WAIT_FOR go2';
evalp kill $id;
set debug_sync='now SIGNAL go3';
drop table t1;
set debug_sync='reset';

View File

@@ -1900,18 +1900,18 @@ FLUSH PRIVILEGES;
# #
This installation of MariaDB is already upgraded to MariaDB . This installation of MariaDB is already upgraded to MariaDB .
There is no need to run mysql_upgrade again for MariaDB . There is no need to run mysql_upgrade again for MariaDB .
Looking for 'mysql' as: mysql Looking for 'mariadb' as: mariadb
This installation of MariaDB is already upgraded to MariaDB . This installation of MariaDB is already upgraded to MariaDB .
There is no need to run mysql_upgrade again for MariaDB . There is no need to run mysql_upgrade again for MariaDB .
# #
# MDEV-27279: mariadb_upgrade check-if-upgrade absence is do it # MDEV-27279: mariadb_upgrade check-if-upgrade absence is do it
# #
Looking for 'mysql' as: mysql Looking for 'mariadb' as: mariadb
Empty or non existent ...mysql_upgrade_info. Assuming mysql_upgrade has to be run! Empty or non existent ...mysql_upgrade_info. Assuming mysql_upgrade has to be run!
# #
# MDEV-27279: mariadb_upgrade check-if-upgrade with minor version change # MDEV-27279: mariadb_upgrade check-if-upgrade with minor version change
# #
Looking for 'mysql' as: mysql Looking for 'mariadb' as: mariadb
This installation of MariaDB is already upgraded to MariaDB . This installation of MariaDB is already upgraded to MariaDB .
There is no need to run mysql_upgrade again for MariaDB . There is no need to run mysql_upgrade again for MariaDB .
This installation of MariaDB is already upgraded to MariaDB . This installation of MariaDB is already upgraded to MariaDB .

View File

@@ -55,7 +55,7 @@ DROP USER mysqltest1@'%';
--echo Run mysql_upgrade with a non existing server socket --echo Run mysql_upgrade with a non existing server socket
--replace_result $MYSQLTEST_VARDIR var --replace_result $MYSQLTEST_VARDIR var
--replace_regex /.*mysqlcheck.*: Got/mysqlcheck: Got/ /\([0-9|-]*\)/(errno)/ --replace_regex /.*mariadb-check.*: Got/mariadb-check: Got/ /\([0-9|-]*\)/(errno)/
--error 1 --error 1
# NC: Added --skip-version-check, as the version check would fail when # NC: Added --skip-version-check, as the version check would fail when
# mysql_upgrade tries to get the server version. # mysql_upgrade tries to get the server version.
@@ -139,7 +139,7 @@ let $MYSQLD_DATADIR= `select @@datadir`;
--echo Run mysql_upgrade with unauthorized access --echo Run mysql_upgrade with unauthorized access
--error 1 --error 1
--exec $MYSQL_UPGRADE --skip-verbose --user=root --password=wrong_password 2>&1 --exec $MYSQL_UPGRADE --skip-verbose --user=root --password=wrong_password 2>&1
--replace_regex /.*mysqlcheck.*: Got/mysqlcheck: Got/ /\([0-9|-]*\)/(errno)/ --replace_regex /.*mariadb-check.*: Got/mariadb-check: Got/ /\([0-9|-]*\)/(errno)/
--error 1 --error 1
--exec $MYSQL_UPGRADE --skip-verbose --skip-version-check --user=root --password=wrong_password 2>&1 --exec $MYSQL_UPGRADE --skip-verbose --skip-version-check --user=root --password=wrong_password 2>&1
@@ -290,7 +290,7 @@ FLUSH PRIVILEGES;
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
--error 1 --error 1
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/ --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/
--error 1 --error 1
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
@@ -302,7 +302,7 @@ FLUSH PRIVILEGES;
--replace_regex /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/ --replace_regex /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
--replace_regex /'mysql.* as:[^\n]*/'mysql' as: mysql/ /open .* Assuming/open XXX. Assuming/ /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/ --replace_regex /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/ /open .* Assuming/open XXX. Assuming/ /[^ ]*mysql_upgrade_info/...mysql_upgrade_info/
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
--echo # --echo #
@@ -324,7 +324,7 @@ EOF
--error 1 --error 1
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/ --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mariadb' as: mariadb/
--error 1 --error 1
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
@@ -351,7 +351,7 @@ EOF
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --silent
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB /
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed
--replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mysql.* as:[^\n]*/'mysql' as: mysql/ --replace_regex /\d\d\.\d*\.\d*[^ .\n]*/MariaDB / /'mariadb.* as:[^\n]*/'mysql' as: mysql/
--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose --exec $MYSQL_UPGRADE --check-if-upgrade-is-needed --verbose
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info --remove_file $MYSQLD_DATADIR/mysql_upgrade_info
drop table mysql.global_priv; drop table mysql.global_priv;

View File

@@ -1475,7 +1475,7 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
the required dynamic memory allocated. the required dynamic memory allocated.
*/ */
while (stringcmp(&debug_sync_global.ds_signal, &action->wait_for) && while (stringcmp(&debug_sync_global.ds_signal, &action->wait_for) &&
!thd->killed && opt_debug_sync_timeout) !(thd->killed & KILL_HARD_BIT) && opt_debug_sync_timeout)
{ {
error= mysql_cond_timedwait(&debug_sync_global.ds_cond, error= mysql_cond_timedwait(&debug_sync_global.ds_cond,
&debug_sync_global.ds_mutex, &debug_sync_global.ds_mutex,

View File

@@ -909,15 +909,14 @@ void ha_close_connection(THD* thd)
{ {
for (auto i= 0; i < MAX_HA; i++) for (auto i= 0; i < MAX_HA; i++)
{ {
if (thd->ha_data[i].lock) if (plugin_ref plugin= thd->ha_data[i].lock)
{ {
handlerton *hton= plugin_hton(thd->ha_data[i].lock); thd->ha_data[i].lock= NULL;
handlerton *hton= plugin_hton(plugin);
if (hton->close_connection) if (hton->close_connection)
hton->close_connection(hton, thd); hton->close_connection(hton, thd);
/* make sure SE didn't reset ha_data in close_connection() */
DBUG_ASSERT(thd->ha_data[i].lock);
/* make sure ha_data is reset and ha_data_lock is released */
thd_set_ha_data(thd, hton, 0); thd_set_ha_data(thd, hton, 0);
plugin_unlock(NULL, plugin);
} }
DBUG_ASSERT(!thd->ha_data[i].ha_ptr); DBUG_ASSERT(!thd->ha_data[i].ha_ptr);
} }

View File

@@ -8512,7 +8512,11 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
++num_commits; ++num_commits;
if (current->cache_mngr->using_xa && likely(!current->error) && if (current->cache_mngr->using_xa && likely(!current->error) &&
DBUG_EVALUATE_IF("skip_commit_ordered", 0, 1)) DBUG_EVALUATE_IF("skip_commit_ordered", 0, 1))
{
mysql_mutex_lock(&current->thd->LOCK_thd_data);
run_commit_ordered(current->thd, current->all); run_commit_ordered(current->thd, current->all);
mysql_mutex_unlock(&current->thd->LOCK_thd_data);
}
current->thd->wakeup_subsequent_commits(current->error); current->thd->wakeup_subsequent_commits(current->error);
/* /*

View File

@@ -451,6 +451,7 @@ void thd_storage_lock_wait(THD *thd, long long value)
extern "C" extern "C"
void *thd_get_ha_data(const THD *thd, const struct handlerton *hton) void *thd_get_ha_data(const THD *thd, const struct handlerton *hton)
{ {
DBUG_ASSERT(thd == current_thd || mysql_mutex_is_owner(&thd->LOCK_thd_data));
return thd->ha_data[hton->slot].ha_ptr; return thd->ha_data[hton->slot].ha_ptr;
} }
@@ -1538,6 +1539,8 @@ void THD::cleanup(void)
wsrep_client_thread= false; wsrep_client_thread= false;
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
DEBUG_SYNC(this, "THD_cleanup_after_set_killed");
mysql_ha_cleanup(this); mysql_ha_cleanup(this);
locked_tables_list.unlock_locked_tables(this); locked_tables_list.unlock_locked_tables(this);

View File

@@ -9210,7 +9210,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ
tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY); tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY);
if (!tmp) if (!tmp)
DBUG_RETURN(error); DBUG_RETURN(error);
DEBUG_SYNC(thd, "found_killee");
if (tmp->get_command() != COM_DAEMON) if (tmp->get_command() != COM_DAEMON)
{ {
/* /*

View File

@@ -656,7 +656,7 @@ release_and_exit:
mysql_mutex_unlock(&btr_defragment_mutex); mysql_mutex_unlock(&btr_defragment_mutex);
func_exit: func_exit:
set_current_thd(nullptr); set_current_thd(nullptr);
innobase_destroy_background_thd(thd); destroy_background_thd(thd);
return; return;
} }
item = *btr_defragment_wq.begin(); item = *btr_defragment_wq.begin();

View File

@@ -381,7 +381,7 @@ static void dict_stats_func(void*)
while (dict_stats_process_entry_from_recalc_pool(thd)) {} while (dict_stats_process_entry_from_recalc_pool(thd)) {}
dict_defrag_process_entries_from_defrag_pool(thd); dict_defrag_process_entries_from_defrag_pool(thd);
set_current_thd(nullptr); set_current_thd(nullptr);
innobase_destroy_background_thd(thd); destroy_background_thd(thd);
} }

View File

@@ -2974,7 +2974,7 @@ fts_optimize_shutdown()
&fts_optimize_wq->mutex.m_mutex); &fts_optimize_wq->mutex.m_mutex);
} }
innobase_destroy_background_thd(fts_opt_thd); destroy_background_thd(fts_opt_thd);
fts_opt_thd = NULL; fts_opt_thd = NULL;
pthread_cond_destroy(&fts_opt_shutdown_cond); pthread_cond_destroy(&fts_opt_shutdown_cond);
mysql_mutex_unlock(&fts_optimize_wq->mutex); mysql_mutex_unlock(&fts_optimize_wq->mutex);

View File

@@ -125,7 +125,6 @@ void thd_clear_error(MYSQL_THD thd);
TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len, TABLE *find_fk_open_table(THD *thd, const char *db, size_t db_len,
const char *table, size_t table_len); const char *table, size_t table_len);
MYSQL_THD create_background_thd(); MYSQL_THD create_background_thd();
void destroy_background_thd(MYSQL_THD thd);
void reset_thd(MYSQL_THD thd); void reset_thd(MYSQL_THD thd);
TABLE *get_purge_table(THD *thd); TABLE *get_purge_table(THD *thd);
TABLE *open_purge_table(THD *thd, const char *db, size_t dblen, TABLE *open_purge_table(THD *thd, const char *db, size_t dblen,
@@ -1834,20 +1833,6 @@ THD *innodb_thd_increment_pending_ops(THD *thd)
return thd; return thd;
} }
/** Destroy a background purge thread THD.
@param[in] thd MYSQL_THD to destroy */
void
innobase_destroy_background_thd(
/*============================*/
MYSQL_THD thd)
{
/* need to close the connection explicitly, the server won't do it
if innodb is in the PLUGIN_IS_DYING state */
innobase_close_connection(innodb_hton_ptr, thd);
thd_set_ha_data(thd, innodb_hton_ptr, NULL);
destroy_background_thd(thd);
}
/** Close opened tables, free memory, delete items for a MYSQL_THD. /** Close opened tables, free memory, delete items for a MYSQL_THD.
@param[in] thd MYSQL_THD to reset */ @param[in] thd MYSQL_THD to reset */
void void
@@ -5032,6 +5017,7 @@ static int innobase_close_connection(handlerton *hton, THD *thd)
DBUG_ASSERT(hton == innodb_hton_ptr); DBUG_ASSERT(hton == innodb_hton_ptr);
if (auto trx= thd_to_trx(thd)) if (auto trx= thd_to_trx(thd))
{ {
thd_set_ha_data(thd, innodb_hton_ptr, NULL);
if (trx->state == TRX_STATE_PREPARED && trx->has_logged_persistent()) if (trx->state == TRX_STATE_PREPARED && trx->has_logged_persistent())
{ {
trx_disconnect_prepared(trx); trx_disconnect_prepared(trx);
@@ -5039,6 +5025,7 @@ static int innobase_close_connection(handlerton *hton, THD *thd)
} }
innobase_rollback_trx(trx); innobase_rollback_trx(trx);
trx->free(); trx->free();
DEBUG_SYNC(thd, "innobase_connection_closed");
} }
return 0; return 0;
} }

View File

@@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2006, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2021, MariaDB Corporation. Copyright (c) 2017, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@@ -460,10 +460,9 @@ normalize_table_name_c_low(
@return new MYSQL_THD */ @return new MYSQL_THD */
MYSQL_THD innobase_create_background_thd(const char* name); MYSQL_THD innobase_create_background_thd(const char* name);
/** Destroy a background purge thread THD. /** Destroy a THD object associated with a background task.
@param[in] thd MYSQL_THD to destroy */ @param[in] thd MYSQL_THD to destroy */
void void destroy_background_thd(MYSQL_THD thd);
innobase_destroy_background_thd(MYSQL_THD);
/** Close opened tables, free memory, delete items for a MYSQL_THD. /** Close opened tables, free memory, delete items for a MYSQL_THD.
@param[in] thd MYSQL_THD to reset */ @param[in] thd MYSQL_THD to reset */

View File

@@ -1925,7 +1925,7 @@ static void srv_shutdown_purge_tasks()
std::unique_lock<std::mutex> lk(purge_thd_mutex); std::unique_lock<std::mutex> lk(purge_thd_mutex);
while (!purge_thds.empty()) while (!purge_thds.empty())
{ {
innobase_destroy_background_thd(purge_thds.front()); destroy_background_thd(purge_thds.front());
purge_thds.pop_front(); purge_thds.pop_front();
} }
n_purge_thds= 0; n_purge_thds= 0;