1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-21 12:22:06 +03:00

Handle disconnecting state in on_sync()

When disconnecting from the group, the sync event from the
provider must not change the state back to synced.
This commit is contained in:
Teemu Ollakka
2022-05-25 07:39:43 +03:00
parent 7498ed424a
commit bfc5a8f6ee
2 changed files with 14 additions and 1 deletions

View File

@ -1051,6 +1051,8 @@ void wsrep::server_state::on_sync()
{ {
switch (state_) switch (state_)
{ {
case s_disconnecting:
break;
case s_synced: case s_synced:
break; break;
case s_connected: // Seed node path: provider becomes case s_connected: // Seed node path: provider becomes
@ -1077,7 +1079,7 @@ void wsrep::server_state::on_sync()
// Calls to on_sync() in synced state are possible if // Calls to on_sync() in synced state are possible if
// server desyncs itself from the group. Provider does not // server desyncs itself from the group. Provider does not
// inform about this through callbacks. // inform about this through callbacks.
if (state_ != s_synced) if (state_ != s_synced && state_ != s_disconnecting)
{ {
state(lock, s_synced); state(lock, s_synced);
} }

View File

@ -935,3 +935,14 @@ BOOST_FIXTURE_TEST_CASE(server_state_xa_not_orphaned,
BOOST_REQUIRE(not ss.find_streaming_applier( BOOST_REQUIRE(not ss.find_streaming_applier(
meta_commit_s3.server_id(), meta_commit_s3.transaction_id())); meta_commit_s3.server_id(), meta_commit_s3.transaction_id()));
} }
BOOST_FIXTURE_TEST_CASE(server_state_sync_in_disconnecting,
sst_first_server_fixture)
{
bootstrap();
ss.disconnect();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_disconnecting);
// Synced event from the provider must not change the state.
ss.on_sync();
BOOST_REQUIRE(ss.state() == wsrep::server_state::s_disconnecting);
}