diff --git a/include/wsrep/client_state.hpp b/include/wsrep/client_state.hpp index 40a0e33..79d9e1b 100644 --- a/include/wsrep/client_state.hpp +++ b/include/wsrep/client_state.hpp @@ -790,10 +790,12 @@ namespace wsrep * passed to begin_nbo_phase_one(). * * @param keys Key array. + * @param has_error True if client thread has errored. * @param wait_until Time point to wait until for entering TOI for * phase two. */ int begin_nbo_phase_two(const wsrep::key_array& keys, + bool has_error, std::chrono::time_point wait_until = std::chrono::time_point()); diff --git a/src/client_state.cpp b/src/client_state.cpp index a833260..32ae3cb 100644 --- a/src/client_state.cpp +++ b/src/client_state.cpp @@ -571,12 +571,6 @@ int wsrep::client_state::begin_nbo_phase_one( break; } - if (ret && !toi_meta_.seqno().is_undefined()) - { - wsrep::mutable_buffer err; - provider().leave_toi(id_, err); - } - debug_log_state("begin_nbo_phase_one: leave"); return ret; } @@ -621,6 +615,7 @@ int wsrep::client_state::enter_nbo_mode(const wsrep::ws_meta& ws_meta) int wsrep::client_state::begin_nbo_phase_two( const wsrep::key_array& keys, + bool has_error, std::chrono::time_point wait_until) { debug_log_state("begin_nbo_phase_two: enter"); @@ -651,19 +646,35 @@ int wsrep::client_state::begin_nbo_phase_two( toi_meta_ = nbo_meta_; toi_mode_ = m_local; break; - default: - if (timed_out) { - override_error(e_timeout_error); - } else { - override_error(e_error_during_commit, status); + case wsrep::provider::error_provider_failed: + // If the thread has already errored on the DBMS side, we + // don't override the error so the original one can be reported. + if (!has_error) + { + override_error(e_interrupted_error, status); } - // Failed to grab TOI for completing NBO in order. This means that - // the operation cannot be ended in total order, so we end the - // NBO mode and let the DBMS to deal with the error. - mode(lock, m_local); - nbo_meta_ = wsrep::ws_meta(); ret= 1; break; + default: + if (timed_out) + { + override_error(e_timeout_error, status); + } + else + { + override_error(e_error_during_commit, status); + } + ret= 1; + break; + } + + // Failed to grab TOI for completing NBO in order. This means that + // the operation cannot be ended in total order, so we end the + // NBO mode and let the DBMS to deal with the error. + if (ret) + { + mode(lock, m_local); + nbo_meta_ = wsrep::ws_meta(); } debug_log_state("begin_nbo_phase_two: leave");