summaryrefslogtreecommitdiff
path: root/sql/wsrep_mysqld.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2021-02-12 17:31:25 +0100
committerSergei Golubchik <serg@mariadb.org>2021-02-14 23:18:42 +0100
commit26965387230a9b13fb716344477d108bb87dea98 (patch)
treead6c110d3d82f073554489610265b56f758efb73 /sql/wsrep_mysqld.cc
parentb91e77cff3fb5fbb32ebb061ed342469b434c4e8 (diff)
downloadmariadb-git-26965387230a9b13fb716344477d108bb87dea98.tar.gz
updating @@wsrep_cluster_address deadlocks
wsrep_cluster_address_update() causes LOCK_wsrep_slave_threads to be locked under LOCK_wsrep_cluster_config, while normally the order should be the opposite. Fix: don't protect @@wsrep_cluster_address value with the LOCK_wsrep_cluster_config, LOCK_global_system_variables is enough. Only protect wsrep reinitialization with the LOCK_wsrep_cluster_config. And make it use a local copy of the global @@wsrep_cluster_address. Also, introduce a helper function that checks whether wsrep_cluster_address is set and also asserts that it can be safely read by the caller.
Diffstat (limited to 'sql/wsrep_mysqld.cc')
-rw-r--r--sql/wsrep_mysqld.cc13
1 files changed, 4 insertions, 9 deletions
diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc
index 8e68f7229eb..fc54c7f6ec4 100644
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@ -878,13 +878,13 @@ void wsrep_init_startup (bool sst_first)
if (!strcmp(wsrep_provider, WSREP_NONE)) return;
/* Skip replication start if no cluster address */
- if (!wsrep_cluster_address || wsrep_cluster_address[0] == 0) return;
+ if (!wsrep_cluster_address_exists()) return;
/*
Read value of wsrep_new_cluster before wsrep_start_replication(),
the value is reset to FALSE inside wsrep_start_replication.
*/
- if (!wsrep_start_replication()) unireg_abort(1);
+ if (!wsrep_start_replication(wsrep_cluster_address)) unireg_abort(1);
wsrep_create_rollbacker();
wsrep_create_appliers(1);
@@ -1034,7 +1034,7 @@ void wsrep_shutdown_replication()
my_pthread_setspecific_ptr(THR_THD, NULL);
}
-bool wsrep_start_replication()
+bool wsrep_start_replication(const char *wsrep_cluster_address)
{
int rcode;
WSREP_DEBUG("wsrep_start_replication");
@@ -1049,12 +1049,7 @@ bool wsrep_start_replication()
return true;
}
- if (!wsrep_cluster_address || wsrep_cluster_address[0]== 0)
- {
- // if provider is non-trivial, but no address is specified, wait for address
- WSREP_DEBUG("wsrep_start_replication exit due to empty address");
- return true;
- }
+ DBUG_ASSERT(wsrep_cluster_address[0]);
bool const bootstrap(TRUE == wsrep_new_cluster);
wsrep_new_cluster= FALSE;