optimistic_transaction_db_impl.cc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. #include "utilities/transactions/optimistic_transaction_db_impl.h"
  6. #include <string>
  7. #include <vector>
  8. #include "db/db_impl/db_impl.h"
  9. #include "rocksdb/db.h"
  10. #include "rocksdb/options.h"
  11. #include "rocksdb/utilities/optimistic_transaction_db.h"
  12. #include "utilities/transactions/optimistic_transaction.h"
  13. namespace ROCKSDB_NAMESPACE {
  14. std::shared_ptr<OccLockBuckets> MakeSharedOccLockBuckets(size_t bucket_count,
  15. bool cache_aligned) {
  16. if (cache_aligned) {
  17. return std::make_shared<OccLockBucketsImpl<true>>(bucket_count);
  18. } else {
  19. return std::make_shared<OccLockBucketsImpl<false>>(bucket_count);
  20. }
  21. }
  22. Transaction* OptimisticTransactionDBImpl::BeginTransaction(
  23. const WriteOptions& write_options,
  24. const OptimisticTransactionOptions& txn_options, Transaction* old_txn) {
  25. if (old_txn != nullptr) {
  26. ReinitializeTransaction(old_txn, write_options, txn_options);
  27. return old_txn;
  28. } else {
  29. return new OptimisticTransaction(this, write_options, txn_options);
  30. }
  31. }
  32. Status OptimisticTransactionDB::Open(const Options& options,
  33. const std::string& dbname,
  34. OptimisticTransactionDB** dbptr) {
  35. DBOptions db_options(options);
  36. ColumnFamilyOptions cf_options(options);
  37. std::vector<ColumnFamilyDescriptor> column_families;
  38. column_families.emplace_back(kDefaultColumnFamilyName, cf_options);
  39. std::vector<ColumnFamilyHandle*> handles;
  40. Status s = Open(db_options, dbname, column_families, &handles, dbptr);
  41. if (s.ok()) {
  42. assert(handles.size() == 1);
  43. // i can delete the handle since DBImpl is always holding a reference to
  44. // default column family
  45. delete handles[0];
  46. }
  47. return s;
  48. }
  49. Status OptimisticTransactionDB::Open(
  50. const DBOptions& db_options, const std::string& dbname,
  51. const std::vector<ColumnFamilyDescriptor>& column_families,
  52. std::vector<ColumnFamilyHandle*>* handles,
  53. OptimisticTransactionDB** dbptr) {
  54. return OptimisticTransactionDB::Open(db_options,
  55. OptimisticTransactionDBOptions(), dbname,
  56. column_families, handles, dbptr);
  57. }
  58. Status OptimisticTransactionDB::Open(
  59. const DBOptions& db_options,
  60. const OptimisticTransactionDBOptions& occ_options,
  61. const std::string& dbname,
  62. const std::vector<ColumnFamilyDescriptor>& column_families,
  63. std::vector<ColumnFamilyHandle*>* handles,
  64. OptimisticTransactionDB** dbptr) {
  65. Status s;
  66. DB* db;
  67. std::vector<ColumnFamilyDescriptor> column_families_copy = column_families;
  68. // Enable MemTable History if not already enabled
  69. for (auto& column_family : column_families_copy) {
  70. ColumnFamilyOptions* options = &column_family.options;
  71. if (options->max_write_buffer_size_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 = static_cast<OptimisticTransaction*>(txn);
  88. txn_impl->Reinitialize(this, write_options, txn_options);
  89. }
  90. } // namespace ROCKSDB_NAMESPACE