mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
better error handling for NBO failures
when losing error voting: - if NBO has failed locally (DBMS side), don't override original DBMS error so it gets reported to the client - otherwise, report "query interrupted" instead of "error during commit"
This commit is contained in:
committed by
Teemu Ollakka
parent
b63e753aec
commit
3389b7ad3c
@ -790,10 +790,12 @@ namespace wsrep
|
|||||||
* passed to begin_nbo_phase_one().
|
* passed to begin_nbo_phase_one().
|
||||||
*
|
*
|
||||||
* @param keys Key array.
|
* @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
|
* @param wait_until Time point to wait until for entering TOI for
|
||||||
* phase two.
|
* phase two.
|
||||||
*/
|
*/
|
||||||
int begin_nbo_phase_two(const wsrep::key_array& keys,
|
int begin_nbo_phase_two(const wsrep::key_array& keys,
|
||||||
|
bool has_error,
|
||||||
std::chrono::time_point<wsrep::clock>
|
std::chrono::time_point<wsrep::clock>
|
||||||
wait_until =
|
wait_until =
|
||||||
std::chrono::time_point<wsrep::clock>());
|
std::chrono::time_point<wsrep::clock>());
|
||||||
|
@ -571,12 +571,6 @@ int wsrep::client_state::begin_nbo_phase_one(
|
|||||||
break;
|
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");
|
debug_log_state("begin_nbo_phase_one: leave");
|
||||||
return ret;
|
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(
|
int wsrep::client_state::begin_nbo_phase_two(
|
||||||
const wsrep::key_array& keys,
|
const wsrep::key_array& keys,
|
||||||
|
bool has_error,
|
||||||
std::chrono::time_point<wsrep::clock> wait_until)
|
std::chrono::time_point<wsrep::clock> wait_until)
|
||||||
{
|
{
|
||||||
debug_log_state("begin_nbo_phase_two: enter");
|
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_meta_ = nbo_meta_;
|
||||||
toi_mode_ = m_local;
|
toi_mode_ = m_local;
|
||||||
break;
|
break;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
ret= 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (timed_out) {
|
if (timed_out)
|
||||||
override_error(e_timeout_error);
|
{
|
||||||
} else {
|
override_error(e_timeout_error, status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
override_error(e_error_during_commit, status);
|
override_error(e_error_during_commit, status);
|
||||||
}
|
}
|
||||||
|
ret= 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Failed to grab TOI for completing NBO in order. This means that
|
// Failed to grab TOI for completing NBO in order. This means that
|
||||||
// the operation cannot be ended in total order, so we end the
|
// the operation cannot be ended in total order, so we end the
|
||||||
// NBO mode and let the DBMS to deal with the error.
|
// NBO mode and let the DBMS to deal with the error.
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
mode(lock, m_local);
|
mode(lock, m_local);
|
||||||
nbo_meta_ = wsrep::ws_meta();
|
nbo_meta_ = wsrep::ws_meta();
|
||||||
ret= 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_log_state("begin_nbo_phase_two: leave");
|
debug_log_state("begin_nbo_phase_two: leave");
|
||||||
|
Reference in New Issue
Block a user