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:
@ -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_;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user