// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #ifndef ROCKSDB_LITE #include #include #include #include #include #include #include #include "db/write_callback.h" #include "rocksdb/db.h" #include "rocksdb/slice.h" #include "rocksdb/snapshot.h" #include "rocksdb/status.h" #include "rocksdb/types.h" #include "rocksdb/utilities/transaction.h" #include "rocksdb/utilities/transaction_db.h" #include "rocksdb/utilities/write_batch_with_index.h" #include "util/autovector.h" #include "utilities/transactions/pessimistic_transaction.h" #include "utilities/transactions/pessimistic_transaction_db.h" #include "utilities/transactions/transaction_base.h" #include "utilities/transactions/transaction_util.h" namespace rocksdb { class WritePreparedTxnDB; // This impl could write to DB also uncomitted data and then later tell apart // committed data from uncomitted data. Uncommitted data could be after the // Prepare phase in 2PC (WritePreparedTxn) or before that // (WriteUnpreparedTxnImpl). class WritePreparedTxn : public PessimisticTransaction { public: WritePreparedTxn(WritePreparedTxnDB* db, const WriteOptions& write_options, const TransactionOptions& txn_options); virtual ~WritePreparedTxn() {} Status CommitBatch(WriteBatch* batch) override; Status Rollback() override; private: Status PrepareInternal() override; Status CommitWithoutPrepareInternal() override; Status CommitInternal() override; // TODO(myabandeh): verify that the current impl work with values being // written with prepare sequence number too. // Status ValidateSnapshot(ColumnFamilyHandle* column_family, const Slice& // key, // SequenceNumber prev_seqno, SequenceNumber* // new_seqno); // No copying allowed WritePreparedTxn(const WritePreparedTxn&); void operator=(const WritePreparedTxn&); WritePreparedTxnDB* wpt_db_; uint64_t prepare_seq_; }; } // namespace rocksdb #endif // ROCKSDB_LITE