2015-05-29 21:36:35 +00:00
|
|
|
// 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.
|
|
|
|
|
|
|
|
#ifndef ROCKSDB_LITE
|
|
|
|
|
|
|
|
#include "utilities/transactions/optimistic_transaction_impl.h"
|
|
|
|
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
#include <algorithm>
|
2015-05-29 21:36:35 +00:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "db/column_family.h"
|
|
|
|
#include "db/db_impl.h"
|
|
|
|
#include "rocksdb/comparator.h"
|
|
|
|
#include "rocksdb/db.h"
|
|
|
|
#include "rocksdb/status.h"
|
|
|
|
#include "rocksdb/utilities/optimistic_transaction_db.h"
|
|
|
|
#include "util/string_util.h"
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
#include "utilities/transactions/transaction_util.h"
|
2015-05-29 21:36:35 +00:00
|
|
|
|
|
|
|
namespace rocksdb {
|
|
|
|
|
|
|
|
struct WriteOptions;
|
|
|
|
|
|
|
|
OptimisticTransactionImpl::OptimisticTransactionImpl(
|
|
|
|
OptimisticTransactionDB* txn_db, const WriteOptions& write_options,
|
|
|
|
const OptimisticTransactionOptions& txn_options)
|
2015-08-21 22:47:21 +00:00
|
|
|
: TransactionBaseImpl(txn_db->GetBaseDB(), write_options), txn_db_(txn_db) {
|
2015-05-29 21:36:35 +00:00
|
|
|
if (txn_options.set_snapshot) {
|
|
|
|
SetSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
OptimisticTransactionImpl::~OptimisticTransactionImpl() {
|
2015-07-31 22:18:27 +00:00
|
|
|
}
|
|
|
|
|
2015-08-25 02:13:18 +00:00
|
|
|
void OptimisticTransactionImpl::Clear() {
|
|
|
|
TransactionBaseImpl::Clear();
|
2015-05-29 21:36:35 +00:00
|
|
|
tracked_keys_.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
Status OptimisticTransactionImpl::Commit() {
|
|
|
|
// Set up callback which will call CheckTransactionForConflicts() to
|
|
|
|
// check whether this transaction is safe to be committed.
|
|
|
|
OptimisticTransactionCallback callback(this);
|
|
|
|
|
|
|
|
DBImpl* db_impl = dynamic_cast<DBImpl*>(db_->GetRootDB());
|
|
|
|
if (db_impl == nullptr) {
|
|
|
|
// This should only happen if we support creating transactions from
|
|
|
|
// a StackableDB and someone overrides GetRootDB().
|
|
|
|
return Status::InvalidArgument(
|
|
|
|
"DB::GetRootDB() returned an unexpected DB class");
|
|
|
|
}
|
|
|
|
|
|
|
|
Status s = db_impl->WriteWithCallback(
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
write_options_, write_batch_->GetWriteBatch(), &callback);
|
2015-05-29 21:36:35 +00:00
|
|
|
|
|
|
|
if (s.ok()) {
|
2015-08-25 02:13:18 +00:00
|
|
|
Clear();
|
2015-05-29 21:36:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2015-08-25 02:13:18 +00:00
|
|
|
void OptimisticTransactionImpl::Rollback() { Clear(); }
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
|
2015-05-29 21:36:35 +00:00
|
|
|
// Record this key so that we can check it for conflicts at commit time.
|
2015-08-21 22:47:21 +00:00
|
|
|
Status OptimisticTransactionImpl::TryLock(ColumnFamilyHandle* column_family,
|
|
|
|
const Slice& key, bool untracked) {
|
|
|
|
if (untracked) {
|
|
|
|
return Status::OK();
|
|
|
|
}
|
2015-05-29 21:36:35 +00:00
|
|
|
uint32_t cfh_id = GetColumnFamilyID(column_family);
|
|
|
|
|
|
|
|
SequenceNumber seq;
|
|
|
|
if (snapshot_) {
|
2015-07-31 22:18:27 +00:00
|
|
|
seq = snapshot_->snapshot()->GetSequenceNumber();
|
2015-05-29 21:36:35 +00:00
|
|
|
} else {
|
|
|
|
seq = db_->GetLatestSequenceNumber();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string key_str = key.ToString();
|
|
|
|
|
|
|
|
auto iter = tracked_keys_[cfh_id].find(key_str);
|
|
|
|
if (iter == tracked_keys_[cfh_id].end()) {
|
|
|
|
// key not yet seen, store it.
|
|
|
|
tracked_keys_[cfh_id].insert({std::move(key_str), seq});
|
|
|
|
} else {
|
|
|
|
SequenceNumber old_seq = iter->second;
|
|
|
|
if (seq < old_seq) {
|
|
|
|
// Snapshot has changed since we last saw this key, need to
|
|
|
|
// store the earliest seen sequence number.
|
|
|
|
tracked_keys_[cfh_id][key_str] = seq;
|
|
|
|
}
|
|
|
|
}
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
|
2015-08-21 22:47:21 +00:00
|
|
|
// Always return OK. Confilct checking will happen at commit time.
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
return Status::OK();
|
2015-05-29 21:36:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
//
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
// Should only be called on writer thread in order to avoid any race conditions
|
|
|
|
// in detecting
|
|
|
|
// write conflicts.
|
2015-05-29 21:36:35 +00:00
|
|
|
Status OptimisticTransactionImpl::CheckTransactionForConflicts(DB* db) {
|
|
|
|
Status result;
|
|
|
|
|
|
|
|
assert(dynamic_cast<DBImpl*>(db) != nullptr);
|
|
|
|
auto db_impl = reinterpret_cast<DBImpl*>(db);
|
|
|
|
|
Pessimistic Transactions
Summary:
Initial implementation of Pessimistic Transactions. This diff contains the api changes discussed in D38913. This diff is pretty large, so let me know if people would prefer to meet up to discuss it.
MyRocks folks: please take a look at the API in include/rocksdb/utilities/transaction[_db].h and let me know if you have any issues.
Also, you'll notice a couple of TODOs in the implementation of RollbackToSavePoint(). After chatting with Siying, I'm going to send out a separate diff for an alternate implementation of this feature that implements the rollback inside of WriteBatch/WriteBatchWithIndex. We can then decide which route is preferable.
Next, I'm planning on doing some perf testing and then integrating this diff into MongoRocks for further testing.
Test Plan: Unit tests, db_bench parallel testing.
Reviewers: igor, rven, sdong, yhchiang, yoshinorim
Reviewed By: sdong
Subscribers: hermanlee4, maykov, spetrunia, leveldb, dhruba
Differential Revision: https://reviews.facebook.net/D40869
2015-05-26 00:37:33 +00:00
|
|
|
return TransactionUtil::CheckKeysForConflicts(db_impl, &tracked_keys_);
|
2015-05-29 21:36:35 +00:00
|
|
|
}
|
|
|
|
|
2015-08-25 02:13:18 +00:00
|
|
|
uint64_t OptimisticTransactionImpl::GetNumKeys() const {
|
|
|
|
uint64_t count = 0;
|
|
|
|
|
|
|
|
// sum up locked keys in all column families
|
|
|
|
for (const auto& key_map_iter : tracked_keys_) {
|
|
|
|
const auto& keys = key_map_iter.second;
|
|
|
|
count += keys.size();
|
|
|
|
}
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
2015-05-29 21:36:35 +00:00
|
|
|
} // namespace rocksdb
|
|
|
|
|
|
|
|
#endif // ROCKSDB_LITE
|