1ab1231acf
Summary: This is a continuation of https://github.com/facebook/rocksdb/pull/5320/files I open a new mr for these purposes, half a year has past since the old mr is posted so it's almost impossible to fulfill some points below on the old mr, especially 5) 1) add validation modes for optimistic txns 2) modify unittests to test both modes 3) make format 4) refine hash functor 5) push to master Pull Request resolved: https://github.com/facebook/rocksdb/pull/6240 Differential Revision: D19301296 fbshipit-source-id: 5b5b3cbd39558f43947f7d2dec6cd31a06386edb
112 lines
3.7 KiB
C++
112 lines
3.7 KiB
C++
// 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).
|
|
|
|
#ifndef ROCKSDB_LITE
|
|
|
|
#include "utilities/transactions/optimistic_transaction_db_impl.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "db/db_impl/db_impl.h"
|
|
#include "rocksdb/db.h"
|
|
#include "rocksdb/options.h"
|
|
#include "rocksdb/utilities/optimistic_transaction_db.h"
|
|
#include "utilities/transactions/optimistic_transaction.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
Transaction* OptimisticTransactionDBImpl::BeginTransaction(
|
|
const WriteOptions& write_options,
|
|
const OptimisticTransactionOptions& txn_options, Transaction* old_txn) {
|
|
if (old_txn != nullptr) {
|
|
ReinitializeTransaction(old_txn, write_options, txn_options);
|
|
return old_txn;
|
|
} else {
|
|
return new OptimisticTransaction(this, write_options, txn_options);
|
|
}
|
|
}
|
|
|
|
std::unique_lock<std::mutex> OptimisticTransactionDBImpl::LockBucket(
|
|
size_t idx) {
|
|
assert(idx < bucketed_locks_.size());
|
|
return std::unique_lock<std::mutex>(*bucketed_locks_[idx]);
|
|
}
|
|
|
|
Status OptimisticTransactionDB::Open(const Options& options,
|
|
const std::string& dbname,
|
|
OptimisticTransactionDB** dbptr) {
|
|
DBOptions db_options(options);
|
|
ColumnFamilyOptions cf_options(options);
|
|
std::vector<ColumnFamilyDescriptor> column_families;
|
|
column_families.push_back(
|
|
ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
|
|
std::vector<ColumnFamilyHandle*> handles;
|
|
Status s = Open(db_options, dbname, column_families, &handles, dbptr);
|
|
if (s.ok()) {
|
|
assert(handles.size() == 1);
|
|
// i can delete the handle since DBImpl is always holding a reference to
|
|
// default column family
|
|
delete handles[0];
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
Status OptimisticTransactionDB::Open(
|
|
const DBOptions& db_options, const std::string& dbname,
|
|
const std::vector<ColumnFamilyDescriptor>& column_families,
|
|
std::vector<ColumnFamilyHandle*>* handles,
|
|
OptimisticTransactionDB** dbptr) {
|
|
return OptimisticTransactionDB::Open(db_options,
|
|
OptimisticTransactionDBOptions(), dbname,
|
|
column_families, handles, dbptr);
|
|
}
|
|
|
|
Status OptimisticTransactionDB::Open(
|
|
const DBOptions& db_options,
|
|
const OptimisticTransactionDBOptions& occ_options,
|
|
const std::string& dbname,
|
|
const std::vector<ColumnFamilyDescriptor>& column_families,
|
|
std::vector<ColumnFamilyHandle*>* handles,
|
|
OptimisticTransactionDB** dbptr) {
|
|
Status s;
|
|
DB* db;
|
|
|
|
std::vector<ColumnFamilyDescriptor> column_families_copy = column_families;
|
|
|
|
// Enable MemTable History if not already enabled
|
|
for (auto& column_family : column_families_copy) {
|
|
ColumnFamilyOptions* options = &column_family.options;
|
|
|
|
if (options->max_write_buffer_size_to_maintain == 0 &&
|
|
options->max_write_buffer_number_to_maintain == 0) {
|
|
// Setting to -1 will set the History size to
|
|
// max_write_buffer_number * write_buffer_size.
|
|
options->max_write_buffer_size_to_maintain = -1;
|
|
}
|
|
}
|
|
|
|
s = DB::Open(db_options, dbname, column_families_copy, handles, &db);
|
|
|
|
if (s.ok()) {
|
|
*dbptr = new OptimisticTransactionDBImpl(db, occ_options);
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
void OptimisticTransactionDBImpl::ReinitializeTransaction(
|
|
Transaction* txn, const WriteOptions& write_options,
|
|
const OptimisticTransactionOptions& txn_options) {
|
|
assert(dynamic_cast<OptimisticTransaction*>(txn) != nullptr);
|
|
auto txn_impl = reinterpret_cast<OptimisticTransaction*>(txn);
|
|
|
|
txn_impl->Reinitialize(this, write_options, txn_options);
|
|
}
|
|
|
|
} // namespace rocksdb
|
|
#endif // ROCKSDB_LITE
|