1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-24 10:42:31 +03:00

error parameter to nbo calls and m_undefined for toi_mode

toi_mode is set only when actually inside phase one and two.
In between it goes back to m_undefined.
This commit is contained in:
Leandro Pacheco
2019-08-28 18:36:17 -03:00
committed by Teemu Ollakka
parent 0b12869715
commit 5298d2340e
10 changed files with 60 additions and 41 deletions

View File

@ -462,7 +462,7 @@ int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys,
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
assert(state_ == s_exec);
assert(mode_ == m_local);
assert(toi_mode_ == m_local);
assert(toi_mode_ == m_undefined);
/**
* @todo Implement retrying if the call fails due to certification
@ -487,7 +487,9 @@ int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys,
current_error_status_ = status;
if (!toi_meta_.seqno().is_undefined())
{
provider().leave_toi(id_);
// TODO(leandro): do we need to pass sth here? is leave_toi necessary here? enter_toi_local doesn't do it.
wsrep::mutable_buffer err;
provider().leave_toi(id_, err);
}
toi_meta_ = wsrep::ws_meta();
ret= 1;
@ -497,14 +499,14 @@ int wsrep::client_state::begin_nbo_phase_one(const wsrep::key_array& keys,
return ret;
}
int wsrep::client_state::end_nbo_phase_one()
int wsrep::client_state::end_nbo_phase_one(const wsrep::mutable_buffer& err)
{
debug_log_state("end_nbo_phase_one: enter");
assert(state_ == s_exec);
assert(mode_ == m_nbo);
assert(in_toi());
enum wsrep::provider::status status(provider().leave_toi(id_));
enum wsrep::provider::status status(provider().leave_toi(id_, err));
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
int ret;
switch (status)
@ -519,6 +521,7 @@ int wsrep::client_state::end_nbo_phase_one()
}
nbo_meta_ = toi_meta_;
toi_meta_ = wsrep::ws_meta();
toi_mode_ = m_undefined;
debug_log_state("end_nbo_phase_one: leave");
return ret;
}
@ -527,9 +530,9 @@ int wsrep::client_state::enter_nbo_mode(const wsrep::ws_meta& ws_meta)
{
assert(state_ == s_exec);
assert(mode_ == m_local);
assert(toi_mode_ == m_undefined);
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
nbo_meta_ = ws_meta;
toi_mode_ = mode_;
mode(lock, m_nbo);
return 0;
}
@ -539,6 +542,7 @@ int wsrep::client_state::begin_nbo_phase_two()
debug_log_state("begin_nbo_phase_two: enter");
assert(state_ == s_exec);
assert(mode_ == m_nbo);
assert(toi_mode_ == m_undefined);
assert(!in_toi());
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
@ -556,6 +560,7 @@ int wsrep::client_state::begin_nbo_phase_two()
case wsrep::provider::success:
ret= 0;
toi_meta_ = nbo_meta_;
toi_mode_ = m_local;
break;
default:
current_error_status_ = status;
@ -566,14 +571,15 @@ int wsrep::client_state::begin_nbo_phase_two()
return ret;
}
int wsrep::client_state::end_nbo_phase_two()
int wsrep::client_state::end_nbo_phase_two(const wsrep::mutable_buffer& err)
{
debug_log_state("end_nbo_phase_two: enter");
assert(state_ == s_exec);
assert(mode_ == m_nbo);
assert(toi_mode_ == m_local);
assert(in_toi());
enum wsrep::provider::status status(
provider().leave_toi(id_));
provider().leave_toi(id_, err));
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
int ret;
switch (status)
@ -587,6 +593,7 @@ int wsrep::client_state::end_nbo_phase_two()
break;
}
toi_meta_ = wsrep::ws_meta();
toi_mode_ = m_undefined;
nbo_meta_ = wsrep::ws_meta();
mode(lock, m_local);
debug_log_state("end_nbo_phase_two: leave");

View File

@ -464,8 +464,9 @@ static int apply_toi(wsrep::provider& provider,
else if (wsrep::starts_transaction(ws_meta.flags()))
{
provider.commit_order_enter(ws_handle, ws_meta);
int ret(high_priority_service.apply_nbo_begin(ws_meta, data));
provider.commit_order_leave(ws_handle, ws_meta);
wsrep::mutable_buffer err;
int ret(high_priority_service.apply_nbo_begin(ws_meta, data, err));
provider.commit_order_leave(ws_handle, ws_meta, err);
return ret;
}
else if (wsrep::commits_transaction(ws_meta.flags()))
@ -473,7 +474,8 @@ static int apply_toi(wsrep::provider& provider,
// NBO end event is ignored here, both local and applied
// have NBO end handled via local TOI calls.
provider.commit_order_enter(ws_handle, ws_meta);
provider.commit_order_leave(ws_handle, ws_meta);
wsrep::mutable_buffer err;
provider.commit_order_leave(ws_handle, ws_meta, err);
return 0;
}
else