#pragma once #include #include #include #include "common/kv/ITransaction.h" #include "common/utils/Coroutine.h" #include "common/utils/Status.h" #include "fdb/FDB.h" namespace hf3fs::kv { class FDBTransaction : public IReadWriteTransaction { public: FDBTransaction(fdb::Transaction &&tr) : tr_(std::move(tr)), errcode_(0) {} // Read operations CoTryTask> snapshotGet(std::string_view key) override; CoTryTask snapshotGetRange(const KeySelector &begin, const KeySelector &end, int32_t limit) override; CoTryTask> get(std::string_view key) override; CoTryTask getRange(const KeySelector &begin, const KeySelector &end, int32_t limit) override; CoTryTask cancel() override; CoTryTask addReadConflict(std::string_view key) override; CoTryTask addReadConflictRange(std::string_view begin, std::string_view end) override; // Write operations CoTryTask set(std::string_view key, std::string_view value) override; CoTryTask clear(std::string_view key) override; CoTryTask setVersionstampedKey(std::string_view key, uint32_t offset, std::string_view value) override; CoTryTask setVersionstampedValue(std::string_view key, std::string_view value, uint32_t offset) override; CoTryTask clearRange(std::string_view begin, std::string_view end); // only used in test. CoTryTask commit() override; void reset() override; Result setOption(FDBTransactionOption option, std::string_view value = {}); CoTask onError(fdb_error_t errcode); CoTryTask getReadVersion(); int64_t getCommittedVersion() override; void setReadVersion(int64_t version) override; fdb_error_t errcode() const { return errcode_; } private: friend class TestFDBTransaction; static Status testFDBError(int errCode, bool commit); fdb::Transaction tr_; std::atomic errcode_; }; } // namespace hf3fs::kv