diff --git a/dbsim/db_server_service.cpp b/dbsim/db_server_service.cpp index 8fc58dd..d9b1cf9 100644 --- a/dbsim/db_server_service.cpp +++ b/dbsim/db_server_service.cpp @@ -86,7 +86,8 @@ int db::server_service::start_sst( return 0; } -void db::server_service::background_rollback(wsrep::client_state&) +void db::server_service::background_rollback(wsrep::unique_lock&, + wsrep::client_state&) { } diff --git a/dbsim/db_server_service.hpp b/dbsim/db_server_service.hpp index e5cd70d..d62ff11 100644 --- a/dbsim/db_server_service.hpp +++ b/dbsim/db_server_service.hpp @@ -41,7 +41,8 @@ namespace db bool sst_before_init() const override; int start_sst(const std::string&, const wsrep::gtid&, bool) override; std::string sst_request() override; - void background_rollback(wsrep::client_state&) override; + void background_rollback(wsrep::unique_lock&, + wsrep::client_state&) override; void bootstrap() override; void log_message(enum wsrep::log::level, const char* message) override; void log_dummy_write_set(wsrep::client_state&, const wsrep::ws_meta&) diff --git a/include/wsrep/server_service.hpp b/include/wsrep/server_service.hpp index 2021e66..7701bc6 100644 --- a/include/wsrep/server_service.hpp +++ b/include/wsrep/server_service.hpp @@ -85,8 +85,14 @@ namespace wsrep /** * Perform a background rollback for a transaction. + * + * @param lock Lock protecting client state. + * @param client_state Client session to do background rollback + * for. */ - virtual void background_rollback(wsrep::client_state&) = 0; + virtual void background_rollback(wsrep::unique_lock& lock, + wsrep::client_state& client_state) + = 0; /** * Bootstrap a DBMS state for a new cluster. diff --git a/src/transaction.cpp b/src/transaction.cpp index 3860666..9843c18 100644 --- a/src/transaction.cpp +++ b/src/transaction.cpp @@ -1073,7 +1073,7 @@ bool wsrep::transaction::bf_abort( } } - server_service_.background_rollback(client_state_); + server_service_.background_rollback(lock, client_state_); } } return ret; diff --git a/test/mock_client_state.hpp b/test/mock_client_state.hpp index 73b2775..4102e1d 100644 --- a/test/mock_client_state.hpp +++ b/test/mock_client_state.hpp @@ -49,6 +49,8 @@ namespace wsrep (void)client_service().bf_rollback(); } } + void lock() { mutex_.lock(); } + void unlock() { mutex_.unlock(); } private: wsrep::default_mutex mutex_; wsrep::default_condition_variable cond_; diff --git a/test/mock_server_state.hpp b/test/mock_server_state.hpp index fabdf6b..093a620 100644 --- a/test/mock_server_state.hpp +++ b/test/mock_server_state.hpp @@ -184,10 +184,13 @@ namespace wsrep } void - background_rollback(wsrep::client_state& client_state) WSREP_OVERRIDE + background_rollback(wsrep::unique_lock& lock, + wsrep::client_state& client_state) WSREP_OVERRIDE { + lock.unlock(); client_state.before_rollback(); client_state.after_rollback(); + lock.lock(); } int wait_committing_transactions(int) WSREP_OVERRIDE { return 0; }