20d1e547d1
Summary: As I keep adding new features to transactions, I keep creating more duplicate code. This diff cleans this up by creating a base implementation class for Transaction and OptimisticTransaction to inherit from. The code in TransactionBase.h/.cc is all just copied from elsewhere. The only entertaining part of this class worth looking at is the virtual TryLock method which allows OptimisticTransactions and Transactions to share the same common code for Put/Get/etc. The rest of this diff is mostly red and easy on the eyes. Test Plan: No functionality change. existing tests pass. Reviewers: sdong, jkedgar, rven, igor Reviewed By: igor Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D45135
89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
// Copyright (c) 2015, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
#pragma once
|
|
|
|
#ifndef ROCKSDB_LITE
|
|
|
|
#include <stack>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#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/optimistic_transaction_db.h"
|
|
#include "rocksdb/utilities/write_batch_with_index.h"
|
|
#include "utilities/transactions/transaction_base.h"
|
|
#include "utilities/transactions/transaction_util.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class OptimisticTransactionImpl : public TransactionBaseImpl {
|
|
public:
|
|
OptimisticTransactionImpl(OptimisticTransactionDB* db,
|
|
const WriteOptions& write_options,
|
|
const OptimisticTransactionOptions& txn_options);
|
|
|
|
virtual ~OptimisticTransactionImpl();
|
|
|
|
Status Commit() override;
|
|
|
|
void Rollback() override;
|
|
|
|
const TransactionKeyMap* GetTrackedKeys() const { return &tracked_keys_; }
|
|
|
|
protected:
|
|
Status TryLock(ColumnFamilyHandle* column_family, const Slice& key,
|
|
bool untracked = false) override;
|
|
|
|
private:
|
|
OptimisticTransactionDB* const txn_db_;
|
|
|
|
// Map of Column Family IDs to keys and corresponding sequence numbers.
|
|
// The sequence number stored for a key will be used during commit to make
|
|
// sure this key has
|
|
// not changed since this sequence number.
|
|
TransactionKeyMap tracked_keys_;
|
|
|
|
friend class OptimisticTransactionCallback;
|
|
|
|
// Returns OK if it is safe to commit this transaction. Returns Status::Busy
|
|
// if there are read or write conflicts that would prevent us from committing
|
|
// OR if we can not determine whether there would be any such conflicts.
|
|
//
|
|
// Should only be called on writer thread.
|
|
Status CheckTransactionForConflicts(DB* db);
|
|
|
|
void Cleanup();
|
|
|
|
// No copying allowed
|
|
OptimisticTransactionImpl(const OptimisticTransactionImpl&);
|
|
void operator=(const OptimisticTransactionImpl&);
|
|
};
|
|
|
|
// Used at commit time to trigger transaction validation
|
|
class OptimisticTransactionCallback : public WriteCallback {
|
|
public:
|
|
explicit OptimisticTransactionCallback(OptimisticTransactionImpl* txn)
|
|
: txn_(txn) {}
|
|
|
|
Status Callback(DB* db) override {
|
|
return txn_->CheckTransactionForConflicts(db);
|
|
}
|
|
|
|
private:
|
|
OptimisticTransactionImpl* txn_;
|
|
};
|
|
|
|
} // namespace rocksdb
|
|
|
|
#endif // ROCKSDB_LITE
|