diff --git a/include/rocksdb/utilities/transaction.h b/include/rocksdb/utilities/transaction.h index 099d04be2c2fd96a4ebdb85936358ff31a3401a7..8e9ead11cafc14e5181016cd93908c1133813f20 100644 --- a/include/rocksdb/utilities/transaction.h +++ b/include/rocksdb/utilities/transaction.h @@ -350,6 +350,12 @@ class Transaction { // Has no effect on OptimisticTransactions. virtual void SetLockTimeout(int64_t timeout) = 0; + // Return the WriteOptions that will be used during Commit() + virtual const WriteOptions* GetWriteOptions() = 0; + + // Reset the WriteOptions that will be used during Commit(). + virtual void SetWriteOptions(const WriteOptions& write_options) = 0; + protected: explicit Transaction(const TransactionDB* db) {} Transaction() {} diff --git a/utilities/transactions/transaction_base.h b/utilities/transactions/transaction_base.h index 90a3b59b3a003d9b348b6e9783babfb8f3d2e782..4515bfaf5e8c55d612bfdd8415174b3f9856f26e 100644 --- a/utilities/transactions/transaction_base.h +++ b/utilities/transactions/transaction_base.h @@ -196,6 +196,12 @@ class TransactionBaseImpl : public Transaction { // with writes in other transactions. const TransactionKeyMap& GetTrackedKeys() const { return tracked_keys_; } + const WriteOptions* GetWriteOptions() override { return &write_options_; } + + void SetWriteOptions(const WriteOptions& write_options) override { + write_options_ = write_options; + } + protected: // Add a key to the list of tracked keys. // seqno is the earliest seqno this key was involved with this transaction. @@ -208,7 +214,7 @@ class TransactionBaseImpl : public Transaction { DB* const db_; - const WriteOptions write_options_; + WriteOptions write_options_; const Comparator* cmp_; diff --git a/utilities/transactions/transaction_test.cc b/utilities/transactions/transaction_test.cc index dc69f101c9aab2bbf18a52f42b11ff13c76043b8..48d83f07aa7bcc39a4f68ef723d374b30e26a12f 100644 --- a/utilities/transactions/transaction_test.cc +++ b/utilities/transactions/transaction_test.cc @@ -135,6 +135,24 @@ TEST_F(TransactionTest, FirstWriteTest2) { delete txn; } +TEST_F(TransactionTest, WriteOptionsTest) { + WriteOptions write_options; + write_options.sync = true; + write_options.disableWAL = true; + + Transaction* txn = db->BeginTransaction(write_options); + ASSERT_TRUE(txn); + + ASSERT_TRUE(txn->GetWriteOptions()->sync); + + write_options.sync = false; + txn->SetWriteOptions(write_options); + ASSERT_FALSE(txn->GetWriteOptions()->sync); + ASSERT_TRUE(txn->GetWriteOptions()->disableWAL); + + delete txn; +} + TEST_F(TransactionTest, WriteConflictTest) { WriteOptions write_options; ReadOptions read_options;