Skip to content

Commit beb1e23

Browse files
committed
MDEV-30419 Fix unhandled exception thrown from wsrep-lib
Updated wsrep-lib to version in which server_state wait_until_state() and sst_received() were changed to report errors via return codes instead of throwing exceptions. Added error handling accordingly. Tested manually that failure in sst_received() which was caused by server misconfiguration (unknown configuration variable in server configuration) does not cause crash due to uncaught exception.
1 parent 9924466 commit beb1e23

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

sql/wsrep_mysqld.cc

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -915,13 +915,19 @@ void wsrep_init_startup (bool sst_first)
915915
With mysqldump SST (!sst_first) wait until the server reaches
916916
joiner state and procedd to accepting connections.
917917
*/
918+
int err= 0;
918919
if (sst_first)
919920
{
920-
server_state.wait_until_state(Wsrep_server_state::s_initializing);
921+
err= server_state.wait_until_state(Wsrep_server_state::s_initializing);
921922
}
922923
else
923924
{
924-
server_state.wait_until_state(Wsrep_server_state::s_joiner);
925+
err= server_state.wait_until_state(Wsrep_server_state::s_joiner);
926+
}
927+
if (err)
928+
{
929+
WSREP_ERROR("Wsrep startup was interrupted");
930+
unireg_abort(1);
925931
}
926932
}
927933

@@ -1016,7 +1022,11 @@ void wsrep_stop_replication(THD *thd)
10161022
{
10171023
WSREP_DEBUG("Disconnect provider");
10181024
Wsrep_server_state::instance().disconnect();
1019-
Wsrep_server_state::instance().wait_until_state(Wsrep_server_state::s_disconnected);
1025+
if (Wsrep_server_state::instance().wait_until_state(
1026+
Wsrep_server_state::s_disconnected))
1027+
{
1028+
WSREP_WARN("Wsrep interrupted while waiting for disconnected state");
1029+
}
10201030
}
10211031

10221032
/* my connection, should not terminate with wsrep_close_client_connection(),
@@ -1038,7 +1048,11 @@ void wsrep_shutdown_replication()
10381048
{
10391049
WSREP_DEBUG("Disconnect provider");
10401050
Wsrep_server_state::instance().disconnect();
1041-
Wsrep_server_state::instance().wait_until_state(Wsrep_server_state::s_disconnected);
1051+
if (Wsrep_server_state::instance().wait_until_state(
1052+
Wsrep_server_state::s_disconnected))
1053+
{
1054+
WSREP_WARN("Wsrep interrupted while waiting for disconnected state");
1055+
}
10421056
}
10431057

10441058
wsrep_close_client_connections(TRUE);

sql/wsrep_sst.cc

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,14 @@ static bool wsrep_sst_complete (THD* thd,
336336
if ((state == Wsrep_server_state::s_joiner ||
337337
state == Wsrep_server_state::s_initialized))
338338
{
339-
Wsrep_server_state::instance().sst_received(client_service,
340-
rcode);
341-
WSREP_INFO("SST succeeded for position %s", start_pos_buf);
339+
if (Wsrep_server_state::instance().sst_received(client_service, rcode))
340+
{
341+
failed= true;
342+
}
343+
else
344+
{
345+
WSREP_INFO("SST succeeded for position %s", start_pos_buf);
346+
}
342347
}
343348
else
344349
{

wsrep-lib

0 commit comments

Comments
 (0)