From 47a3ed4d744f1d9c1a6228206a09359adca3ea0d Mon Sep 17 00:00:00 2001 From: Charles Ruan Date: Fri, 7 Mar 2025 00:23:26 +0800 Subject: [PATCH] Abstract KV layer options to eliminate dynamic casts to FDBTransaction --- src/common/kv/ITransaction.h | 11 +++++++++++ src/common/kv/mem/MemTransaction.h | 7 +++++++ src/fdb/FDBTransaction.cc | 16 ++++++++++++++++ src/fdb/FDBTransaction.h | 2 ++ src/meta/components/GcManager.cc | 10 ++++------ src/meta/store/Operation.h | 5 ++--- tests/common/TestWithTransaction.cc | 9 +++++++++ 7 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/common/kv/ITransaction.h b/src/common/kv/ITransaction.h index cb1c2d5..90ed948 100644 --- a/src/common/kv/ITransaction.h +++ b/src/common/kv/ITransaction.h @@ -31,6 +31,13 @@ static constexpr std::string_view kMetadataVersionKey = "\xff/metadataVersion"; using Versionstamp = std::array; static_assert(sizeof(Versionstamp) == 10); +enum class Priority : uint8_t { + MIN = 0, + LOW = 1, + HIGH = 2, + MAX = 3, +}; + class IReadOnlyTransaction { public: virtual ~IReadOnlyTransaction() = default; @@ -83,6 +90,8 @@ class IReadOnlyTransaction { virtual CoTryTask cancel() = 0; virtual void reset() = 0; + + virtual Result enableStaleRead() = 0; }; class IReadWriteTransaction : public IReadOnlyTransaction { @@ -109,6 +118,8 @@ class IReadWriteTransaction : public IReadOnlyTransaction { virtual CoTryTask commit() = 0; virtual int64_t getCommittedVersion() = 0; + + virtual Result setPriority(Priority priority) = 0; }; struct TransactionHelper { diff --git a/src/common/kv/mem/MemTransaction.h b/src/common/kv/mem/MemTransaction.h index e2ab1d3..1ad7321 100644 --- a/src/common/kv/mem/MemTransaction.h +++ b/src/common/kv/mem/MemTransaction.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -245,6 +246,12 @@ class MemTransaction : public IReadWriteTransaction { writeConflicts_.clear(); } + Result enableStaleRead() override { return Void{}; } + Result setPriority(Priority priority) override { + boost::ignore_unused(priority); + return Void{}; + } + // check txn1 updated txn2's read set static bool checkConflict(MemTransaction &txn1, MemTransaction &txn2) { std::scoped_lock guard1(txn1.mutex_); diff --git a/src/fdb/FDBTransaction.cc b/src/fdb/FDBTransaction.cc index 8f9c771..128b386 100644 --- a/src/fdb/FDBTransaction.cc +++ b/src/fdb/FDBTransaction.cc @@ -392,6 +392,22 @@ void FDBTransaction::reset() { tr_.reset(); } +Result FDBTransaction::enableStaleRead() { + return setOption(FDBTransactionOption::FDB_TR_OPTION_USE_GRV_CACHE, {}); +} + +Result FDBTransaction::setPriority(Priority priority) { + assert(priority > PRIORITY::MIN && priority < PRIORITY::MAX); + switch (priority) { + case Priority::LOW: { + return setOption(FDBTransactionOption::FDB_TR_OPTION_PRIORITY_BATCH, {}); + } break; + default: { + return Void{}; + } break; + } +} + Result FDBTransaction::setOption(FDBTransactionOption option, std::string_view value) { fdb_error_t errcode = tr_.setOption(option, value); if (errcode != 0) { diff --git a/src/fdb/FDBTransaction.h b/src/fdb/FDBTransaction.h index 0024159..e6e07ee 100644 --- a/src/fdb/FDBTransaction.h +++ b/src/fdb/FDBTransaction.h @@ -40,6 +40,8 @@ class FDBTransaction : public IReadWriteTransaction { CoTryTask commit() override; void reset() override; + Result enableStaleRead() override; + Result setPriority(Priority priority) override; Result setOption(FDBTransactionOption option, std::string_view value = {}); CoTask onError(fdb_error_t errcode); diff --git a/src/meta/components/GcManager.cc b/src/meta/components/GcManager.cc index f20eb6d..1f460d6 100644 --- a/src/meta/components/GcManager.cc +++ b/src/meta/components/GcManager.cc @@ -306,9 +306,8 @@ CoTryTask GcManager::GcTask::gcDirectory(GcManager &manager) { auto finished = false; auto checked = false; auto handler = [&](IReadWriteTransaction &txn) -> CoTryTask { - auto fdbTxn = dynamic_cast(&txn); - if (fdbTxn && manager.config_.gc().txn_low_priority()) { - fdbTxn->setOption(FDBTransactionOption::FDB_TR_OPTION_PRIORITY_BATCH, {}); + if (manager.config_.gc().txn_low_priority()) { + txn.setPriority(kv::Priority::LOW); } if (!checked) { auto loadInode = co_await Inode::load(txn, taskEntry.id); @@ -375,9 +374,8 @@ CoTryTask GcManager::GcTask::gcFile(GcManager &manager) { XLOGF(DBG, "Gc file {}", taskEntry.id); auto load = co_await manager.runReadOnly([&](auto &txn) -> CoTryTask> { - auto fdbTxn = dynamic_cast(&txn); - if (fdbTxn && manager.config_.gc().txn_low_priority()) { - fdbTxn->setOption(FDBTransactionOption::FDB_TR_OPTION_PRIORITY_BATCH, {}); + if (manager.config_.gc().txn_low_priority()) { + txn.setPriority(kv::Priority::LOW); } if (!manager.config_.gc().check_session()) { co_return co_await Inode::snapshotLoad(txn, taskEntry.id); diff --git a/src/meta/store/Operation.h b/src/meta/store/Operation.h index 3816d2e..e5ce4ee 100644 --- a/src/meta/store/Operation.h +++ b/src/meta/store/Operation.h @@ -168,9 +168,8 @@ class OperationDriver { } auto grvCache = operation_.isReadOnly() && enableGrvCache; - if (grvCache && dynamic_cast(txn.get())) { - auto fdbTxn = dynamic_cast(txn.get()); - CO_RETURN_ON_ERROR(fdbTxn->setOption(FDBTransactionOption::FDB_TR_OPTION_USE_GRV_CACHE, {})); + if (grvCache) { + CO_RETURN_ON_ERROR(txn->enableStaleRead()); } Result result = makeError(MetaCode::kOperationTimeout); diff --git a/tests/common/TestWithTransaction.cc b/tests/common/TestWithTransaction.cc index b23283c..29913ac 100644 --- a/tests/common/TestWithTransaction.cc +++ b/tests/common/TestWithTransaction.cc @@ -1,3 +1,4 @@ +#include #include #include #include @@ -65,6 +66,8 @@ class MockROTxn : public IReadOnlyTransaction { void reset() override {} void setReadVersion(int64_t) override {} + + Result enableStaleRead() override { return Void{}; } }; class MockRWTxn : public IReadWriteTransaction { @@ -113,6 +116,12 @@ class MockRWTxn : public IReadWriteTransaction { void reset() override {} + Result enableStaleRead() override { return Void{}; } + Result setPriority(Priority priority) override { + boost::ignore_unused(priority); + return Void{}; + } + private: OpResultSeq &commitSeq_; };