mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
avoid holding server_state lock when creating streaming applier
This fix avoids creating a lock cycle in MariaDB, between LOCK_global_system_variables, LOCK_wsrep_cluster_config and LOCK_wsrep_server_state.
This commit is contained in:
@ -1116,11 +1116,17 @@ void wsrep::server_state::start_streaming_client(
|
|||||||
void wsrep::server_state::convert_streaming_client_to_applier(
|
void wsrep::server_state::convert_streaming_client_to_applier(
|
||||||
wsrep::client_state* client_state)
|
wsrep::client_state* client_state)
|
||||||
{
|
{
|
||||||
|
// create streaming_applier beforehand as server_state lock should
|
||||||
|
// not be held when calling server_service methods
|
||||||
|
wsrep::high_priority_service* streaming_applier(
|
||||||
|
server_service_.streaming_applier_service(
|
||||||
|
client_state->client_service()));
|
||||||
|
|
||||||
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
|
||||||
WSREP_LOG_DEBUG(wsrep::log::debug_log_level(),
|
WSREP_LOG_DEBUG(wsrep::log::debug_log_level(),
|
||||||
wsrep::log::debug_level_server_state,
|
wsrep::log::debug_level_server_state,
|
||||||
"Convert streaming client to applier "
|
"Convert streaming client to applier "
|
||||||
<< client_state->id());
|
<< client_state->id());
|
||||||
streaming_clients_map::iterator i(
|
streaming_clients_map::iterator i(
|
||||||
streaming_clients_.find(client_state->id()));
|
streaming_clients_.find(client_state->id()));
|
||||||
assert(i != streaming_clients_.end());
|
assert(i != streaming_clients_.end());
|
||||||
@ -1141,9 +1147,6 @@ void wsrep::server_state::convert_streaming_client_to_applier(
|
|||||||
// joining back to cluster.
|
// joining back to cluster.
|
||||||
if (state(lock) != s_disconnected)
|
if (state(lock) != s_disconnected)
|
||||||
{
|
{
|
||||||
wsrep::high_priority_service* streaming_applier(
|
|
||||||
server_service_.streaming_applier_service(
|
|
||||||
client_state->client_service()));
|
|
||||||
if (streaming_applier->adopt_transaction(client_state->transaction()))
|
if (streaming_applier->adopt_transaction(client_state->transaction()))
|
||||||
{
|
{
|
||||||
log_adopt_error(client_state->transaction());
|
log_adopt_error(client_state->transaction());
|
||||||
@ -1164,6 +1167,10 @@ void wsrep::server_state::convert_streaming_client_to_applier(
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
server_service_.release_high_priority_service(streaming_applier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user