diff --git a/include/wsrep/server_service.hpp b/include/wsrep/server_service.hpp index 25b265e..75572ae 100644 --- a/include/wsrep/server_service.hpp +++ b/include/wsrep/server_service.hpp @@ -85,6 +85,7 @@ namespace wsrep /** * Perform a background rollback for a transaction. + * @return true if rollbacker was not started, false otherwise */ virtual bool background_rollback(wsrep::client_state&) = 0; diff --git a/src/transaction.cpp b/src/transaction.cpp index d581c2f..bcc430f 100644 --- a/src/transaction.cpp +++ b/src/transaction.cpp @@ -1076,8 +1076,17 @@ bool wsrep::transaction::bf_abort( lock.unlock(); /* if background rollback is skipped, reset rollbacker activity */ if (server_service_.background_rollback(client_state_)) - client_state_.set_rollbacker_active(false); - lock.lock(); + { + lock.lock(); + client_state_.set_rollbacker_active(false); + + /* release the victim from waiting, if it has advanced to + wait_rollback_complete_and_acquire_ownership stage */ + if (client_state_.state() == wsrep::client_state::s_idle) + client_state_.cond_.notify_all(); + } + else + lock.lock(); } } return ret;