@nxtedition/rocksdb 7.1.33 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/BUILDING.md +2 -2
  2. package/binding.cc +0 -147
  3. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +402 -345
  4. package/deps/rocksdb/rocksdb/cache/clock_cache.h +121 -64
  5. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +28 -18
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -0
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -1
  9. package/deps/rocksdb/rocksdb/db/c.cc +563 -673
  10. package/deps/rocksdb/rocksdb/db/c_test.c +168 -169
  11. package/deps/rocksdb/rocksdb/db/column_family.cc +16 -15
  12. package/deps/rocksdb/rocksdb/db/column_family.h +7 -7
  13. package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -28
  14. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -9
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -3
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +114 -0
  17. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -3
  18. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -5
  19. package/deps/rocksdb/rocksdb/db/corruption_test.cc +10 -14
  20. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +9 -13
  21. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
  22. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +2 -2
  23. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +14 -16
  24. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +52 -72
  25. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +2 -2
  26. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +12 -12
  27. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -2
  28. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +3 -3
  29. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +1 -12
  30. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +3 -0
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +26 -0
  32. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +1 -0
  33. package/deps/rocksdb/rocksdb/db/db_iter.cc +12 -6
  34. package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
  35. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +6 -7
  36. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +10 -8
  37. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +15 -13
  38. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -9
  39. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +4 -4
  40. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +1 -1
  41. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +2 -4
  42. package/deps/rocksdb/rocksdb/db/db_options_test.cc +4 -4
  43. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +7 -4
  44. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +7 -5
  45. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +8 -6
  47. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +18 -23
  48. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -5
  49. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -5
  50. package/deps/rocksdb/rocksdb/db/db_test2.cc +172 -169
  51. package/deps/rocksdb/rocksdb/db/db_test_util.cc +68 -66
  52. package/deps/rocksdb/rocksdb/db/db_test_util.h +1 -3
  53. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +31 -39
  54. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +182 -2
  55. package/deps/rocksdb/rocksdb/db/db_write_test.cc +43 -40
  56. package/deps/rocksdb/rocksdb/db/dbformat.h +15 -0
  57. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +35 -34
  58. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +10 -11
  59. package/deps/rocksdb/rocksdb/db/error_handler.cc +6 -6
  60. package/deps/rocksdb/rocksdb/db/error_handler.h +93 -94
  61. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -1
  62. package/deps/rocksdb/rocksdb/db/event_helpers.h +3 -3
  63. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -17
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2 -2
  65. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -2
  66. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -0
  67. package/deps/rocksdb/rocksdb/db/file_indexer.h +2 -1
  68. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +4 -2
  69. package/deps/rocksdb/rocksdb/db/filename_test.cc +27 -29
  70. package/deps/rocksdb/rocksdb/db/flush_job.cc +7 -13
  71. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -2
  72. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +15 -21
  73. package/deps/rocksdb/rocksdb/db/forward_iterator.h +7 -6
  74. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +4 -2
  75. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +2 -2
  76. package/deps/rocksdb/rocksdb/db/internal_stats.cc +59 -14
  77. package/deps/rocksdb/rocksdb/db/internal_stats.h +27 -11
  78. package/deps/rocksdb/rocksdb/db/job_context.h +5 -6
  79. package/deps/rocksdb/rocksdb/db/listener_test.cc +21 -23
  80. package/deps/rocksdb/rocksdb/db/log_reader.cc +7 -11
  81. package/deps/rocksdb/rocksdb/db/log_reader.h +4 -6
  82. package/deps/rocksdb/rocksdb/db/log_test.cc +6 -12
  83. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  84. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +0 -1
  85. package/deps/rocksdb/rocksdb/db/lookup_key.h +4 -1
  86. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -1
  87. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +3 -5
  88. package/deps/rocksdb/rocksdb/db/memtable.cc +34 -22
  89. package/deps/rocksdb/rocksdb/db/memtable.h +4 -6
  90. package/deps/rocksdb/rocksdb/db/memtable_list.cc +7 -0
  91. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -13
  92. package/deps/rocksdb/rocksdb/db/merge_context.h +1 -0
  93. package/deps/rocksdb/rocksdb/db/merge_helper.cc +128 -14
  94. package/deps/rocksdb/rocksdb/db/merge_helper.h +15 -7
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +2 -1
  96. package/deps/rocksdb/rocksdb/db/merge_operator.cc +5 -6
  97. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +4 -3
  98. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +55 -43
  100. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +288 -299
  101. package/deps/rocksdb/rocksdb/db/prefix_test.cc +22 -27
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +1 -1
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -1
  104. package/deps/rocksdb/rocksdb/db/repair.cc +7 -8
  105. package/deps/rocksdb/rocksdb/db/repair_test.cc +3 -4
  106. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +4 -5
  107. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +10 -4
  108. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -4
  109. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +6 -7
  110. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +22 -22
  111. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +12 -12
  112. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +6 -8
  113. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +2 -0
  114. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -3
  115. package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -5
  116. package/deps/rocksdb/rocksdb/db/version_edit.h +8 -12
  117. package/deps/rocksdb/rocksdb/db/version_set.cc +74 -102
  118. package/deps/rocksdb/rocksdb/db/version_set.h +8 -10
  119. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +0 -5
  120. package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -45
  121. package/deps/rocksdb/rocksdb/db/wal_manager.cc +6 -5
  122. package/deps/rocksdb/rocksdb/db/wal_manager.h +2 -2
  123. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +4 -3
  124. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +144 -61
  125. package/deps/rocksdb/rocksdb/db/write_batch.cc +41 -24
  126. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +2 -7
  127. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +105 -104
  128. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +5 -4
  129. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -0
  130. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -1
  131. package/deps/rocksdb/rocksdb/db/write_thread.cc +8 -6
  132. package/deps/rocksdb/rocksdb/env/io_posix.h +6 -0
  133. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +134 -65
  134. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +29 -0
  135. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1 -4
  137. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +14 -4
  140. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -7
  141. package/deps/rocksdb/rocksdb/table/get_context.h +1 -2
  142. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +13 -0
  143. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +36 -4
  144. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6 -6
  145. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +23 -28
  146. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +11 -1
  147. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +19 -17
  148. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +10 -7
  149. package/index.js +3 -195
  150. package/package.json +2 -4
  151. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  152. package/prebuilds/linux-x64/node.napi.node +0 -0
  153. package/common.js +0 -7
@@ -158,7 +158,7 @@ struct BatchContentClassifier : public WriteBatch::Handler {
158
158
  }
159
159
  };
160
160
 
161
- } // anon namespace
161
+ } // anonymous namespace
162
162
 
163
163
  struct SavePoints {
164
164
  std::stack<SavePoint, autovector<SavePoint>> stack;
@@ -231,18 +231,16 @@ WriteBatch& WriteBatch::operator=(WriteBatch&& src) {
231
231
  return *this;
232
232
  }
233
233
 
234
- WriteBatch::~WriteBatch() { }
234
+ WriteBatch::~WriteBatch() {}
235
235
 
236
- WriteBatch::Handler::~Handler() { }
236
+ WriteBatch::Handler::~Handler() {}
237
237
 
238
238
  void WriteBatch::Handler::LogData(const Slice& /*blob*/) {
239
239
  // If the user has not specified something to do with blobs, then we ignore
240
240
  // them.
241
241
  }
242
242
 
243
- bool WriteBatch::Handler::Continue() {
244
- return true;
245
- }
243
+ bool WriteBatch::Handler::Continue() { return true; }
246
244
 
247
245
  void WriteBatch::Clear() {
248
246
  rep_.clear();
@@ -779,7 +777,7 @@ Status CheckColumnFamilyTimestampSize(ColumnFamilyHandle* column_family,
779
777
  }
780
778
  return Status::OK();
781
779
  }
782
- } // namespace
780
+ } // anonymous namespace
783
781
 
784
782
  Status WriteBatchInternal::Put(WriteBatch* b, uint32_t column_family_id,
785
783
  const Slice& key, const Slice& value) {
@@ -1481,8 +1479,27 @@ Status WriteBatch::Merge(ColumnFamilyHandle* column_family, const Slice& key,
1481
1479
  return WriteBatchInternal::Merge(this, cf_id, key, value);
1482
1480
  }
1483
1481
 
1484
- return Status::InvalidArgument(
1485
- "Cannot call this method on column family enabling timestamp");
1482
+ needs_in_place_update_ts_ = true;
1483
+ has_key_with_ts_ = true;
1484
+ std::string dummy_ts(ts_sz, '\0');
1485
+ std::array<Slice, 2> key_with_ts{{key, dummy_ts}};
1486
+
1487
+ return WriteBatchInternal::Merge(
1488
+ this, cf_id, SliceParts(key_with_ts.data(), 2), SliceParts(&value, 1));
1489
+ }
1490
+
1491
+ Status WriteBatch::Merge(ColumnFamilyHandle* column_family, const Slice& key,
1492
+ const Slice& ts, const Slice& value) {
1493
+ const Status s = CheckColumnFamilyTimestampSize(column_family, ts);
1494
+ if (!s.ok()) {
1495
+ return s;
1496
+ }
1497
+ has_key_with_ts_ = true;
1498
+ assert(column_family);
1499
+ uint32_t cf_id = column_family->GetID();
1500
+ std::array<Slice, 2> key_with_ts{{key, ts}};
1501
+ return WriteBatchInternal::Merge(
1502
+ this, cf_id, SliceParts(key_with_ts.data(), 2), SliceParts(&value, 1));
1486
1503
  }
1487
1504
 
1488
1505
  Status WriteBatchInternal::Merge(WriteBatch* b, uint32_t column_family_id,
@@ -1727,7 +1744,6 @@ Status WriteBatch::VerifyChecksum() const {
1727
1744
  namespace {
1728
1745
 
1729
1746
  class MemTableInserter : public WriteBatch::Handler {
1730
-
1731
1747
  SequenceNumber sequence_;
1732
1748
  ColumnFamilyMemTables* const cf_mems_;
1733
1749
  FlushScheduler* const flush_scheduler_;
@@ -1738,7 +1754,7 @@ class MemTableInserter : public WriteBatch::Handler {
1738
1754
  uint64_t log_number_ref_;
1739
1755
  DBImpl* db_;
1740
1756
  const bool concurrent_memtable_writes_;
1741
- bool post_info_created_;
1757
+ bool post_info_created_;
1742
1758
  const WriteBatch::ProtectionInfo* prot_info_;
1743
1759
  size_t prot_info_idx_;
1744
1760
 
@@ -1764,8 +1780,8 @@ class MemTableInserter : public WriteBatch::Handler {
1764
1780
  // Whether this batch was unprepared or not
1765
1781
  bool unprepared_batch_;
1766
1782
  using DupDetector = std::aligned_storage<sizeof(DuplicateDetector)>::type;
1767
- DupDetector duplicate_detector_;
1768
- bool dup_dectector_on_;
1783
+ DupDetector duplicate_detector_;
1784
+ bool dup_dectector_on_;
1769
1785
 
1770
1786
  bool hint_per_batch_;
1771
1787
  bool hint_created_;
@@ -1785,7 +1801,7 @@ class MemTableInserter : public WriteBatch::Handler {
1785
1801
 
1786
1802
  MemPostInfoMap& GetPostMap() {
1787
1803
  assert(concurrent_memtable_writes_);
1788
- if(!post_info_created_) {
1804
+ if (!post_info_created_) {
1789
1805
  new (&mem_post_info_map_) MemPostInfoMap();
1790
1806
  post_info_created_ = true;
1791
1807
  }
@@ -1799,8 +1815,8 @@ class MemTableInserter : public WriteBatch::Handler {
1799
1815
  new (&duplicate_detector_) DuplicateDetector(db_);
1800
1816
  dup_dectector_on_ = true;
1801
1817
  }
1802
- return reinterpret_cast<DuplicateDetector*>
1803
- (&duplicate_detector_)->IsDuplicateKeySeq(column_family_id, key, sequence_);
1818
+ return reinterpret_cast<DuplicateDetector*>(&duplicate_detector_)
1819
+ ->IsDuplicateKeySeq(column_family_id, key, sequence_);
1804
1820
  }
1805
1821
 
1806
1822
  const ProtectionInfoKVOC64* NextProtectionInfo() {
@@ -1876,12 +1892,11 @@ class MemTableInserter : public WriteBatch::Handler {
1876
1892
 
1877
1893
  ~MemTableInserter() override {
1878
1894
  if (dup_dectector_on_) {
1879
- reinterpret_cast<DuplicateDetector*>
1880
- (&duplicate_detector_)->~DuplicateDetector();
1895
+ reinterpret_cast<DuplicateDetector*>(&duplicate_detector_)
1896
+ ->~DuplicateDetector();
1881
1897
  }
1882
1898
  if (post_info_created_) {
1883
- reinterpret_cast<MemPostInfoMap*>
1884
- (&mem_post_info_map_)->~MemPostInfoMap();
1899
+ reinterpret_cast<MemPostInfoMap*>(&mem_post_info_map_)->~MemPostInfoMap();
1885
1900
  }
1886
1901
  if (hint_created_) {
1887
1902
  for (auto iter : GetHintMap()) {
@@ -1923,7 +1938,7 @@ class MemTableInserter : public WriteBatch::Handler {
1923
1938
  assert(concurrent_memtable_writes_);
1924
1939
  // If post info was not created there is nothing
1925
1940
  // to process and no need to create on demand
1926
- if(post_info_created_) {
1941
+ if (post_info_created_) {
1927
1942
  for (auto& pair : GetPostMap()) {
1928
1943
  pair.first->BatchPostProcess(pair.second);
1929
1944
  }
@@ -2036,6 +2051,7 @@ class MemTableInserter : public WriteBatch::Handler {
2036
2051
  if (cf_handle == nullptr) {
2037
2052
  cf_handle = db_->DefaultColumnFamily();
2038
2053
  }
2054
+ // TODO (yanqin): fix when user-defined timestamp is enabled.
2039
2055
  get_status = db_->Get(ropts, cf_handle, key, &prev_value);
2040
2056
  }
2041
2057
  // Intentionally overwrites the `NotFound` in `ret_status`.
@@ -2486,7 +2502,8 @@ class MemTableInserter : public WriteBatch::Handler {
2486
2502
  Status merge_status = MergeHelper::TimedFullMerge(
2487
2503
  merge_operator, key, &get_value_slice, {value}, &new_value,
2488
2504
  moptions->info_log, moptions->statistics,
2489
- SystemClock::Default().get());
2505
+ SystemClock::Default().get(), /* result_operand */ nullptr,
2506
+ /* update_num_ops_stats */ false);
2490
2507
 
2491
2508
  if (!merge_status.ok()) {
2492
2509
  // Failed to merge!
@@ -2844,7 +2861,7 @@ class MemTableInserter : public WriteBatch::Handler {
2844
2861
  }
2845
2862
  };
2846
2863
 
2847
- } // namespace
2864
+ } // anonymous namespace
2848
2865
 
2849
2866
  // This function can only be called in these conditions:
2850
2867
  // 1) During Recovery()
@@ -3015,7 +3032,7 @@ class ProtectionInfoUpdater : public WriteBatch::Handler {
3015
3032
  WriteBatch::ProtectionInfo* const prot_info_ = nullptr;
3016
3033
  };
3017
3034
 
3018
- } // namespace
3035
+ } // anonymous namespace
3019
3036
 
3020
3037
  Status WriteBatchInternal::SetContents(WriteBatch* b, const Slice& contents) {
3021
3038
  assert(contents.size() >= WriteBatchInternal::kHeader);
@@ -77,7 +77,6 @@ struct WriteBatch::ProtectionInfo {
77
77
  // WriteBatch that we don't want in the public WriteBatch interface.
78
78
  class WriteBatchInternal {
79
79
  public:
80
-
81
80
  // WriteBatch header has an 8-byte sequence number followed by a 4-byte count.
82
81
  static constexpr size_t kHeader = 12;
83
82
 
@@ -149,13 +148,9 @@ class WriteBatchInternal {
149
148
  // This offset is only valid if the batch is not empty.
150
149
  static size_t GetFirstOffset(WriteBatch* batch);
151
150
 
152
- static Slice Contents(const WriteBatch* batch) {
153
- return Slice(batch->rep_);
154
- }
151
+ static Slice Contents(const WriteBatch* batch) { return Slice(batch->rep_); }
155
152
 
156
- static size_t ByteSize(const WriteBatch* batch) {
157
- return batch->rep_.size();
158
- }
153
+ static size_t ByteSize(const WriteBatch* batch) { return batch->rep_.size(); }
159
154
 
160
155
  static Status SetContents(WriteBatch* batch, const Slice& contents);
161
156
 
@@ -174,9 +174,10 @@ TEST_F(WriteBatchTest, Corruption) {
174
174
  Slice contents = WriteBatchInternal::Contents(&batch);
175
175
  ASSERT_OK(WriteBatchInternal::SetContents(
176
176
  &batch, Slice(contents.data(), contents.size() - 1)));
177
- ASSERT_EQ("Put(foo, bar)@200"
178
- "Corruption: bad WriteBatch Delete",
179
- PrintContents(&batch));
177
+ ASSERT_EQ(
178
+ "Put(foo, bar)@200"
179
+ "Corruption: bad WriteBatch Delete",
180
+ PrintContents(&batch));
180
181
  }
181
182
 
182
183
  TEST_F(WriteBatchTest, Append) {
@@ -184,28 +185,28 @@ TEST_F(WriteBatchTest, Append) {
184
185
  WriteBatchInternal::SetSequence(&b1, 200);
185
186
  WriteBatchInternal::SetSequence(&b2, 300);
186
187
  ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
187
- ASSERT_EQ("",
188
- PrintContents(&b1));
188
+ ASSERT_EQ("", PrintContents(&b1));
189
189
  ASSERT_EQ(0u, b1.Count());
190
190
  ASSERT_OK(b2.Put("a", "va"));
191
191
  ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
192
- ASSERT_EQ("Put(a, va)@200",
193
- PrintContents(&b1));
192
+ ASSERT_EQ("Put(a, va)@200", PrintContents(&b1));
194
193
  ASSERT_EQ(1u, b1.Count());
195
194
  b2.Clear();
196
195
  ASSERT_OK(b2.Put("b", "vb"));
197
196
  ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
198
- ASSERT_EQ("Put(a, va)@200"
199
- "Put(b, vb)@201",
200
- PrintContents(&b1));
197
+ ASSERT_EQ(
198
+ "Put(a, va)@200"
199
+ "Put(b, vb)@201",
200
+ PrintContents(&b1));
201
201
  ASSERT_EQ(2u, b1.Count());
202
202
  ASSERT_OK(b2.Delete("foo"));
203
203
  ASSERT_OK(WriteBatchInternal::Append(&b1, &b2));
204
- ASSERT_EQ("Put(a, va)@200"
205
- "Put(b, vb)@202"
206
- "Put(b, vb)@201"
207
- "Delete(foo)@203",
208
- PrintContents(&b1));
204
+ ASSERT_EQ(
205
+ "Put(a, va)@200"
206
+ "Put(b, vb)@202"
207
+ "Put(b, vb)@201"
208
+ "Delete(foo)@203",
209
+ PrintContents(&b1));
209
210
  ASSERT_EQ(4u, b1.Count());
210
211
  b2.Clear();
211
212
  ASSERT_OK(b2.Put("c", "cc"));
@@ -247,89 +248,88 @@ TEST_F(WriteBatchTest, SingleDeletion) {
247
248
  }
248
249
 
249
250
  namespace {
250
- struct TestHandler : public WriteBatch::Handler {
251
- std::string seen;
252
- Status PutCF(uint32_t column_family_id, const Slice& key,
253
- const Slice& value) override {
254
- if (column_family_id == 0) {
255
- seen += "Put(" + key.ToString() + ", " + value.ToString() + ")";
256
- } else {
257
- seen += "PutCF(" + std::to_string(column_family_id) + ", " +
258
- key.ToString() + ", " + value.ToString() + ")";
259
- }
260
- return Status::OK();
261
- }
262
- Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
263
- if (column_family_id == 0) {
264
- seen += "Delete(" + key.ToString() + ")";
265
- } else {
266
- seen += "DeleteCF(" + std::to_string(column_family_id) + ", " +
267
- key.ToString() + ")";
268
- }
269
- return Status::OK();
270
- }
271
- Status SingleDeleteCF(uint32_t column_family_id,
272
- const Slice& key) override {
273
- if (column_family_id == 0) {
274
- seen += "SingleDelete(" + key.ToString() + ")";
275
- } else {
276
- seen += "SingleDeleteCF(" + std::to_string(column_family_id) + ", " +
277
- key.ToString() + ")";
278
- }
279
- return Status::OK();
280
- }
281
- Status DeleteRangeCF(uint32_t column_family_id, const Slice& begin_key,
282
- const Slice& end_key) override {
283
- if (column_family_id == 0) {
284
- seen += "DeleteRange(" + begin_key.ToString() + ", " +
285
- end_key.ToString() + ")";
286
- } else {
287
- seen += "DeleteRangeCF(" + std::to_string(column_family_id) + ", " +
288
- begin_key.ToString() + ", " + end_key.ToString() + ")";
289
- }
290
- return Status::OK();
291
- }
292
- Status MergeCF(uint32_t column_family_id, const Slice& key,
293
- const Slice& value) override {
294
- if (column_family_id == 0) {
295
- seen += "Merge(" + key.ToString() + ", " + value.ToString() + ")";
296
- } else {
297
- seen += "MergeCF(" + std::to_string(column_family_id) + ", " +
298
- key.ToString() + ", " + value.ToString() + ")";
299
- }
300
- return Status::OK();
301
- }
302
- void LogData(const Slice& blob) override {
303
- seen += "LogData(" + blob.ToString() + ")";
304
- }
305
- Status MarkBeginPrepare(bool unprepare) override {
306
- seen +=
307
- "MarkBeginPrepare(" + std::string(unprepare ? "true" : "false") + ")";
308
- return Status::OK();
309
- }
310
- Status MarkEndPrepare(const Slice& xid) override {
311
- seen += "MarkEndPrepare(" + xid.ToString() + ")";
312
- return Status::OK();
251
+ struct TestHandler : public WriteBatch::Handler {
252
+ std::string seen;
253
+ Status PutCF(uint32_t column_family_id, const Slice& key,
254
+ const Slice& value) override {
255
+ if (column_family_id == 0) {
256
+ seen += "Put(" + key.ToString() + ", " + value.ToString() + ")";
257
+ } else {
258
+ seen += "PutCF(" + std::to_string(column_family_id) + ", " +
259
+ key.ToString() + ", " + value.ToString() + ")";
313
260
  }
314
- Status MarkNoop(bool empty_batch) override {
315
- seen += "MarkNoop(" + std::string(empty_batch ? "true" : "false") + ")";
316
- return Status::OK();
261
+ return Status::OK();
262
+ }
263
+ Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
264
+ if (column_family_id == 0) {
265
+ seen += "Delete(" + key.ToString() + ")";
266
+ } else {
267
+ seen += "DeleteCF(" + std::to_string(column_family_id) + ", " +
268
+ key.ToString() + ")";
317
269
  }
318
- Status MarkCommit(const Slice& xid) override {
319
- seen += "MarkCommit(" + xid.ToString() + ")";
320
- return Status::OK();
270
+ return Status::OK();
271
+ }
272
+ Status SingleDeleteCF(uint32_t column_family_id, const Slice& key) override {
273
+ if (column_family_id == 0) {
274
+ seen += "SingleDelete(" + key.ToString() + ")";
275
+ } else {
276
+ seen += "SingleDeleteCF(" + std::to_string(column_family_id) + ", " +
277
+ key.ToString() + ")";
321
278
  }
322
- Status MarkCommitWithTimestamp(const Slice& xid, const Slice& ts) override {
323
- seen += "MarkCommitWithTimestamp(" + xid.ToString() + ", " +
324
- ts.ToString(true) + ")";
325
- return Status::OK();
279
+ return Status::OK();
280
+ }
281
+ Status DeleteRangeCF(uint32_t column_family_id, const Slice& begin_key,
282
+ const Slice& end_key) override {
283
+ if (column_family_id == 0) {
284
+ seen += "DeleteRange(" + begin_key.ToString() + ", " +
285
+ end_key.ToString() + ")";
286
+ } else {
287
+ seen += "DeleteRangeCF(" + std::to_string(column_family_id) + ", " +
288
+ begin_key.ToString() + ", " + end_key.ToString() + ")";
326
289
  }
327
- Status MarkRollback(const Slice& xid) override {
328
- seen += "MarkRollback(" + xid.ToString() + ")";
329
- return Status::OK();
290
+ return Status::OK();
291
+ }
292
+ Status MergeCF(uint32_t column_family_id, const Slice& key,
293
+ const Slice& value) override {
294
+ if (column_family_id == 0) {
295
+ seen += "Merge(" + key.ToString() + ", " + value.ToString() + ")";
296
+ } else {
297
+ seen += "MergeCF(" + std::to_string(column_family_id) + ", " +
298
+ key.ToString() + ", " + value.ToString() + ")";
330
299
  }
331
- };
332
- }
300
+ return Status::OK();
301
+ }
302
+ void LogData(const Slice& blob) override {
303
+ seen += "LogData(" + blob.ToString() + ")";
304
+ }
305
+ Status MarkBeginPrepare(bool unprepare) override {
306
+ seen +=
307
+ "MarkBeginPrepare(" + std::string(unprepare ? "true" : "false") + ")";
308
+ return Status::OK();
309
+ }
310
+ Status MarkEndPrepare(const Slice& xid) override {
311
+ seen += "MarkEndPrepare(" + xid.ToString() + ")";
312
+ return Status::OK();
313
+ }
314
+ Status MarkNoop(bool empty_batch) override {
315
+ seen += "MarkNoop(" + std::string(empty_batch ? "true" : "false") + ")";
316
+ return Status::OK();
317
+ }
318
+ Status MarkCommit(const Slice& xid) override {
319
+ seen += "MarkCommit(" + xid.ToString() + ")";
320
+ return Status::OK();
321
+ }
322
+ Status MarkCommitWithTimestamp(const Slice& xid, const Slice& ts) override {
323
+ seen += "MarkCommitWithTimestamp(" + xid.ToString() + ", " +
324
+ ts.ToString(true) + ")";
325
+ return Status::OK();
326
+ }
327
+ Status MarkRollback(const Slice& xid) override {
328
+ seen += "MarkRollback(" + xid.ToString() + ")";
329
+ return Status::OK();
330
+ }
331
+ };
332
+ } // anonymous namespace
333
333
 
334
334
  TEST_F(WriteBatchTest, PutNotImplemented) {
335
335
  WriteBatch batch;
@@ -609,24 +609,25 @@ TEST_F(WriteBatchTest, PutGatherSlices) {
609
609
  {
610
610
  // Try a write where the key is one slice but the value is two
611
611
  Slice key_slice("baz");
612
- Slice value_slices[2] = { Slice("header"), Slice("payload") };
612
+ Slice value_slices[2] = {Slice("header"), Slice("payload")};
613
613
  ASSERT_OK(
614
614
  batch.Put(SliceParts(&key_slice, 1), SliceParts(value_slices, 2)));
615
615
  }
616
616
 
617
617
  {
618
618
  // One where the key is composite but the value is a single slice
619
- Slice key_slices[3] = { Slice("key"), Slice("part2"), Slice("part3") };
619
+ Slice key_slices[3] = {Slice("key"), Slice("part2"), Slice("part3")};
620
620
  Slice value_slice("value");
621
621
  ASSERT_OK(
622
622
  batch.Put(SliceParts(key_slices, 3), SliceParts(&value_slice, 1)));
623
623
  }
624
624
 
625
625
  WriteBatchInternal::SetSequence(&batch, 100);
626
- ASSERT_EQ("Put(baz, headerpayload)@101"
627
- "Put(foo, bar)@100"
628
- "Put(keypart2part3, value)@102",
629
- PrintContents(&batch));
626
+ ASSERT_EQ(
627
+ "Put(baz, headerpayload)@101"
628
+ "Put(foo, bar)@100"
629
+ "Put(keypart2part3, value)@102",
630
+ PrintContents(&batch));
630
631
  ASSERT_EQ(3u, batch.Count());
631
632
  }
632
633
 
@@ -646,7 +647,7 @@ class ColumnFamilyHandleImplDummy : public ColumnFamilyHandleImpl {
646
647
  uint32_t id_;
647
648
  const Comparator* const ucmp_ = BytewiseComparator();
648
649
  };
649
- } // namespace anonymous
650
+ } // anonymous namespace
650
651
 
651
652
  TEST_F(WriteBatchTest, ColumnFamiliesBatchTest) {
652
653
  WriteBatch batch;
@@ -948,7 +949,7 @@ Status CheckTimestampsInWriteBatch(
948
949
  TimestampChecker ts_checker(cf_to_ucmps, timestamp);
949
950
  return wb.Iterate(&ts_checker);
950
951
  }
951
- } // namespace
952
+ } // anonymous namespace
952
953
 
953
954
  TEST_F(WriteBatchTest, SanityChecks) {
954
955
  ColumnFamilyHandleImplDummy cf0(0,
@@ -961,14 +962,14 @@ TEST_F(WriteBatchTest, SanityChecks) {
961
962
  ASSERT_TRUE(wb.Put(nullptr, "key", "ts", "value").IsInvalidArgument());
962
963
  ASSERT_TRUE(wb.Delete(nullptr, "key", "ts").IsInvalidArgument());
963
964
  ASSERT_TRUE(wb.SingleDelete(nullptr, "key", "ts").IsInvalidArgument());
964
- ASSERT_TRUE(wb.Merge(nullptr, "key", "ts", "value").IsNotSupported());
965
+ ASSERT_TRUE(wb.Merge(nullptr, "key", "ts", "value").IsInvalidArgument());
965
966
  ASSERT_TRUE(wb.DeleteRange(nullptr, "begin_key", "end_key", "ts")
966
967
  .IsInvalidArgument());
967
968
 
968
969
  ASSERT_TRUE(wb.Put(&cf4, "key", "ts", "value").IsInvalidArgument());
969
970
  ASSERT_TRUE(wb.Delete(&cf4, "key", "ts").IsInvalidArgument());
970
971
  ASSERT_TRUE(wb.SingleDelete(&cf4, "key", "ts").IsInvalidArgument());
971
- ASSERT_TRUE(wb.Merge(&cf4, "key", "ts", "value").IsNotSupported());
972
+ ASSERT_TRUE(wb.Merge(&cf4, "key", "ts", "value").IsInvalidArgument());
972
973
  ASSERT_TRUE(
973
974
  wb.DeleteRange(&cf4, "begin_key", "end_key", "ts").IsInvalidArgument());
974
975
 
@@ -978,7 +979,7 @@ TEST_F(WriteBatchTest, SanityChecks) {
978
979
  ASSERT_TRUE(wb.Put(&cf0, "key", ts, "value").IsInvalidArgument());
979
980
  ASSERT_TRUE(wb.Delete(&cf0, "key", ts).IsInvalidArgument());
980
981
  ASSERT_TRUE(wb.SingleDelete(&cf0, "key", ts).IsInvalidArgument());
981
- ASSERT_TRUE(wb.Merge(&cf0, "key", ts, "value").IsNotSupported());
982
+ ASSERT_TRUE(wb.Merge(&cf0, "key", ts, "value").IsInvalidArgument());
982
983
  ASSERT_TRUE(
983
984
  wb.DeleteRange(&cf0, "begin_key", "end_key", ts).IsInvalidArgument());
984
985
 
@@ -5,6 +5,8 @@
5
5
 
6
6
  #ifndef ROCKSDB_LITE
7
7
 
8
+ #include "db/write_callback.h"
9
+
8
10
  #include <atomic>
9
11
  #include <functional>
10
12
  #include <string>
@@ -12,7 +14,6 @@
12
14
  #include <vector>
13
15
 
14
16
  #include "db/db_impl/db_impl.h"
15
- #include "db/write_callback.h"
16
17
  #include "port/port.h"
17
18
  #include "rocksdb/db.h"
18
19
  #include "rocksdb/write_batch.h"
@@ -37,11 +38,11 @@ class WriteCallbackTestWriteCallback1 : public WriteCallback {
37
38
  public:
38
39
  bool was_called = false;
39
40
 
40
- Status Callback(DB *db) override {
41
+ Status Callback(DB* db) override {
41
42
  was_called = true;
42
43
 
43
44
  // Make sure db is a DBImpl
44
- DBImpl* db_impl = dynamic_cast<DBImpl*> (db);
45
+ DBImpl* db_impl = dynamic_cast<DBImpl*>(db);
45
46
  if (db_impl == nullptr) {
46
47
  return Status::InvalidArgument("");
47
48
  }
@@ -397,7 +398,7 @@ TEST_F(WriteCallbackTest, WriteCallBackTest) {
397
398
  Status s = DB::Open(options, dbname, &db);
398
399
  ASSERT_OK(s);
399
400
 
400
- db_impl = dynamic_cast<DBImpl*> (db);
401
+ db_impl = dynamic_cast<DBImpl*>(db);
401
402
  ASSERT_TRUE(db_impl);
402
403
 
403
404
  WriteBatch wb;
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <atomic>
11
11
  #include <memory>
12
+
12
13
  #include "rocksdb/rate_limiter.h"
13
14
 
14
15
  namespace ROCKSDB_NAMESPACE {
@@ -20,7 +20,7 @@ class TimeSetClock : public SystemClockWrapper {
20
20
  uint64_t now_micros_ = 6666;
21
21
  uint64_t NowNanos() override { return now_micros_ * std::milli::den; }
22
22
  };
23
- } // namespace
23
+ } // anonymous namespace
24
24
  class WriteControllerTest : public testing::Test {
25
25
  public:
26
26
  WriteControllerTest() { clock_ = std::make_shared<TimeSetClock>(); }
@@ -397,8 +397,9 @@ void WriteThread::JoinBatchGroup(Writer* w) {
397
397
  * writes in parallel.
398
398
  */
399
399
  TEST_SYNC_POINT_CALLBACK("WriteThread::JoinBatchGroup:BeganWaiting", w);
400
- AwaitState(w, STATE_GROUP_LEADER | STATE_MEMTABLE_WRITER_LEADER |
401
- STATE_PARALLEL_MEMTABLE_WRITER | STATE_COMPLETED,
400
+ AwaitState(w,
401
+ STATE_GROUP_LEADER | STATE_MEMTABLE_WRITER_LEADER |
402
+ STATE_PARALLEL_MEMTABLE_WRITER | STATE_COMPLETED,
402
403
  &jbg_ctx);
403
404
  TEST_SYNC_POINT_CALLBACK("WriteThread::JoinBatchGroup:DoneWaiting", w);
404
405
  }
@@ -595,10 +596,10 @@ void WriteThread::LaunchParallelMemTableWriters(WriteGroup* write_group) {
595
596
  }
596
597
  }
597
598
 
598
- static WriteThread::AdaptationContext cpmtw_ctx("CompleteParallelMemTableWriter");
599
+ static WriteThread::AdaptationContext cpmtw_ctx(
600
+ "CompleteParallelMemTableWriter");
599
601
  // This method is called by both the leader and parallel followers
600
602
  bool WriteThread::CompleteParallelMemTableWriter(Writer* w) {
601
-
602
603
  auto* write_group = w->write_group;
603
604
  if (!w->status.ok()) {
604
605
  std::lock_guard<std::mutex> guard(write_group->leader->StateMutex());
@@ -718,8 +719,9 @@ void WriteThread::ExitAsBatchGroupLeader(WriteGroup& write_group,
718
719
  SetState(new_leader, STATE_GROUP_LEADER);
719
720
  }
720
721
 
721
- AwaitState(leader, STATE_MEMTABLE_WRITER_LEADER |
722
- STATE_PARALLEL_MEMTABLE_WRITER | STATE_COMPLETED,
722
+ AwaitState(leader,
723
+ STATE_MEMTABLE_WRITER_LEADER | STATE_PARALLEL_MEMTABLE_WRITER |
724
+ STATE_COMPLETED,
723
725
  &eabgl_ctx);
724
726
  } else {
725
727
  Writer* head = newest_writer_.load(std::memory_order_acquire);
@@ -35,6 +35,12 @@
35
35
  #define POSIX_FADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */
36
36
  #define POSIX_FADV_WILLNEED 3 /* [MC1] will need these pages */
37
37
  #define POSIX_FADV_DONTNEED 4 /* [MC1] don't need these pages */
38
+
39
+ #define POSIX_MADV_NORMAL 0 /* [MC1] no further special treatment */
40
+ #define POSIX_MADV_RANDOM 1 /* [MC1] expect random page refs */
41
+ #define POSIX_MADV_SEQUENTIAL 2 /* [MC1] expect sequential page refs */
42
+ #define POSIX_MADV_WILLNEED 3 /* [MC1] will need these pages */
43
+ #define POSIX_MADV_DONTNEED 4 /* [MC1] don't need these pages */
38
44
  #endif
39
45
 
40
46
  namespace ROCKSDB_NAMESPACE {