From 53e60f64c953b252a47bc91e87b4131465b5f15f Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Sat, 19 Mar 2022 14:45:57 +0200 Subject: [PATCH] Reset TOI meta after releasing total order in provider This is to keep the TOI meta available in case the provider implementation needs it. --- include/wsrep/provider.hpp | 1 + src/client_state.cpp | 12 +++++++----- src/wsrep_provider_v26.cpp | 1 + src/wsrep_provider_v26.hpp | 1 + test/mock_provider.hpp | 1 + 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/wsrep/provider.hpp b/include/wsrep/provider.hpp index 8834a70..03afe0f 100644 --- a/include/wsrep/provider.hpp +++ b/include/wsrep/provider.hpp @@ -367,6 +367,7 @@ namespace wsrep * Leave total order isolation critical section */ virtual enum status leave_toi(wsrep::client_id, + const wsrep::ws_meta& ws_meta, const wsrep::mutable_buffer& err) = 0; /** diff --git a/src/client_state.cpp b/src/client_state.cpp index c547373..100a11b 100644 --- a/src/client_state.cpp +++ b/src/client_state.cpp @@ -395,7 +395,7 @@ wsrep::client_state::poll_enter_toi( // Successfully entered TOI, but the provider reported failure. // This may happen for example if certification fails. // Leave TOI before proceeding. - if (provider().leave_toi(id_, wsrep::mutable_buffer())) + if (provider().leave_toi(id_, poll_meta, wsrep::mutable_buffer())) { wsrep::log_warning() << "Failed to leave TOI after failure in " @@ -499,10 +499,12 @@ int wsrep::client_state::leave_toi_local(const wsrep::mutable_buffer& err) { debug_log_state("leave_toi_local: enter"); assert(toi_mode_ == m_local); - leave_toi_common(); + auto ret = (provider().leave_toi(id_, toi_meta_, err) == provider::success ? 0 : 1); + leave_toi_common(); debug_log_state("leave_toi_local: leave"); - return (provider().leave_toi(id_, err) == provider::success ? 0 : 1); + + return ret; } void wsrep::client_state::leave_toi_mode() @@ -619,7 +621,7 @@ int wsrep::client_state::end_nbo_phase_one(const wsrep::mutable_buffer& err) assert(mode_ == m_nbo); assert(in_toi()); - enum wsrep::provider::status status(provider().leave_toi(id_, err)); + enum wsrep::provider::status status(provider().leave_toi(id_, toi_meta_, err)); wsrep::unique_lock lock(mutex_); int ret; switch (status) @@ -720,7 +722,7 @@ int wsrep::client_state::end_nbo_phase_two(const wsrep::mutable_buffer& err) assert(toi_mode_ == m_local); assert(in_toi()); enum wsrep::provider::status status( - provider().leave_toi(id_, err)); + provider().leave_toi(id_, toi_meta_, err)); wsrep::unique_lock lock(mutex_); int ret; switch (status) diff --git a/src/wsrep_provider_v26.cpp b/src/wsrep_provider_v26.cpp index eb8679c..6893d2b 100644 --- a/src/wsrep_provider_v26.cpp +++ b/src/wsrep_provider_v26.cpp @@ -1025,6 +1025,7 @@ wsrep::wsrep_provider_v26::enter_toi( enum wsrep::provider::status wsrep::wsrep_provider_v26::leave_toi(wsrep::client_id client_id, + const wsrep::ws_meta&, const wsrep::mutable_buffer& err) { const wsrep_buf_t err_buf = { err.data(), err.size() }; diff --git a/src/wsrep_provider_v26.hpp b/src/wsrep_provider_v26.hpp index 1859b67..a8c9366 100644 --- a/src/wsrep_provider_v26.hpp +++ b/src/wsrep_provider_v26.hpp @@ -83,6 +83,7 @@ namespace wsrep int) WSREP_OVERRIDE; enum wsrep::provider::status leave_toi(wsrep::client_id, + const wsrep::ws_meta& ws_meta, const wsrep::mutable_buffer&) WSREP_OVERRIDE; std::pair diff --git a/test/mock_provider.hpp b/test/mock_provider.hpp index c2a89f0..5d9fa88 100644 --- a/test/mock_provider.hpp +++ b/test/mock_provider.hpp @@ -260,6 +260,7 @@ namespace wsrep } enum wsrep::provider::status leave_toi(wsrep::client_id, + const wsrep::ws_meta&, const wsrep::mutable_buffer&) WSREP_OVERRIDE { return wsrep::provider::success; }