mirror of
https://github.com/codership/wsrep-lib.git
synced 2025-11-01 17:51:06 +03:00
codership/wsrep-lib#23 before_command() wait for ongoing rollbacks leaks
Storing information that background rollbacker in ongoing in client state has_rollback_ This can be used for detecting if there is ongoing background rollback, and client should keep waiting in before_command() entry to avoid conflicts in accessing client state during background rollbacking. transaction::bf_abort() is modified to set has_rollback_ flag when backgroung rollbacking has been assigned for the client sync_rollback_complete() method has been modified to reset the backround rollbacker flag
This commit is contained in:
@@ -37,6 +37,7 @@ void wsrep::client_state::open(wsrep::client_id id)
|
||||
debug_log_state("open: enter");
|
||||
owning_thread_id_ = wsrep::this_thread::get_id();
|
||||
current_thread_id_ = owning_thread_id_;
|
||||
has_rollbacker_ = false;
|
||||
state(lock, s_idle);
|
||||
id_ = id;
|
||||
debug_log_state("open: leave");
|
||||
@@ -86,7 +87,10 @@ int wsrep::client_state::before_command()
|
||||
if (transaction_.active() &&
|
||||
server_state_.rollback_mode() == wsrep::server_state::rm_sync)
|
||||
{
|
||||
while (transaction_.state() == wsrep::transaction::s_aborting)
|
||||
/*
|
||||
* has_rollbacker() returns false, when background rollback is over
|
||||
*/
|
||||
while (has_rollbacker())
|
||||
{
|
||||
cond_.wait(lock);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user