1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-03 16:22:35 +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:
Leandro Pacheco
2019-08-07 09:17:22 -03:00
parent 0c54cbd3f8
commit 55427188c1

View File

@ -1116,11 +1116,17 @@ void wsrep::server_state::start_streaming_client(
void wsrep::server_state::convert_streaming_client_to_applier(
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_LOG_DEBUG(wsrep::log::debug_log_level(),
wsrep::log::debug_level_server_state,
"Convert streaming client to applier "
<< client_state->id());
WSREP_LOG_DEBUG(wsrep::log::debug_log_level(),
wsrep::log::debug_level_server_state,
"Convert streaming client to applier "
<< client_state->id());
streaming_clients_map::iterator i(
streaming_clients_.find(client_state->id()));
assert(i != streaming_clients_.end());
@ -1141,9 +1147,6 @@ void wsrep::server_state::convert_streaming_client_to_applier(
// joining back to cluster.
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()))
{
log_adopt_error(client_state->transaction());
@ -1164,6 +1167,10 @@ void wsrep::server_state::convert_streaming_client_to_applier(
assert(0);
}
}
else
{
server_service_.release_high_priority_service(streaming_applier);
}
}