1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-22 23:21:53 +03:00

- Remove unneeded keys from nbo phase two begin.

- Save nbo meta for phase two
- Assign trx_meta in mutable_ws_meta
This commit is contained in:
Teemu Ollakka
2019-08-06 11:39:42 +03:00
parent 6291f1bf16
commit 24ad144db3
3 changed files with 45 additions and 12 deletions

View File

@ -778,7 +778,7 @@ namespace wsrep
* *
* @param keys Array of keys for non-blocking operation. * @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 * End non-blocking operation phase two. This call will
@ -959,6 +959,7 @@ namespace wsrep
, state_hist_() , state_hist_()
, transaction_(*this) , transaction_(*this)
, toi_meta_() , toi_meta_()
, nbo_meta_()
, allow_dirty_reads_() , allow_dirty_reads_()
, sync_wait_gtid_() , sync_wait_gtid_()
, last_written_gtid_() , last_written_gtid_()
@ -1009,6 +1010,7 @@ namespace wsrep
std::vector<enum state> state_hist_; std::vector<enum state> state_hist_;
wsrep::transaction transaction_; wsrep::transaction transaction_;
wsrep::ws_meta toi_meta_; wsrep::ws_meta toi_meta_;
wsrep::ws_meta nbo_meta_;
bool allow_dirty_reads_; bool allow_dirty_reads_;
wsrep::gtid sync_wait_gtid_; wsrep::gtid sync_wait_gtid_;
wsrep::gtid last_written_gtid_; wsrep::gtid last_written_gtid_;

View File

@ -341,6 +341,7 @@ int wsrep::client_state::enter_toi_local(const wsrep::key_array& keys,
const wsrep::const_buffer& buffer, const wsrep::const_buffer& buffer,
int flags) int flags)
{ {
debug_log_state("enter_toi_local: enter");
assert(state_ == s_exec); assert(state_ == s_exec);
assert(mode_ == m_local); assert(mode_ == m_local);
int ret; int ret;
@ -358,14 +359,17 @@ int wsrep::client_state::enter_toi_local(const wsrep::key_array& keys,
ret = 1; ret = 1;
break; break;
} }
debug_log_state("enter_toi_local: leave");
return ret; return ret;
} }
void wsrep::client_state::enter_toi_mode(const wsrep::ws_meta& ws_meta) 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); assert(mode_ == m_high_priority);
enter_toi_common(); enter_toi_common();
toi_meta_ = ws_meta; toi_meta_ = ws_meta;
debug_log_state("enter_toi_mode: leave");
} }
void wsrep::client_state::leave_toi_common() void wsrep::client_state::leave_toi_common()
@ -382,16 +386,20 @@ void wsrep::client_state::leave_toi_common()
int wsrep::client_state::leave_toi_local(const wsrep::mutable_buffer& err) int wsrep::client_state::leave_toi_local(const wsrep::mutable_buffer& err)
{ {
debug_log_state("leave_toi_local: enter");
assert(toi_mode_ == m_local); assert(toi_mode_ == m_local);
leave_toi_common(); leave_toi_common();
debug_log_state("leave_toi_local: leave");
return (provider().leave_toi(id_, err) == provider::success ? 0 : 1); return (provider().leave_toi(id_, err) == provider::success ? 0 : 1);
} }
void wsrep::client_state::leave_toi_mode() void wsrep::client_state::leave_toi_mode()
{ {
debug_log_state("leave_toi_mode: enter");
assert(toi_mode_ == m_high_priority); assert(toi_mode_ == m_high_priority);
leave_toi_common(); leave_toi_common();
debug_log_state("leave_toi_mode: leave");
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
@ -450,6 +458,7 @@ int wsrep::client_state::end_rsu()
int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys, int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys,
const wsrep::const_buffer& buffer) const wsrep::const_buffer& buffer)
{ {
debug_log_state("begin_nbo_phase_one: enter");
wsrep::unique_lock<wsrep::mutex> lock(mutex_); wsrep::unique_lock<wsrep::mutex> lock(mutex_);
assert(state_ == s_exec); assert(state_ == s_exec);
assert(mode_ == m_local); assert(mode_ == m_local);
@ -465,20 +474,26 @@ int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys,
id_, keys, buffer, toi_meta_, id_, keys, buffer, toi_meta_,
wsrep::provider::flag::start_transaction)); wsrep::provider::flag::start_transaction));
lock.lock(); lock.lock();
int ret;
switch (status) switch (status)
{ {
case wsrep::provider::success: case wsrep::provider::success:
toi_mode_ = mode_; toi_mode_ = mode_;
mode(lock, m_nbo); mode(lock, m_nbo);
return 0; ret= 0;
break;
default: default:
current_error_status_ = status; 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() int wsrep::client_state::end_nbo_phase_one()
{ {
debug_log_state("end_nbo_phase_one: enter");
assert(state_ == s_exec); assert(state_ == s_exec);
assert(mode_ == m_nbo); assert(mode_ == m_nbo);
assert(in_toi()); assert(in_toi());
@ -496,7 +511,9 @@ int wsrep::client_state::end_nbo_phase_one()
ret = 1; ret = 1;
break; break;
} }
nbo_meta_ = toi_meta_;
toi_meta_ = wsrep::ws_meta(); toi_meta_ = wsrep::ws_meta();
debug_log_state("end_nbo_phase_one: leave");
return ret; return ret;
} }
@ -511,27 +528,35 @@ int wsrep::client_state::enter_nbo_mode(const wsrep::ws_meta& ws_meta)
return 0; 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(state_ == s_exec);
assert(mode_ == m_nbo); assert(mode_ == m_nbo);
wsrep::unique_lock<wsrep::mutex> lock(mutex_); wsrep::unique_lock<wsrep::mutex> lock(mutex_);
enum wsrep::provider::status status( 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)); wsrep::provider::flag::commit));
int ret;
switch (status) switch (status)
{ {
case wsrep::provider::success: case wsrep::provider::success:
return 0; ret= 0;
break;
default: default:
current_error_status_ = status; 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() int wsrep::client_state::end_nbo_phase_two()
{ {
debug_log_state("end_nbo_phase_two: enter");
assert(state_ == s_exec); assert(state_ == s_exec);
assert(mode_ == m_nbo); assert(mode_ == m_nbo);
assert(in_toi()); assert(in_toi());
@ -550,7 +575,9 @@ int wsrep::client_state::end_nbo_phase_two()
break; break;
} }
toi_meta_ = wsrep::ws_meta(); toi_meta_ = wsrep::ws_meta();
nbo_meta_ = wsrep::ws_meta();
mode(lock, m_local); mode(lock, m_local);
debug_log_state("end_nbo_phase_two: leave");
return ret; return ret;
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -210,10 +210,14 @@ namespace
, trx_meta_() , trx_meta_()
, flags_(flags) , flags_(flags)
{ {
std::memcpy(trx_meta_.stid.node.data, ws_meta.server_id().data(), std::memcpy(trx_meta_.gtid.uuid.data, ws_meta.group_id().data(),
sizeof(trx_meta_.stid.node.data)); sizeof(trx_meta_.gtid.uuid.data));
trx_meta_.stid.conn = ws_meta.client_id().get(); trx_meta_.gtid.seqno = seqno_to_native(ws_meta.seqno());
trx_meta_.stid.trx = ws_meta.transaction_id().get(); 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() ~mutable_ws_meta()
@ -887,7 +891,7 @@ wsrep::wsrep_provider_v26::enter_toi(
wsrep_keys.data(), wsrep_keys.data(),
wsrep_keys.size(), wsrep_keys.size(),
&wsrep_buf, &wsrep_buf,
1, buffer.size() ? 1 : 0,
mmeta.native_flags(), mmeta.native_flags(),
mmeta.native())); mmeta.native()));
} }