Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
75f0c595
Commit
75f0c595
authored
Nov 09, 2021
by
Marko Mäkelä
Browse files
Options
Browse Files
Download
Plain Diff
Merge mariadb-10.2.41 into 10.2
parents
7c30bc38
561b6c7e
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
477 additions
and
277 deletions
+477
-277
mysql-test/suite/galera/r/galera_UK_conflict.result
mysql-test/suite/galera/r/galera_UK_conflict.result
+7
-0
mysql-test/suite/galera/r/galera_ssl_upgrade.result
mysql-test/suite/galera/r/galera_ssl_upgrade.result
+6
-4
mysql-test/suite/galera/r/galera_to_error.result
mysql-test/suite/galera/r/galera_to_error.result
+30
-0
mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result
mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result
+0
-16
mysql-test/suite/galera/t/galera_UK_conflict.test
mysql-test/suite/galera/t/galera_UK_conflict.test
+4
-0
mysql-test/suite/galera/t/galera_ssl_upgrade.test
mysql-test/suite/galera/t/galera_ssl_upgrade.test
+7
-3
mysql-test/suite/galera/t/galera_to_error.test
mysql-test/suite/galera/t/galera_to_error.test
+71
-0
mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test
mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test
+5
-9
mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test
...-test/suite/galera/t/galera_var_auto_inc_control_off.test
+2
-0
mysql-test/suite/wsrep/t/variables.test
mysql-test/suite/wsrep/t/variables.test
+3
-3
sql/sql_class.cc
sql/sql_class.cc
+13
-9
sql/sql_parse.cc
sql/sql_parse.cc
+37
-1
sql/wsrep_mysqld.cc
sql/wsrep_mysqld.cc
+44
-10
sql/wsrep_thd.cc
sql/wsrep_thd.cc
+7
-3
storage/connect/colblk.h
storage/connect/colblk.h
+1
-1
storage/connect/mysql-test/connect/t/mongo.inc
storage/connect/mysql-test/connect/t/mongo.inc
+10
-2
storage/connect/odbconn.cpp
storage/connect/odbconn.cpp
+4
-5
storage/connect/tabbson.cpp
storage/connect/tabbson.cpp
+13
-8
storage/connect/tabbson.h
storage/connect/tabbson.h
+2
-0
storage/innobase/handler/ha_innodb.cc
storage/innobase/handler/ha_innodb.cc
+205
-184
storage/innobase/include/ha_prototypes.h
storage/innobase/include/ha_prototypes.h
+1
-2
storage/innobase/lock/lock0wait.cc
storage/innobase/lock/lock0wait.cc
+2
-16
storage/tokudb/PerconaFT/portability/toku_pthread.cc
storage/tokudb/PerconaFT/portability/toku_pthread.cc
+3
-1
No files found.
mysql-test/suite/galera/r/galera_UK_conflict.result
View file @
75f0c595
...
...
@@ -68,6 +68,9 @@ f1 f2 f3
10 10 0
INSERT INTO t1 VALUES (7,7,7);
INSERT INTO t1 VALUES (8,8,8);
SELECT COUNT(*) FROM t1;
COUNT(*)
7
SELECT * FROM t1;
f1 f2 f3
1 1 0
...
...
@@ -78,6 +81,9 @@ f1 f2 f3
8 8 8
10 10 0
connection node_1;
SELECT COUNT(*) FROM t1;
COUNT(*)
7
SELECT * FROM t1;
f1 f2 f3
1 1 0
...
...
@@ -85,5 +91,6 @@ f1 f2 f3
4 4 2
5 5 2
7 7 7
8 8 8
10 10 0
DROP TABLE t1;
mysql-test/suite/galera/r/galera_ssl_upgrade.result
View file @
75f0c595
connection node_1;
call mtr.add_suppression("WSREP: write_handler()
: protocol is shutdown
.*");
call mtr.add_suppression("WSREP: write_handler().*");
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_2;
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';
VARIABLE_VALUE = 2
1
disconnect node_2;
disconnect node_1;
connection node_1;
call mtr.add_suppression("WSREP: write_handler().*");
connection node_2;
call mtr.add_suppression("WSREP: write_handler():.*");
mysql-test/suite/galera/r/galera_to_error.result
0 → 100644
View file @
75f0c595
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;
mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result
View file @
75f0c595
...
...
@@ -21,22 +21,6 @@ connection node_1a;
connection node_1b;
connection node_2;
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 parent;
DROP TABLE ten;
mysql-test/suite/galera/t/galera_UK_conflict.test
View file @
75f0c595
...
...
@@ -140,9 +140,13 @@ SELECT * FROM t1;
# original state in node 1
INSERT
INTO
t1
VALUES
(
7
,
7
,
7
);
INSERT
INTO
t1
VALUES
(
8
,
8
,
8
);
SELECT
COUNT
(
*
)
FROM
t1
;
SELECT
*
FROM
t1
;
--
connection
node_1
--
let
$wait_condition
=
SELECT
COUNT
(
*
)
=
7
FROM
t1
--
source
include
/
wait_condition
.
inc
SELECT
COUNT
(
*
)
FROM
t1
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
mysql-test/suite/galera/t/galera_ssl_upgrade.test
View file @
75f0c595
...
...
@@ -9,9 +9,9 @@
--
source
include
/
have_ssl_communication
.
inc
--
connection
node_1
call
mtr
.
add_suppression
(
"WSREP: write_handler()
: protocol is shutdown
.*"
);
call
mtr
.
add_suppression
(
"WSREP: write_handler().*"
);
--
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.
--
let
$node_1
=
node_1
...
...
@@ -72,4 +72,8 @@ SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N
# Restore original auto_increment_offset values.
--
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():.*"
);
mysql-test/suite/galera/t/galera_to_error.test
0 → 100644
View file @
75f0c595
#
# 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
mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test
View file @
75f0c595
...
...
@@ -54,15 +54,11 @@ INSERT INTO parent VALUES (1, 0);
--
connection
node_2a
--
reap
--
connection
node_1
SET
SESSION
wsrep_sync_wait
=
15
;
SELECT
COUNT
(
*
)
FROM
parent
;
SELECT
COUNT
(
*
)
FROM
child
;
--
connection
node_2
SET
SESSION
wsrep_sync_wait
=
15
;
SELECT
COUNT
(
*
)
FROM
parent
;
SELECT
COUNT
(
*
)
FROM
child
;
#
# ALTER TABLE could bf kill one or more of INSERTs to parent, so
# the actual number of rows in PARENT depends on whether
# the INSERT is committed before ALTER TABLE is executed
#
DROP
TABLE
child
;
DROP
TABLE
parent
;
...
...
mysql-test/suite/galera/t/galera_var_auto_inc_control_off.test
View file @
75f0c595
...
...
@@ -94,11 +94,13 @@ SELECT * FROM t1;
--
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_offset
=
$auto_increment_offset_node1
--
disconnect
node_1a
--
connection
node_2
--
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_offset
=
$auto_increment_offset_node2
--
disconnect
node_2a
--
enable_query_log
...
...
mysql-test/suite/wsrep/t/variables.test
View file @
75f0c595
...
...
@@ -66,7 +66,7 @@ call mtr.add_suppression("WSREP: Failed to get provider options");
#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_slave_threads
;
SELECT
@@
global
.
wsrep_cluster_address
;
...
...
@@ -77,7 +77,7 @@ SHOW STATUS LIKE 'wsrep_thread_count';
#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_cluster_address
;
SELECT
@@
global
.
wsrep_on
;
...
...
@@ -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_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_cluster_address
;
SELECT
@@
global
.
wsrep_on
;
...
...
sql/sql_class.cc
View file @
75f0c595
...
...
@@ -1863,6 +1863,7 @@ bool THD::notify_shared_lock(MDL_context_owner *ctx_in_use,
if
(
needs_thr_lock_abort
)
{
bool
mutex_released
=
false
;
mysql_mutex_lock
(
&
in_use
->
LOCK_thd_data
);
/* If not already dying */
if
(
in_use
->
killed
!=
KILL_CONNECTION_HARD
)
...
...
@@ -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).
*/
if
(
!
thd_table
->
needs_reopen
())
{
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
);
}
...
...
sql/sql_parse.cc
View file @
75f0c595
/* Copyright (c) 2000, 2017, Oracle and/or its affiliates.
Copyright (c) 2008, 202
0
, MariaDB
Copyright (c) 2008, 202
1
, MariaDB
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
...
...
@@ -9069,6 +9069,18 @@ static
void
sql_kill
(
THD
*
thd
,
longlong
id
,
killed_state
state
,
killed_type
type
)
{
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
(
!
thd
->
killed
)
...
...
@@ -9078,6 +9090,13 @@ void sql_kill(THD *thd, longlong id, killed_state state, killed_type type)
}
else
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)
{
uint
error
;
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
)))
my_ok
(
thd
,
rows
);
else
...
...
@@ -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
);
}
#ifdef WITH_WSREP
return
;
wsrep_error_label:
my_error
(
ER_CANNOT_USER
,
MYF
(
0
),
user
?
user
->
user
.
str
:
"NULL"
);
#endif
/* WITH_WSREP */
}
...
...
sql/wsrep_mysqld.cc
View file @
75f0c595
/* Copyright 2008-20
15
Codership Oy <http://www.codership.com>
/* Copyright 2008-20
21
Codership Oy <http://www.codership.com>
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
...
...
@@ -835,13 +835,25 @@ void wsrep_thr_init()
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
)
{
if
(
wsrep_init
())
unireg_abort
(
1
);
wsrep_thr_lock_init
(
(
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_on_fun
)
wsrep_on
);
...
...
@@ -1694,6 +1706,11 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
case
SQLCOM_DROP_TABLE
:
buf_err
=
wsrep_drop_table_query
(
thd
,
&
buf
,
&
buf_len
);
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
:
if
(
sp_process_definer
(
thd
))
{
...
...
@@ -2058,8 +2075,13 @@ bool wsrep_grant_mdl_exception(MDL_context *requestor_ctx,
ticket
->
wsrep_report
(
true
);
}
mysql_mutex_unlock
(
&
granted_thd
->
LOCK_thd_data
);
wsrep_abort_thd
((
void
*
)
request_thd
,
(
void
*
)
granted_thd
,
1
);
/* This will call wsrep_abort_transaction so we should hold
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
;
}
}
...
...
@@ -2241,6 +2263,7 @@ pthread_handler_t start_wsrep_THD(void *arg)
static
bool
abort_replicated
(
THD
*
thd
)
{
bool
ret_code
=
false
;
mysql_mutex_lock
(
&
thd
->
LOCK_thd_data
);
if
(
thd
->
wsrep_query_state
==
QUERY_COMMITTING
)
{
WSREP_DEBUG
(
"aborting replicated trx: %llu"
,
(
ulonglong
)(
thd
->
real_id
));
...
...
@@ -2248,6 +2271,8 @@ static bool abort_replicated(THD *thd)
(
void
)
wsrep_abort_thd
(
thd
,
thd
,
TRUE
);
ret_code
=
true
;
}
else
mysql_mutex_unlock
(
&
thd
->
LOCK_thd_data
);
return
ret_code
;
}
...
...
@@ -2294,6 +2319,8 @@ static bool have_client_connections()
(
longlong
)
tmp
->
thread_id
));
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
);
return
true
;
}
...
...
@@ -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"
,
(
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. */
if
(
!
is_client_connection
(
tmp
))
continue
;
...
...
@@ -2394,15 +2423,18 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
continue
;
}
/* replicated transactions must be skipped */
/* replicated transactions must be skipped and aborted
with wsrep_abort_thd. */
if
(
abort_replicated
(
tmp
))
continue
;
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
);
tmp
->
awake
(
KILL_CONNECTION
);
...
...
@@ -2423,7 +2455,6 @@ void wsrep_close_client_connections(my_bool wait_to_end, THD *except_caller_thd)
I_List_iterator
<
THD
>
it2
(
threads
);
while
((
tmp
=
it2
++
))
{
#ifndef __bsdi__ // Bug in BSDI kernel
if
(
is_client_connection
(
tmp
)
&&
!
abort_replicated
(
tmp
)
&&
!
is_replaying_connection
(
tmp
)
&&
...
...
@@ -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
);
close_connection
(
tmp
,
0
);
}
#endif
}
DBUG_PRINT
(
"quit"
,(
"Waiting for threads to die (count=%u)"
,
thread_count
));
...
...
@@ -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
)
{
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)
{
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
);
}
else
...
...
sql/wsrep_thd.cc
View file @
75f0c595
/* 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
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)
int
wsrep_abort_thd
(
void
*
bf_thd_ptr
,
void
*
victim_thd_ptr
,
my_bool
signal
)
{
THD
*
victim_thd
=
(
THD
*
)
victim_thd_ptr
;
THD
*
bf_thd
=
(
THD
*
)
bf_thd_ptr
;
THD
*
victim_thd
=
(
THD
*
)
victim_thd_ptr
;
THD
*
bf_thd
=
(
THD
*
)
bf_thd_ptr
;
DBUG_ENTER
(
"wsrep_abort_thd"
);
mysql_mutex_assert_owner
(
&
victim_thd
->
LOCK_thd_data
);
if
(
(
WSREP
(
bf_thd
)
||
(
(
WSREP_ON
||
bf_thd
->
variables
.
wsrep_OSU_method
==
WSREP_OSU_RSU
)
&&
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)
"aborted. Ignoring."
,
(
bf_thd
)
?
(
long
long
)
bf_thd
->
real_id
:
0
,
(
long
long
)
victim_thd
->
real_id
);
mysql_mutex_unlock
(
&
victim_thd
->
LOCK_thd_data
);
DBUG_RETURN
(
1
);
}
...
...
@@ -831,6 +834,7 @@ int wsrep_abort_thd(void *bf_thd_ptr, void *victim_thd_ptr, my_bool signal)
else
{
WSREP_DEBUG
(
"wsrep_abort_thd not effective: %p %p"
,
bf_thd
,
victim_thd
);
mysql_mutex_unlock
(
&
victim_thd
->
LOCK_thd_data
);
}
DBUG_RETURN
(
1
);
...
...
storage/connect/colblk.h
View file @
75f0c595
/*************** Colblk H Declares Source Code File (.H) ***************/
/* Name: COLBLK.H Version 1.7 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2005-201
5
*/
/* (C) Copyright to the author Olivier BERTRAND 2005-201
9
*/
/* */
/* This file contains the COLBLK and derived classes declares. */
/***********************************************************************/
...
...
storage/connect/mysql-test/connect/t/mongo.inc
View file @
75f0c595
let
$MONGO
=
C
:/
Applic
/
MongoDB
/
Server
/
3.6
/
bin
/
mongo
;
let
$MONGOIMPORT
=
C
:/
Applic
/
MongoDB
/
Server
/
3.6
/
bin
/
mongoimport
;
#let $MONGO= C:/Applic/MongoDB/Server/3.6/bin/mongo;
#let $MONGOIMPORT= C:/Applic/MongoDB/Server/3.6/bin/mongoimport;
let
$MONGO
=
mongo
;
let
$MONGOIMPORT
=
mongoimport
;
storage/connect/odbconn.cpp
View file @
75f0c595
/***********************************************************************/
/* Name: ODBCONN.CPP Version 2.
3
*/
/* Name: ODBCONN.CPP Version 2.
4
*/
/* */
/* (C) Copyright to the author Olivier BERTRAND 1998-20
17
*/
/* (C) Copyright to the author Olivier BERTRAND 1998-20
21
*/
/* */
/* This file contains the ODBC connection classes functions. */
/***********************************************************************/
...
...
@@ -1509,7 +1509,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols)
ThrowDBX
(
MSG
(
COL_NUM_MISM
));
// 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
())
{
buffer
=
colp
->
GetBuffer
(
m_RowsetSize
);
len
=
colp
->
GetBuflen
();
...
...
@@ -1525,12 +1525,11 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols)
htrc
(
"Binding col=%u type=%d buf=%p len=%d slen=%p
\n
"
,
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
))
ThrowDBX
(
rc
,
"SQLBindCol"
,
hstmt
);
n
++
;
}
// endif pcol
}
catch
(
DBX
*
x
)
{
...
...
storage/connect/tabbson.cpp
View file @
75f0c595
...
...
@@ -376,7 +376,7 @@ int BSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt)
}
// endswitch ReadDB
}
else
jsp
=
bp
->
Get
ArrayValue
(
bdp
,
i
);
jsp
=
bp
->
Get
Next
(
jsp
);
if
(
!
(
row
=
(
jsp
)
?
bp
->
GetObject
(
jsp
)
:
NULL
))
break
;
...
...
@@ -2185,7 +2185,9 @@ void BSONCOL::WriteColumn(PGLOBAL g)
TDBBSON
::
TDBBSON
(
PGLOBAL
g
,
PBDEF
tdp
,
PTXF
txfp
)
:
TDBBSN
(
g
,
tdp
,
txfp
)
{
Docp
=
NULL
;
Docrow
=
NULL
;
Multiple
=
tdp
->
Multiple
;
Docsize
=
0
;
Done
=
Changed
=
false
;
Bp
->
SetPretty
(
2
);
}
// end of TDBBSON standard constructor
...
...
@@ -2193,7 +2195,9 @@ TDBBSON::TDBBSON(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBBSN(g, tdp, txfp)
TDBBSON
::
TDBBSON
(
PBTDB
tdbp
)
:
TDBBSN
(
tdbp
)
{
Docp
=
tdbp
->
Docp
;
Docrow
=
tdbp
->
Docrow
;
Multiple
=
tdbp
->
Multiple
;
Docsize
=
tdbp
->
Docsize
;
Done
=
tdbp
->
Done
;
Changed
=
tdbp
->
Changed
;
}
// end of TDBBSON copy constructor
...
...
@@ -2374,6 +2378,7 @@ int TDBBSON::MakeDocument(PGLOBAL g)
}
// endif jsp
Docsize
=
Bp
->
GetSize
(
Docp
);
Done
=
true
;
return
RC_OK
;
}
// end of MakeDocument
...
...
@@ -2388,7 +2393,7 @@ int TDBBSON::Cardinality(PGLOBAL g)
else
if
(
Cardinal
<
0
)
{
if
(
!
Multiple
)
{
if
(
MakeDocument
(
g
)
==
RC_OK
)
Cardinal
=
Bp
->
GetSize
(
Docp
)
;
Cardinal
=
Docsize
;
}
else
return
10
;
...
...
@@ -2417,6 +2422,7 @@ void TDBBSON::ResetSize(void)
MaxSize
=
Cardinal
=
-
1
;
Fpos
=
-
1
;
N
=
0
;
Docrow
=
NULL
;
Done
=
false
;
}
// end of ResetSize
...
...
@@ -2475,6 +2481,7 @@ bool TDBBSON::SetRecpos(PGLOBAL, int recpos)
#endif // 0
Fpos
=
recpos
-
1
;
Docrow
=
NULL
;
return
false
;
}
// end of SetRecpos
...
...
@@ -2490,6 +2497,7 @@ bool TDBBSON::OpenDB(PGLOBAL g)
Fpos
=
-
1
;
NextSame
=
false
;
SameRow
=
0
;
Docrow
=
NULL
;
return
false
;
}
// endif use
...
...
@@ -2530,12 +2538,9 @@ int TDBBSON::ReadDB(PGLOBAL)
NextSame
=
false
;
M
++
;
rc
=
RC_OK
;
}
else
if
(
++
Fpos
<
(
signed
)
Bp
->
GetSize
(
Docp
))
{
Row
=
Bp
->
GetArrayValue
(
Docp
,
Fpos
);
if
(
Row
->
Type
==
TYPE_JVAL
)
Row
=
Bp
->
GetBson
(
Row
);
}
else
if
(
++
Fpos
<
Docsize
)
{
Docrow
=
(
Docrow
)
?
Bp
->
GetNext
(
Docrow
)
:
Bp
->
GetArrayValue
(
Docp
,
Fpos
);
Row
=
(
Docrow
->
Type
==
TYPE_JVAL
)
?
Bp
->
GetBson
(
Docrow
)
:
Docrow
;
SameRow
=
0
;
M
=
1
;
rc
=
RC_OK
;
...
...
storage/connect/tabbson.h
View file @
75f0c595
...
...
@@ -318,7 +318,9 @@ class DllExport TDBBSON : public TDBBSN {
// Members
PBVAL
Docp
;
// The document array
PBVAL
Docrow
;
// Document row
int
Multiple
;
// 0: No 1: DIR 2: Section 3: filelist
int
Docsize
;
// The document size
bool
Done
;
// True when document parsing is done
bool
Changed
;
// After Update, Insert or Delete
};
// end of class TDBBSON
...
...
storage/innobase/handler/ha_innodb.cc
View file @
75f0c595
This diff is collapsed.
Click to expand it.
storage/innobase/include/ha_prototypes.h
View file @
75f0c595
...
...
@@ -233,12 +233,11 @@ innobase_casedn_str(
char
*
a
);
/*!< in/out: string to put in lower case */
#ifdef WITH_WSREP
UNIV_INTERN
void
wsrep_innobase_kill_one_trx
(
MYSQL_THD
const
thd_ptr
,
const
trx_t
*
const
bf_trx
,
trx_t
*
victim_trx
,
i
bool
signal
);
my_
bool
signal
);
int
wsrep_innobase_mysql_sort
(
int
mysql_type
,
uint
charset_number
,
unsigned
char
*
str
,
unsigned
int
str_length
,
unsigned
int
buf_length
);
...
...
storage/innobase/lock/lock0wait.cc
View file @
75f0c595
...
...
@@ -184,13 +184,11 @@ lock_wait_table_reserve_slot(
check if lock timeout was for priority thread,
as a side effect trigger lock monitor
@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 */
static
bool
wsrep_is_BF_lock_timeout
(
const
trx_t
*
trx
,
bool
locked
=
true
)
const
trx_t
*
trx
)
{
bool
long_wait
=
(
trx
->
error_state
!=
DB_DEADLOCK
&&
trx
->
is_wsrep
()
&&
...
...
@@ -204,18 +202,6 @@ wsrep_is_BF_lock_timeout(
ib
::
info
()
<<
"WSREP: BF lock wait long for trx:"
<<
trx
->
id
<<
" 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
;
}
else
return
false
;
...
...
@@ -407,7 +393,7 @@ lock_wait_suspend_thread(
&&
wait_time
>
(
double
)
lock_wait_timeout
#ifdef WITH_WSREP
&&
(
!
trx
->
is_wsrep
()
||
(
!
wsrep_is_BF_lock_timeout
(
trx
,
false
)
||
(
!
wsrep_is_BF_lock_timeout
(
trx
)
&&
trx
->
error_state
!=
DB_DEADLOCK
))
#endif
/* WITH_WSREP */
)
{
...
...
storage/tokudb/PerconaFT/portability/toku_pthread.cc
View file @
75f0c595
...
...
@@ -55,7 +55,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
#include <toku_pthread.h>
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)
return
pthread_yield
();
# elif defined(PTHREAD_YIELD_RETURNS_VOID)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment