diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-08-26 08:46:57 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-08-26 08:46:57 +0300 |
commit | 87ff4ba7c874ccb8a5b1105571569a94ca959d53 (patch) | |
tree | a3dfd317697d7f698c5c5e3e3d7b3a7a3b4d181a | |
parent | bd3eb528512dfbb99a57033ff3bf7e09069c0d4e (diff) | |
parent | dc6bc85cd29586631d927036451d955c7013206c (diff) | |
download | mariadb-git-87ff4ba7c874ccb8a5b1105571569a94ca959d53.tar.gz |
Merge 10.4 into 10.5
-rw-r--r-- | mysql-test/suite/galera/r/galera_split_brain.result | 3 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/galera_split_brain.test | 3 | ||||
-rw-r--r-- | plugin/auth_pam/CMakeLists.txt | 14 | ||||
-rw-r--r-- | sql/handler.cc | 2 | ||||
-rw-r--r-- | sql/sql_insert.cc | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 4 | ||||
-rw-r--r-- | sql/wsrep_client_service.cc | 6 | ||||
-rw-r--r-- | sql/wsrep_high_priority_service.cc | 23 | ||||
-rw-r--r-- | sql/wsrep_mysqld.cc | 44 | ||||
-rw-r--r-- | sql/wsrep_mysqld.h | 4 | ||||
-rw-r--r-- | sql/wsrep_thd.cc | 15 | ||||
-rw-r--r-- | sql/wsrep_thd.h | 6 | ||||
-rw-r--r-- | sql/wsrep_var.cc | 4 | ||||
-rw-r--r-- | storage/maria/test_ma_backup.c | 7 |
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; |