mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-07-28 20:02:00 +03:00
- Added wait-until parameter for begin_nbo_phase_two().
- Retry enter_toi() in poll_enter_toi() also for error_connection_failed which means that the connectivity to the cluster has been lost, a.k.a non-prim.
This commit is contained in:
@ -336,6 +336,7 @@ wsrep::client_state::poll_enter_toi(
|
||||
wsrep::unique_lock<wsrep::mutex>& lock,
|
||||
const wsrep::key_array& keys,
|
||||
const wsrep::const_buffer& buffer,
|
||||
wsrep::ws_meta& meta,
|
||||
int flags,
|
||||
std::chrono::time_point<wsrep::clock> wait_until)
|
||||
{
|
||||
@ -349,7 +350,7 @@ wsrep::client_state::poll_enter_toi(
|
||||
do
|
||||
{
|
||||
lock.unlock();
|
||||
status = provider().enter_toi(id_, keys, buffer, toi_meta_, flags);
|
||||
status = provider().enter_toi(id_, keys, buffer, meta, flags);
|
||||
if (status != wsrep::provider::success &&
|
||||
not toi_meta_.gtid().is_undefined())
|
||||
{
|
||||
@ -364,13 +365,15 @@ wsrep::client_state::poll_enter_toi(
|
||||
}
|
||||
toi_meta_ = wsrep::ws_meta();
|
||||
}
|
||||
if (status == wsrep::provider::error_certification_failed)
|
||||
if (status == wsrep::provider::error_certification_failed ||
|
||||
status == wsrep::provider::error_connection_failed)
|
||||
{
|
||||
::usleep(100000);
|
||||
}
|
||||
lock.lock();
|
||||
}
|
||||
while (status == wsrep::provider::error_certification_failed &&
|
||||
while ((status == wsrep::provider::error_certification_failed ||
|
||||
status == wsrep::provider::error_connection_failed) &&
|
||||
wait_until.time_since_epoch().count() &&
|
||||
wsrep::clock::now() < wait_until &&
|
||||
not client_service_.interrupted(lock));
|
||||
@ -399,6 +402,7 @@ int wsrep::client_state::enter_toi_local(const wsrep::key_array& keys,
|
||||
|
||||
auto const status(poll_enter_toi(
|
||||
lock, keys, buffer,
|
||||
toi_meta_,
|
||||
wsrep::provider::flag::start_transaction |
|
||||
wsrep::provider::flag::commit,
|
||||
wait_until));
|
||||
@ -528,6 +532,7 @@ int wsrep::client_state::begin_nbo_phase_one(
|
||||
int ret;
|
||||
auto const status(poll_enter_toi(
|
||||
lock, keys, buffer,
|
||||
toi_meta_,
|
||||
wsrep::provider::flag::start_transaction,
|
||||
wait_until));
|
||||
switch (status)
|
||||
@ -591,7 +596,9 @@ 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(
|
||||
const wsrep::key_array& keys,
|
||||
std::chrono::time_point<wsrep::clock> wait_until)
|
||||
{
|
||||
debug_log_state("begin_nbo_phase_two: enter");
|
||||
debug_log_keys(keys);
|
||||
@ -606,9 +613,11 @@ int wsrep::client_state::begin_nbo_phase_two(const wsrep::key_array& keys)
|
||||
// Output stored in nbo_meta_ is copied to toi_meta_ for
|
||||
// phase two end.
|
||||
enum wsrep::provider::status status(
|
||||
provider().enter_toi(id_, keys,
|
||||
wsrep::const_buffer(), nbo_meta_,
|
||||
wsrep::provider::flag::commit));
|
||||
poll_enter_toi(lock, keys,
|
||||
wsrep::const_buffer(),
|
||||
nbo_meta_,
|
||||
wsrep::provider::flag::commit,
|
||||
wait_until));
|
||||
int ret;
|
||||
switch (status)
|
||||
{
|
||||
|
Reference in New Issue
Block a user