summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-08-26 08:46:57 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-08-26 08:46:57 +0300
commit87ff4ba7c874ccb8a5b1105571569a94ca959d53 (patch)
treea3dfd317697d7f698c5c5e3e3d7b3a7a3b4d181a
parentbd3eb528512dfbb99a57033ff3bf7e09069c0d4e (diff)
parentdc6bc85cd29586631d927036451d955c7013206c (diff)
downloadmariadb-git-87ff4ba7c874ccb8a5b1105571569a94ca959d53.tar.gz
Merge 10.4 into 10.5
-rw-r--r--mysql-test/suite/galera/r/galera_split_brain.result3
-rw-r--r--mysql-test/suite/galera/t/galera_split_brain.test3
-rw-r--r--plugin/auth_pam/CMakeLists.txt14
-rw-r--r--sql/handler.cc2
-rw-r--r--sql/sql_insert.cc4
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/wsrep_client_service.cc6
-rw-r--r--sql/wsrep_high_priority_service.cc23
-rw-r--r--sql/wsrep_mysqld.cc44
-rw-r--r--sql/wsrep_mysqld.h4
-rw-r--r--sql/wsrep_thd.cc15
-rw-r--r--sql/wsrep_thd.h6
-rw-r--r--sql/wsrep_var.cc4
-rw-r--r--storage/maria/test_ma_backup.c7
14 files changed, 90 insertions, 49 deletions
diff --git a/mysql-test/suite/galera/r/galera_split_brain.result b/mysql-test/suite/galera/r/galera_split_brain.result
index bd8c3a5bc44..08f9060d2a9 100644
--- a/mysql-test/suite/galera/r/galera_split_brain.result
+++ b/mysql-test/suite/galera/r/galera_split_brain.result
@@ -7,8 +7,9 @@ connection node_1;
connection node_2;
Killing server ...
connection node_1;
+SET SESSION lock_wait_timeout= 3;
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
-ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
connection node_2;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
disconnect node_2;
diff --git a/mysql-test/suite/galera/t/galera_split_brain.test b/mysql-test/suite/galera/t/galera_split_brain.test
index 6a822b8f127..ccdfd3fd506 100644
--- a/mysql-test/suite/galera/t/galera_split_brain.test
+++ b/mysql-test/suite/galera/t/galera_split_brain.test
@@ -22,7 +22,8 @@ call mtr.add_suppression("WSREP: TO isolation failed for: ");
--source include/kill_galera.inc
--connection node_1
---error ER_LOCK_DEADLOCK
+SET SESSION lock_wait_timeout= 3;
+--error ER_LOCK_WAIT_TIMEOUT
CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB;
# Reset the master and restart the slave so that post-test checks can run
diff --git a/plugin/auth_pam/CMakeLists.txt b/plugin/auth_pam/CMakeLists.txt
index 92e7b676e57..5b2ca3c708a 100644
--- a/plugin/auth_pam/CMakeLists.txt
+++ b/plugin/auth_pam/CMakeLists.txt
@@ -38,14 +38,10 @@ IF(HAVE_PAM_APPL_H AND HAVE_GETGROUPLIST)
IF (TARGET auth_pam)
MYSQL_ADD_EXECUTABLE(auth_pam_tool auth_pam_tool.c DESTINATION ${INSTALL_PLUGINDIR}/auth_pam_tool_dir COMPONENT Server)
TARGET_LINK_LIBRARIES(auth_pam_tool pam)
- INSTALL(CODE "EXECUTE_PROCESS(
- COMMAND chmod u=rwx,g=,o= auth_pam_tool_dir
- WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINDIR}/)"
- COMPONENT Server)
- INSTALL(CODE "EXECUTE_PROCESS(
- COMMAND chmod u=rwxs,g=rx,o=rx auth_pam_tool_dir/auth_pam_tool
- WORKING_DIRECTORY \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${INSTALL_PLUGINDIR}/)"
- COMPONENT Server)
+ SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST}
+ "%attr(700, -, -) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir"
+ "%attr(4755, -, -) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir/auth_pam_tool")
+ SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} PARENT_SCOPE)
ENDIF()
IF(TARGET auth_pam OR TARGET auth_pam_v1)
ADD_SUBDIRECTORY(testing)
@@ -55,7 +51,7 @@ IF(HAVE_PAM_APPL_H AND HAVE_GETGROUPLIST)
IF(INSTALL_PAMDIR)
INSTALL(TARGETS pam_user_map DESTINATION ${INSTALL_PAMDIR} COMPONENT Server)
INSTALL(FILES mapper/user_map.conf DESTINATION ${INSTALL_PAMDATADIR} COMPONENT Server)
- SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} "%config(noreplace) ${INSTALL_PAMDATADIR}/*" PARENT_SCOPE)
+ SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} "%config(noreplace) ${INSTALL_PAMDATADIRABS}/*" PARENT_SCOPE)
ENDIF()
ENDIF()
ENDIF()
diff --git a/sql/handler.cc b/sql/handler.cc
index 7e5975d7477..9cf270f9cf3 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2088,7 +2088,7 @@ int ha_rollback_trans(THD *thd, bool all)
if (thd->is_error())
{
WSREP_DEBUG("ha_rollback_trans(%lld, %s) rolled back: %s: %s; is_real %d",
- thd->thread_id, all?"TRUE":"FALSE", WSREP_QUERY(thd),
+ thd->thread_id, all?"TRUE":"FALSE", wsrep_thd_query(thd),
thd->get_stmt_da()->message(), is_real_trans);
}
(void) wsrep_after_rollback(thd, all);
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index c1cb45d5d69..9aee69b9a50 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2000, 2016, Oracle and/or its affiliates.
- Copyright (c) 2010, 2019, MariaDB Corporation
+ Copyright (c) 2010, 2021, MariaDB Corporation
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
@@ -5009,7 +5009,7 @@ bool select_create::send_eof()
{
WSREP_DEBUG("select_create commit failed, thd: %llu err: %s %s",
thd->thread_id,
- wsrep_thd_transaction_state_str(thd), WSREP_QUERY(thd));
+ wsrep_thd_transaction_state_str(thd), wsrep_thd_query(thd));
mysql_mutex_unlock(&thd->LOCK_thd_data);
abort_result_set();
DBUG_RETURN(true);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 64aca9fb87d..5a2897868a0 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -7949,7 +7949,7 @@ static bool wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act)));
});
WSREP_DEBUG("wsrep retrying AC query: %lu %s",
- thd->wsrep_retry_counter, WSREP_QUERY(thd));
+ thd->wsrep_retry_counter, wsrep_thd_query(thd));
wsrep_prepare_for_autocommit_retry(thd, rawbuf, length, parser_state);
if (thd->lex->explain)
delete_explain_query(thd->lex);
@@ -7963,7 +7963,7 @@ static bool wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
is_autocommit,
thd->wsrep_retry_counter,
thd->variables.wsrep_retry_autocommit,
- WSREP_QUERY(thd));
+ wsrep_thd_query(thd));
my_error(ER_LOCK_DEADLOCK, MYF(0));
thd->reset_kill_query();
thd->wsrep_retry_counter= 0; // reset
diff --git a/sql/wsrep_client_service.cc b/sql/wsrep_client_service.cc
index 3eb457a01f3..a7480aaddb8 100644
--- a/sql/wsrep_client_service.cc
+++ b/sql/wsrep_client_service.cc
@@ -1,4 +1,4 @@
-/* Copyright 2018 Codership Oy <info@codership.com>
+/* Copyright 2018-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
@@ -108,14 +108,14 @@ int Wsrep_client_service::prepare_data_for_replication()
"affected rows: %llu, "
"changed tables: %d, "
"sql_log_bin: %d",
- WSREP_QUERY(m_thd),
+ wsrep_thd_query(m_thd),
m_thd->get_stmt_da()->affected_rows(),
stmt_has_updated_trans_table(m_thd),
m_thd->variables.sql_log_bin);
}
else
{
- WSREP_DEBUG("empty rbr buffer, query: %s", WSREP_QUERY(m_thd));
+ WSREP_DEBUG("empty rbr buffer, query: %s", wsrep_thd_query(m_thd));
}
}
DBUG_RETURN(0);
diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc
index a75882214cc..1f6537a1351 100644
--- a/sql/wsrep_high_priority_service.cc
+++ b/sql/wsrep_high_priority_service.cc
@@ -1,4 +1,4 @@
-/* Copyright 2018 Codership Oy <info@codership.com>
+/* Copyright 2018-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
@@ -403,6 +403,16 @@ int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta,
WSREP_DEBUG("Wsrep_high_priority_service::apply_toi: %lld",
client_state.toi_meta().seqno().get());
+ DBUG_EXECUTE_IF("sync.wsrep_apply_toi",
+ {
+ const char act[]=
+ "now "
+ "SIGNAL sync.wsrep_apply_toi_reached "
+ "WAIT_FOR signal.wsrep_apply_toi";
+ DBUG_ASSERT(!debug_sync_set_action(thd,
+ STRING_WITH_LEN(act)));
+ };);
+
int ret= apply_events(thd, m_rli, data, err);
wsrep_thd_set_ignored_error(thd, false);
trans_commit(thd);
@@ -447,6 +457,15 @@ int Wsrep_high_priority_service::log_dummy_write_set(const wsrep::ws_handle& ws_
DBUG_PRINT("info",
("Wsrep_high_priority_service::log_dummy_write_set: seqno=%lld",
ws_meta.seqno().get()));
+ DBUG_EXECUTE_IF("sync.wsrep_log_dummy_write_set",
+ {
+ const char act[]=
+ "now "
+ "SIGNAL sync.wsrep_log_dummy_write_set_reached ";
+ DBUG_ASSERT(!debug_sync_set_action(m_thd,
+ STRING_WITH_LEN(act)));
+ };);
+
if (ws_meta.ordered())
{
wsrep::client_state& cs(m_thd->wsrep_cs());
@@ -680,7 +699,7 @@ Wsrep_replayer_service::~Wsrep_replayer_service()
DBUG_ASSERT(0);
WSREP_ERROR("trx_replay failed for: %d, schema: %s, query: %s",
m_replay_status,
- orig_thd->db.str, WSREP_QUERY(orig_thd));
+ orig_thd->db.str, wsrep_thd_query(orig_thd));
unireg_abort(1);
}
}
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 524410152ca..56b92df65b3 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -1,4 +1,4 @@
-/* Copyright 2008-2015 Codership Oy <http://www.codership.com>
+/* Copyright 2008-2021 Codership Oy <http://www.codership.com>
Copyright (c) 2020, 2021, MariaDB
This program is free software; you can redistribute it and/or modify
@@ -2255,12 +2255,29 @@ static int wsrep_TOI_begin(THD *thd, const char *db, const char *table,
wsrep_thd_query(thd));
my_error(ER_ERROR_DURING_COMMIT, MYF(0), WSREP_SIZE_EXCEEDED);
break;
+ case wsrep::e_deadlock_error:
+ WSREP_WARN("TO isolation failed for: %d, schema: %s, sql: %s. "
+ "Deadlock error.",
+ ret,
+ (thd->db.str ? thd->db.str : "(null)"),
+ wsrep_thd_query(thd));
+ my_error(ER_LOCK_DEADLOCK, MYF(0));
+ break;
+ case wsrep::e_timeout_error:
+ WSREP_WARN("TO isolation failed for: %d, schema: %s, sql: %s. "
+ "Operation timed out.",
+ ret,
+ (thd->db.str ? thd->db.str : "(null)"),
+ wsrep_thd_query(thd));
+ my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0));
+ break;
default:
WSREP_WARN("TO isolation failed for: %d, schema: %s, sql: %s. "
- "Check wsrep connection state and retry the query.",
+ "Check your wsrep connection state and retry the query.",
ret,
(thd->db.str ? thd->db.str : "(null)"),
wsrep_thd_query(thd));
+
if (!thd->is_error())
{
my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check "
@@ -2418,13 +2435,6 @@ int wsrep_to_isolation_begin(THD *thd, const char *db_, const char *table_,
thd->variables.auto_increment_increment= 1;
}
- /*
- TOI operations will ignore provided lock_wait_timeout and restore it
- after operation is done.
- */
- thd->variables.saved_lock_wait_timeout= thd->variables.lock_wait_timeout;
- thd->variables.lock_wait_timeout= LONG_TIMEOUT;
-
if (thd->variables.wsrep_on && wsrep_thd_is_local(thd))
{
switch (wsrep_OSU_method_get(thd)) {
@@ -2441,8 +2451,19 @@ int wsrep_to_isolation_begin(THD *thd, const char *db_, const char *table_,
ret= -1;
break;
}
+
switch (ret) {
- case 0: /* wsrep_TOI_begin should set toi mode */ break;
+ case 0: /* wsrep_TOI_begin should set toi mode */
+ if (thd->variables.wsrep_OSU_method == WSREP_OSU_TOI)
+ {
+ /*
+ TOI operations ignore the provided lock_wait_timeout once replicated,
+ and restore it after operation is done.
+ */
+ thd->variables.saved_lock_wait_timeout= thd->variables.lock_wait_timeout;
+ thd->variables.lock_wait_timeout= LONG_TIMEOUT;
+ }
+ break;
case 1:
/* TOI replication skipped, treat as success */
ret= 0;
@@ -2461,10 +2482,9 @@ void wsrep_to_isolation_end(THD *thd)
DBUG_ASSERT(wsrep_thd_is_local_toi(thd) ||
wsrep_thd_is_in_rsu(thd));
- thd->variables.lock_wait_timeout= thd->variables.saved_lock_wait_timeout;
-
if (wsrep_thd_is_local_toi(thd))
{
+ thd->variables.lock_wait_timeout= thd->variables.saved_lock_wait_timeout;
DBUG_ASSERT(wsrep_OSU_method_get(thd) == WSREP_OSU_TOI);
wsrep_TOI_end(thd);
}
diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h
index 012a3b3f8be..4ca180213a5 100644
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@ -1,4 +1,4 @@
-/* Copyright 2008-2017 Codership Oy <http://www.codership.com>
+/* Copyright 2008-2021 Codership Oy <http://www.codership.com>
Copyright (c) 2020, 2021, MariaDB
This program is free software; you can redistribute it and/or modify
@@ -294,8 +294,6 @@ static inline bool wsrep_cluster_address_exists()
return wsrep_cluster_address && wsrep_cluster_address[0];
}
-#define WSREP_QUERY(thd) (thd->query())
-
extern my_bool wsrep_ready_get();
extern void wsrep_ready_wait();
diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc
index a5d292700a7..dc6bb21dbd9 100644
--- a/sql/wsrep_thd.cc
+++ b/sql/wsrep_thd.cc
@@ -340,11 +340,20 @@ int wsrep_abort_thd(THD *bf_thd_ptr, THD *victim_thd_ptr, my_bool signal)
DBUG_RETURN(1);
}
-bool wsrep_bf_abort(const THD* bf_thd, THD* victim_thd)
+bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd)
{
WSREP_LOG_THD(bf_thd, "BF aborter before");
WSREP_LOG_THD(victim_thd, "victim before");
- wsrep::seqno bf_seqno(bf_thd->wsrep_trx().ws_meta().seqno());
+
+ DBUG_EXECUTE_IF("sync.wsrep_bf_abort",
+ {
+ const char act[]=
+ "now "
+ "SIGNAL sync.wsrep_bf_abort_reached "
+ "WAIT_FOR signal.wsrep_bf_abort";
+ DBUG_ASSERT(!debug_sync_set_action(bf_thd,
+ STRING_WITH_LEN(act)));
+ };);
if (WSREP(victim_thd) && !victim_thd->wsrep_trx().active())
{
@@ -362,6 +371,8 @@ bool wsrep_bf_abort(const THD* bf_thd, THD* victim_thd)
}
bool ret;
+ wsrep::seqno bf_seqno(bf_thd->wsrep_trx().ws_meta().seqno());
+
if (wsrep_thd_is_toi(bf_thd))
{
ret= victim_thd->wsrep_cs().total_order_bf_abort(bf_seqno);
diff --git a/sql/wsrep_thd.h b/sql/wsrep_thd.h
index c7350c79ee7..9d8e4493b34 100644
--- a/sql/wsrep_thd.h
+++ b/sql/wsrep_thd.h
@@ -1,4 +1,4 @@
-/* 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
@@ -87,7 +87,7 @@ int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff,
bool wsrep_create_appliers(long threads, bool mutex_protected=false);
void wsrep_create_rollbacker();
-bool wsrep_bf_abort(const THD*, THD*);
+bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd);
int wsrep_abort_thd(THD *bf_thd_ptr, THD *victim_thd_ptr, my_bool signal);
extern void wsrep_thd_set_PA_safe(void *thd_ptr, my_bool safe);
@@ -292,7 +292,7 @@ static inline void wsrep_log_thd(const THD *thd,
(thd->get_stmt_da()->is_error() ? thd->get_stmt_da()->message() : "")
#ifdef WSREP_THD_LOG_QUERIES
, thd->lex->sql_command,
- WSREP_QUERY(thd)
+ wsrep_thd_query(thd)
#endif /* WSREP_OBSERVER_LOG_QUERIES */
);
}
diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc
index 3c557554cf4..47dd016e66d 100644
--- a/sql/wsrep_var.cc
+++ b/sql/wsrep_var.cc
@@ -1,4 +1,4 @@
-/* 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
it under the terms of the GNU General Public License as published by
@@ -843,7 +843,7 @@ bool wsrep_desync_check (sys_var *self, THD* thd, set_var* var)
ret= Wsrep_server_state::instance().provider().desync();
if (ret) {
WSREP_WARN ("SET desync failed %d for schema: %s, query: %s", ret,
- thd->db.str, WSREP_QUERY(thd));
+ thd->db.str, wsrep_thd_query(thd));
my_error (ER_CANNOT_USER, MYF(0), "'desync'", thd->query());
return true;
}
diff --git a/storage/maria/test_ma_backup.c b/storage/maria/test_ma_backup.c
index b15b9ade06b..c57ec6ece0d 100644
--- a/storage/maria/test_ma_backup.c
+++ b/storage/maria/test_ma_backup.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2018 MariaDB corporation
+/* Copyright (C) 2018, 2021, MariaDB corporation.
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
@@ -178,7 +178,6 @@ static int create_test_table(const char *table_name, int type_of_table)
int key_field=FIELD_SKIP_PRESPACE,extra_field=FIELD_SKIP_ENDSPACE;
int key_type=HA_KEYTYPE_NUM;
int create_flag=0;
- uint offset_to_key;
uint pack_seg=0, pack_keys= 0;
uint key_length;
uchar record[MAX_REC_LENGTH];
@@ -303,10 +302,6 @@ static int create_test_table(const char *table_name, int type_of_table)
else
uniques=0;
- offset_to_key= MY_TEST(null_fields);
- if (key_field == FIELD_BLOB || key_field == FIELD_VARCHAR)
- offset_to_key+= 2;
-
if (!silent)
printf("- Creating Aria file\n");
create_info.max_rows= 0;