From edd141127c11d78ef073f9f3ca61708821f20b32 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Tue, 25 Jan 2022 14:38:28 +0100 Subject: [PATCH] Handle assert `server_id_.is_undefined == false` Return an error if server_id_ is undefined before fragment certification. This may happen if the server disconnects from the cluster, right before a transactions attempts to replicate a fragment. --- src/transaction.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/transaction.cpp b/src/transaction.cpp index 69380a4..5b30b88 100644 --- a/src/transaction.cpp +++ b/src/transaction.cpp @@ -1535,14 +1535,22 @@ int wsrep::transaction::certify_fragment( // available to store the fragment. The fragment meta data // is updated after certification. wsrep::id server_id(client_state_.server_state().id()); - assert(server_id.is_undefined() == false); - if (storage_service.start_transaction(ws_handle_) || - storage_service.append_fragment( - server_id, - id(), - flags(), - wsrep::const_buffer(data.data(), data.size()), - xid())) + + if (server_id.is_undefined()) { + // Server disconnected from cluster, do not + // append a fragment with undefined server_id. + ret = 1; + error = wsrep::e_append_fragment_error; + } + + if (ret == 0 && + (storage_service.start_transaction(ws_handle_) || + storage_service.append_fragment( + server_id, + id(), + flags(), + wsrep::const_buffer(data.data(), data.size()), + xid()))) { ret = 1; error = wsrep::e_append_fragment_error;