optimistic_transaction_db_impl.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. #ifndef ROCKSDB_LITE
  6. #include "utilities/transactions/optimistic_transaction_db_impl.h"
  7. #include <string>
  8. #include <vector>
  9. #include "db/db_impl/db_impl.h"
  10. #include "rocksdb/db.h"
  11. #include "rocksdb/options.h"
  12. #include "rocksdb/utilities/optimistic_transaction_db.h"
  13. #include "utilities/transactions/optimistic_transaction.h"
  14. namespace ROCKSDB_NAMESPACE {
  15. Transaction* OptimisticTransactionDBImpl::BeginTransaction(
  16. const WriteOptions& write_options,
  17. const OptimisticTransactionOptions& txn_options, Transaction* old_txn) {
  18. if (old_txn != nullptr) {
  19. ReinitializeTransaction(old_txn, write_options, txn_options);
  20. return old_txn;
  21. } else {
  22. return new OptimisticTransaction(this, write_options, txn_options);
  23. }
  24. }
  25. std::unique_lock<std::mutex> OptimisticTransactionDBImpl::LockBucket(
  26. size_t idx) {
  27. assert(idx < bucketed_locks_.size());
  28. return std::unique_lock<std::mutex>(*bucketed_locks_[idx]);
  29. }
  30. Status OptimisticTransactionDB::Open(const Options& options,
  31. const std::string& dbname,
  32. OptimisticTransactionDB** dbptr) {
  33. DBOptions db_options(options);
  34. ColumnFamilyOptions cf_options(options);
  35. std::vector<ColumnFamilyDescriptor> column_families;
  36. column_families.push_back(
  37. ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
  38. std::vector<ColumnFamilyHandle*> handles;
  39. Status s = Open(db_options, dbname, column_families, &handles, dbptr);
  40. if (s.ok()) {
  41. assert(handles.size() == 1);
  42. // i can delete the handle since DBImpl is always holding a reference to
  43. // default column family
  44. delete handles[0];
  45. }
  46. return s;
  47. }
  48. Status OptimisticTransactionDB::Open(
  49. const DBOptions& db_options, const std::string& dbname,
  50. const std::vector<ColumnFamilyDescriptor>& column_families,
  51. std::vector<ColumnFamilyHandle*>* handles,
  52. OptimisticTransactionDB** dbptr) {
  53. return OptimisticTransactionDB::Open(db_options,
  54. OptimisticTransactionDBOptions(), dbname,
  55. column_families, handles, dbptr);
  56. }
  57. Status OptimisticTransactionDB::Open(
  58. const DBOptions& db_options,
  59. const OptimisticTransactionDBOptions& occ_options,
  60. const std::string& dbname,
  61. const std::vector<ColumnFamilyDescriptor>& column_families,
  62. std::vector<ColumnFamilyHandle*>* handles,
  63. OptimisticTransactionDB** dbptr) {
  64. Status s;
  65. DB* db;
  66. std::vector<ColumnFamilyDescriptor> column_families_copy = column_families;
  67. // Enable MemTable History if not already enabled
  68. for (auto& column_family : column_families_copy) {
  69. ColumnFamilyOptions* options = &column_family.options;
  70. if (options->max_write_buffer_size_to_maintain == 0 &&
  71. options->max_write_buffer_number_to_maintain == 0) {
  72. // Setting to -1 will set the History size to
  73. // max_write_buffer_number * write_buffer_size.
  74. options->max_write_buffer_size_to_maintain = -1;
  75. }
  76. }
  77. s = DB::Open(db_options, dbname, column_families_copy, handles, &db);
  78. if (s.ok()) {
  79. *dbptr = new OptimisticTransactionDBImpl(db, occ_options);
  80. }
  81. return s;
  82. }
  83. void OptimisticTransactionDBImpl::ReinitializeTransaction(
  84. Transaction* txn, const WriteOptions& write_options,
  85. const OptimisticTransactionOptions& txn_options) {
  86. assert(dynamic_cast<OptimisticTransaction*>(txn) != nullptr);
  87. auto txn_impl = reinterpret_cast<OptimisticTransaction*>(txn);
  88. txn_impl->Reinitialize(this, write_options, txn_options);
  89. }
  90. } // namespace ROCKSDB_NAMESPACE
  91. #endif // ROCKSDB_LITE