From 23adb8f9f8605b3b5181b59ca4afc81ebd0ca19a Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Tue, 6 Aug 2019 11:39:42 +0300 Subject: [PATCH] - Remove unneeded keys from nbo phase two begin. - Save nbo meta for phase two - Assign trx_meta in mutable_ws_meta --- include/wsrep/client_state.hpp | 4 +++- src/client_state.cpp | 39 ++++++++++++++++++++++++++++------ src/wsrep_provider_v26.cpp | 13 ++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/include/wsrep/client_state.hpp b/include/wsrep/client_state.hpp index 0bc5310..e39b87e 100644 --- a/include/wsrep/client_state.hpp +++ b/include/wsrep/client_state.hpp @@ -682,7 +682,7 @@ namespace wsrep * * @param keys Array of keys for non-blocking operation. */ - int begin_nbo_phase_two(const wsrep::key_array& keys); + int begin_nbo_phase_two(); /** * End non-blocking operation phase two. This call will @@ -863,6 +863,7 @@ namespace wsrep , state_hist_() , transaction_(*this) , toi_meta_() + , nbo_meta_() , allow_dirty_reads_() , sync_wait_gtid_() , last_written_gtid_() @@ -913,6 +914,7 @@ namespace wsrep std::vector state_hist_; wsrep::transaction transaction_; wsrep::ws_meta toi_meta_; + wsrep::ws_meta nbo_meta_; bool allow_dirty_reads_; wsrep::gtid sync_wait_gtid_; wsrep::gtid last_written_gtid_; diff --git a/src/client_state.cpp b/src/client_state.cpp index 687db02..09289b3 100644 --- a/src/client_state.cpp +++ b/src/client_state.cpp @@ -340,6 +340,7 @@ int wsrep::client_state::enter_toi_local(const wsrep::key_array& keys, const wsrep::const_buffer& buffer, int flags) { + debug_log_state("enter_toi_local: enter"); assert(state_ == s_exec); assert(mode_ == m_local); int ret; @@ -357,14 +358,17 @@ int wsrep::client_state::enter_toi_local(const wsrep::key_array& keys, ret = 1; break; } + debug_log_state("enter_toi_local: leave"); return ret; } void wsrep::client_state::enter_toi_mode(const wsrep::ws_meta& ws_meta) { + debug_log_state("enter_toi_mode: enter"); assert(mode_ == m_high_priority); enter_toi_common(); toi_meta_ = ws_meta; + debug_log_state("enter_toi_mode: leave"); } void wsrep::client_state::leave_toi_common() @@ -381,16 +385,20 @@ void wsrep::client_state::leave_toi_common() 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(); + debug_log_state("leave_toi_local: leave"); return (provider().leave_toi(id_, err) == provider::success ? 0 : 1); } void wsrep::client_state::leave_toi_mode() { + debug_log_state("leave_toi_mode: enter"); assert(toi_mode_ == m_high_priority); leave_toi_common(); + debug_log_state("leave_toi_mode: leave"); } /////////////////////////////////////////////////////////////////////////////// @@ -449,6 +457,7 @@ int wsrep::client_state::end_rsu() int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys, const wsrep::const_buffer& buffer) { + debug_log_state("begin_nbo_phase_one: enter"); wsrep::unique_lock lock(mutex_); assert(state_ == s_exec); assert(mode_ == m_local); @@ -464,20 +473,26 @@ int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys, id_, keys, buffer, toi_meta_, wsrep::provider::flag::start_transaction)); lock.lock(); + int ret; switch (status) { case wsrep::provider::success: toi_mode_ = mode_; mode(lock, m_nbo); - return 0; + ret= 0; + break; default: current_error_status_ = status; - return 1; + ret= 1; + break; } + debug_log_state("begin_nbo_phase_one: leave"); + return ret; } int wsrep::client_state::end_nbo_phase_one() { + debug_log_state("end_nbo_phase_one: enter"); assert(state_ == s_exec); assert(mode_ == m_nbo); assert(in_toi()); @@ -495,7 +510,9 @@ int wsrep::client_state::end_nbo_phase_one() ret = 1; break; } + nbo_meta_ = toi_meta_; toi_meta_ = wsrep::ws_meta(); + debug_log_state("end_nbo_phase_one: leave"); return ret; } @@ -510,27 +527,35 @@ int wsrep::client_state::enter_nbo_mode(const wsrep::ws_meta& ws_meta) return 0; } -int wsrep::client_state::begin_nbo_phase_two(const wsrep::key_array& keys) +int wsrep::client_state::begin_nbo_phase_two() { + debug_log_state("begin_nbo_phase_two: enter"); assert(state_ == s_exec); assert(mode_ == m_nbo); wsrep::unique_lock lock(mutex_); enum wsrep::provider::status status( - provider().enter_toi(id_, keys, wsrep::const_buffer(), toi_meta_, + provider().enter_toi(id_, wsrep::key_array(), + wsrep::const_buffer(), nbo_meta_, wsrep::provider::flag::commit)); + int ret; switch (status) { case wsrep::provider::success: - return 0; + ret= 0; + break; default: current_error_status_ = status; - return 1; + ret= 1; + break; } + debug_log_state("begin_nbo_phase_two: leave"); + return ret; } int wsrep::client_state::end_nbo_phase_two() { + debug_log_state("end_nbo_phase_two: enter"); assert(state_ == s_exec); assert(mode_ == m_nbo); assert(in_toi()); @@ -549,7 +574,9 @@ int wsrep::client_state::end_nbo_phase_two() break; } toi_meta_ = wsrep::ws_meta(); + nbo_meta_ = wsrep::ws_meta(); mode(lock, m_local); + debug_log_state("end_nbo_phase_two: leave"); return ret; } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/wsrep_provider_v26.cpp b/src/wsrep_provider_v26.cpp index 92640e3..9bf8ffe 100644 --- a/src/wsrep_provider_v26.cpp +++ b/src/wsrep_provider_v26.cpp @@ -222,7 +222,16 @@ namespace : ws_meta_(ws_meta) , trx_meta_() , flags_(flags) - { } + { + std::memcpy(trx_meta_.gtid.uuid.data, ws_meta.group_id().data(), + sizeof(trx_meta_.gtid.uuid.data)); + trx_meta_.gtid.seqno = seqno_to_native(ws_meta.seqno()); + std::memcpy(trx_meta_.stid.node.data, ws_meta.server_id().data(), + sizeof(trx_meta_.stid.node.data)); + trx_meta_.stid.conn = ws_meta.client_id().get(); + trx_meta_.stid.trx = ws_meta.transaction_id().get(); + trx_meta_.depends_on = seqno_to_native(ws_meta.depends_on()); + } ~mutable_ws_meta() { @@ -850,7 +859,7 @@ wsrep::wsrep_provider_v26::enter_toi( &wsrep_keys[0], wsrep_keys.size(), &wsrep_buf, - 1, + buffer.size() ? 1 : 0, mmeta.native_flags(), mmeta.native())); }