From aa122bfbd3eea98fa4e4b21c1c0e9f705b906291 Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Thu, 28 Nov 2024 12:55:35 +0200 Subject: [PATCH] Add 2pc switch to dbsim, release critical section in callback --- dbsim/db_client.cpp | 18 ++++++++++++++++-- dbsim/db_client.hpp | 1 - dbsim/db_params.cpp | 3 +++ dbsim/db_params.hpp | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/dbsim/db_client.cpp b/dbsim/db_client.cpp index 77e0b47c..1bf484cd 100644 --- a/dbsim/db_client.cpp +++ b/dbsim/db_client.cpp @@ -93,6 +93,15 @@ int db::client::client_command(F f) return err; } +static void release_commit_critical_section(void* ptr) +{ + auto* crit = static_cast(ptr); + if (crit->lock.owns_lock()) + { + crit->lock.unlock(); + } +} + void db::client::run_one_transaction() { if (params_.sync_wait) @@ -152,10 +161,15 @@ void db::client::run_one_transaction() commit_crit.lock.unlock(); } + wsrep::provider::seq_cb seq_cb { + &commit_crit, + release_commit_critical_section + }; + assert(err == 0); - if (do_2pc()) + if (params_.do_2pc) { - err = err || client_state_.before_prepare(); + err = err || client_state_.before_prepare(&seq_cb); err = err || client_state_.after_prepare(); } err = err || client_state_.before_commit(); diff --git a/dbsim/db_client.hpp b/dbsim/db_client.hpp index 5536a449..ca93a187 100644 --- a/dbsim/db_client.hpp +++ b/dbsim/db_client.hpp @@ -62,7 +62,6 @@ namespace db void start(); wsrep::client_state& client_state() { return client_state_; } wsrep::client_service& client_service() { return client_service_; } - bool do_2pc() const { return false; } private: friend class db::server_state; friend class db::client_service; diff --git a/dbsim/db_params.cpp b/dbsim/db_params.cpp index 0913e841..b7a036bd 100644 --- a/dbsim/db_params.cpp +++ b/dbsim/db_params.cpp @@ -98,6 +98,9 @@ db::params db::parse_args(int argc, char** argv) ("check-sequential-consistency", po::value(¶ms.check_sequential_consistency), "Check if the provider provides sequential consistency") + ("do-2pc", + po::value(¶ms.do_2pc), + "Run commits in 2pc") ; try { diff --git a/dbsim/db_params.hpp b/dbsim/db_params.hpp index cf29987e..6e7a4188 100644 --- a/dbsim/db_params.hpp +++ b/dbsim/db_params.hpp @@ -47,6 +47,7 @@ namespace db bool cond_checks{false}; int tls_service{0}; bool check_sequential_consistency{false}; + bool do_2pc{false}; }; params parse_args(int argc, char** argv);