optimistic_transaction_db_impl.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #pragma once
  6. #ifndef ROCKSDB_LITE
  7. #include <mutex>
  8. #include <vector>
  9. #include <algorithm>
  10. #include "rocksdb/db.h"
  11. #include "rocksdb/options.h"
  12. #include "rocksdb/utilities/optimistic_transaction_db.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. class OptimisticTransactionDBImpl : public OptimisticTransactionDB {
  15. public:
  16. explicit OptimisticTransactionDBImpl(
  17. DB* db, const OptimisticTransactionDBOptions& occ_options,
  18. bool take_ownership = true)
  19. : OptimisticTransactionDB(db),
  20. db_owner_(take_ownership),
  21. validate_policy_(occ_options.validate_policy) {
  22. if (validate_policy_ == OccValidationPolicy::kValidateParallel) {
  23. uint32_t bucket_size = std::max(16u, occ_options.occ_lock_buckets);
  24. bucketed_locks_.reserve(bucket_size);
  25. for (size_t i = 0; i < bucket_size; ++i) {
  26. bucketed_locks_.emplace_back(
  27. std::unique_ptr<std::mutex>(new std::mutex));
  28. }
  29. }
  30. }
  31. ~OptimisticTransactionDBImpl() {
  32. // Prevent this stackable from destroying
  33. // base db
  34. if (!db_owner_) {
  35. db_ = nullptr;
  36. }
  37. }
  38. Transaction* BeginTransaction(const WriteOptions& write_options,
  39. const OptimisticTransactionOptions& txn_options,
  40. Transaction* old_txn) override;
  41. size_t GetLockBucketsSize() const { return bucketed_locks_.size(); }
  42. OccValidationPolicy GetValidatePolicy() const { return validate_policy_; }
  43. std::unique_lock<std::mutex> LockBucket(size_t idx);
  44. private:
  45. // NOTE: used in validation phase. Each key is hashed into some
  46. // bucket. We then take the lock in the hash value order to avoid deadlock.
  47. std::vector<std::unique_ptr<std::mutex>> bucketed_locks_;
  48. bool db_owner_;
  49. const OccValidationPolicy validate_policy_;
  50. void ReinitializeTransaction(Transaction* txn,
  51. const WriteOptions& write_options,
  52. const OptimisticTransactionOptions& txn_options =
  53. OptimisticTransactionOptions());
  54. };
  55. } // namespace ROCKSDB_NAMESPACE
  56. #endif // ROCKSDB_LITE