From f7f4595d9075df501db3a4f8a7ce62167b2c5060 Mon Sep 17 00:00:00 2001 From: sfc-gh-tclinkenbeard Date: Mon, 10 May 2021 15:33:44 -0700 Subject: [PATCH] Fix SEGFAULT in call to ReadYourWritesTransaction::preinitializeOnForeignThread --- fdbclient/ISingleThreadTransaction.cpp | 23 +++++++++------------ fdbclient/ISingleThreadTransaction.h | 1 - fdbclient/ReadYourWrites.h | 2 +- fdbclient/SimpleConfigTransaction.actor.cpp | 2 -- fdbclient/SimpleConfigTransaction.h | 1 - 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/fdbclient/ISingleThreadTransaction.cpp b/fdbclient/ISingleThreadTransaction.cpp index 3e73fc03bd..38413ef378 100644 --- a/fdbclient/ISingleThreadTransaction.cpp +++ b/fdbclient/ISingleThreadTransaction.cpp @@ -24,20 +24,17 @@ #include "fdbclient/SimpleConfigTransaction.h" ISingleThreadTransaction* ISingleThreadTransaction::allocateOnForeignThread(Type type) { - ISingleThreadTransaction* tr; - switch (type) { - case Type::RYW: - tr = (ReadYourWritesTransaction*)(ReadYourWritesTransaction::operator new(sizeof(ReadYourWritesTransaction))); - break; - case Type::SIMPLE_CONFIG: - tr = (SimpleConfigTransaction*)(SimpleConfigTransaction::operator new(sizeof(SimpleConfigTransaction))); - break; - default: - ASSERT(false); - return nullptr; + if (type == Type::RYW) { + auto tr = + (ReadYourWritesTransaction*)(ReadYourWritesTransaction::operator new(sizeof(ReadYourWritesTransaction))); + tr->preinitializeOnForeignThread(); + return tr; + } else if (type == Type::SIMPLE_CONFIG) { + auto tr = (SimpleConfigTransaction*)(SimpleConfigTransaction::operator new(sizeof(SimpleConfigTransaction))); + return tr; } - tr->preinitializeOnForeignThread(); - return tr; + ASSERT(false); + return nullptr; } void ISingleThreadTransaction::create(ISingleThreadTransaction* tr, Type type, Database db) { diff --git a/fdbclient/ISingleThreadTransaction.h b/fdbclient/ISingleThreadTransaction.h index f1337c1380..72fba69226 100644 --- a/fdbclient/ISingleThreadTransaction.h +++ b/fdbclient/ISingleThreadTransaction.h @@ -79,7 +79,6 @@ public: virtual void debugTransaction(UID dID) = 0; virtual void checkDeferredError() = 0; virtual void getWriteConflicts(KeyRangeMap* result) = 0; - virtual void preinitializeOnForeignThread() = 0; // Used by ThreadSafeTransaction for exceptions thrown in void methods Error deferredError; diff --git a/fdbclient/ReadYourWrites.h b/fdbclient/ReadYourWrites.h index 76cbb49aa0..f03db0a7a3 100644 --- a/fdbclient/ReadYourWrites.h +++ b/fdbclient/ReadYourWrites.h @@ -152,7 +152,7 @@ public: void getWriteConflicts(KeyRangeMap* result) override; - void preinitializeOnForeignThread() override; + void preinitializeOnForeignThread(); Database getDatabase() const { return tr.getDatabase(); } diff --git a/fdbclient/SimpleConfigTransaction.actor.cpp b/fdbclient/SimpleConfigTransaction.actor.cpp index 483eae46b1..b069168e83 100644 --- a/fdbclient/SimpleConfigTransaction.actor.cpp +++ b/fdbclient/SimpleConfigTransaction.actor.cpp @@ -215,8 +215,6 @@ void SimpleConfigTransaction::checkDeferredError() { void SimpleConfigTransaction::getWriteConflicts(KeyRangeMap* result) {} -void SimpleConfigTransaction::preinitializeOnForeignThread() {} - SimpleConfigTransaction::SimpleConfigTransaction(ClusterConnectionString const& ccs) : impl(std::make_unique(ccs)) {} diff --git a/fdbclient/SimpleConfigTransaction.h b/fdbclient/SimpleConfigTransaction.h index 8a95caeae2..c9762944cd 100644 --- a/fdbclient/SimpleConfigTransaction.h +++ b/fdbclient/SimpleConfigTransaction.h @@ -80,6 +80,5 @@ public: void debugTransaction(UID dID) override; void checkDeferredError() override; void getWriteConflicts(KeyRangeMap* result) override; - void preinitializeOnForeignThread() override; void fullReset(); };