@nxtedition/rocksdb 8.1.3 → 8.1.5

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 (146) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -1
  2. package/deps/rocksdb/rocksdb/Makefile +2 -2
  3. package/deps/rocksdb/rocksdb/TARGETS +4 -2
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
  5. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
  6. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
  9. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
  11. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
  12. package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
  13. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
  14. package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
  16. package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
  18. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
  19. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
  20. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
  21. package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
  22. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
  23. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
  25. package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
  27. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
  28. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +0 -11
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
  30. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
  32. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
  33. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
  34. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
  35. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
  36. package/deps/rocksdb/rocksdb/db/builder.cc +17 -12
  37. package/deps/rocksdb/rocksdb/db/column_family.cc +0 -1
  38. package/deps/rocksdb/rocksdb/db/column_family.h +0 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +0 -5
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +3 -0
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +0 -2
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +28 -27
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +254 -139
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -5
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +0 -5
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +125 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +1 -1
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +27 -15
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -49
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +34 -24
  56. package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
  57. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  58. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
  59. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
  60. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +117 -210
  61. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
  62. package/deps/rocksdb/rocksdb/db/db_test_util.h +36 -24
  63. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
  64. package/deps/rocksdb/rocksdb/db/flush_job.cc +6 -6
  65. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
  66. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
  67. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +0 -4
  68. package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
  69. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  70. package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
  71. package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
  72. package/deps/rocksdb/rocksdb/db/memtable.cc +30 -5
  73. package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -33
  74. package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
  75. package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
  76. package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
  77. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
  78. package/deps/rocksdb/rocksdb/db/version_builder.cc +12 -9
  79. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -0
  80. package/deps/rocksdb/rocksdb/db/version_set.cc +20 -28
  81. package/deps/rocksdb/rocksdb/db/version_set.h +2 -2
  82. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
  83. package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
  84. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
  85. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +358 -214
  86. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
  87. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
  89. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  90. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
  91. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
  92. package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
  93. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  94. package/deps/rocksdb/rocksdb/src.mk +2 -1
  95. package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
  97. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
  98. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
  99. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +156 -223
  100. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
  101. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +46 -18
  102. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
  103. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
  104. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
  105. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
  106. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
  107. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
  108. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
  109. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
  110. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
  111. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
  112. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
  113. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
  114. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  115. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
  116. package/deps/rocksdb/rocksdb/table/format.h +1 -1
  117. package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
  118. package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
  119. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +92 -7
  120. package/deps/rocksdb/rocksdb/table/merging_iterator.h +0 -80
  121. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
  122. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
  123. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
  124. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
  125. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
  126. package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
  127. package/deps/rocksdb/rocksdb/util/compression.h +11 -2
  128. package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
  129. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
  130. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
  131. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
  132. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
  133. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
  134. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
  135. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
  136. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  137. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +52 -0
  138. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
  139. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
  140. package/deps/rocksdb/rocksdb.gyp +0 -3
  141. package/index.js +2 -2
  142. package/package.json +1 -1
  143. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  144. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
  145. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +0 -142
  146. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +0 -241
@@ -873,17 +873,34 @@ class FlushCounterListener : public EventListener {
873
873
  #endif
874
874
 
875
875
  // A test merge operator mimics put but also fails if one of merge operands is
876
- // "corrupted".
876
+ // "corrupted", "corrupted_try_merge", or "corrupted_must_merge".
877
877
  class TestPutOperator : public MergeOperator {
878
878
  public:
879
879
  virtual bool FullMergeV2(const MergeOperationInput& merge_in,
880
880
  MergeOperationOutput* merge_out) const override {
881
+ static const std::map<std::string, MergeOperator::OpFailureScope>
882
+ bad_operand_to_op_failure_scope = {
883
+ {"corrupted", MergeOperator::OpFailureScope::kDefault},
884
+ {"corrupted_try_merge", MergeOperator::OpFailureScope::kTryMerge},
885
+ {"corrupted_must_merge",
886
+ MergeOperator::OpFailureScope::kMustMerge}};
887
+ auto check_operand =
888
+ [](Slice operand_val,
889
+ MergeOperator::OpFailureScope* op_failure_scope) -> bool {
890
+ auto iter = bad_operand_to_op_failure_scope.find(operand_val.ToString());
891
+ if (iter != bad_operand_to_op_failure_scope.end()) {
892
+ *op_failure_scope = iter->second;
893
+ return false;
894
+ }
895
+ return true;
896
+ };
881
897
  if (merge_in.existing_value != nullptr &&
882
- *(merge_in.existing_value) == "corrupted") {
898
+ !check_operand(*merge_in.existing_value,
899
+ &merge_out->op_failure_scope)) {
883
900
  return false;
884
901
  }
885
902
  for (auto value : merge_in.operand_list) {
886
- if (value == "corrupted") {
903
+ if (!check_operand(value, &merge_out->op_failure_scope)) {
887
904
  return false;
888
905
  }
889
906
  }
@@ -903,17 +920,18 @@ class CacheWrapper : public Cache {
903
920
 
904
921
  const char* Name() const override { return target_->Name(); }
905
922
 
906
- using Cache::Insert;
907
- Status Insert(const Slice& key, void* value, size_t charge,
908
- void (*deleter)(const Slice& key, void* value),
923
+ Status Insert(const Slice& key, ObjectPtr value,
924
+ const CacheItemHelper* helper, size_t charge,
909
925
  Handle** handle = nullptr,
910
926
  Priority priority = Priority::LOW) override {
911
- return target_->Insert(key, value, charge, deleter, handle, priority);
927
+ return target_->Insert(key, value, helper, charge, handle, priority);
912
928
  }
913
929
 
914
- using Cache::Lookup;
915
- Handle* Lookup(const Slice& key, Statistics* stats = nullptr) override {
916
- return target_->Lookup(key, stats);
930
+ Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
931
+ CreateContext* create_context,
932
+ Priority priority = Priority::LOW, bool wait = true,
933
+ Statistics* stats = nullptr) override {
934
+ return target_->Lookup(key, helper, create_context, priority, wait, stats);
917
935
  }
918
936
 
919
937
  bool Ref(Handle* handle) override { return target_->Ref(handle); }
@@ -923,7 +941,7 @@ class CacheWrapper : public Cache {
923
941
  return target_->Release(handle, erase_if_last_ref);
924
942
  }
925
943
 
926
- void* Value(Handle* handle) override { return target_->Value(handle); }
944
+ ObjectPtr Value(Handle* handle) override { return target_->Value(handle); }
927
945
 
928
946
  void Erase(const Slice& key) override { target_->Erase(key); }
929
947
  uint64_t NewId() override { return target_->NewId(); }
@@ -952,18 +970,13 @@ class CacheWrapper : public Cache {
952
970
  return target_->GetCharge(handle);
953
971
  }
954
972
 
955
- DeleterFn GetDeleter(Handle* handle) const override {
956
- return target_->GetDeleter(handle);
957
- }
958
-
959
- void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
960
- bool thread_safe) override {
961
- target_->ApplyToAllCacheEntries(callback, thread_safe);
973
+ const CacheItemHelper* GetCacheItemHelper(Handle* handle) const override {
974
+ return target_->GetCacheItemHelper(handle);
962
975
  }
963
976
 
964
977
  void ApplyToAllEntries(
965
- const std::function<void(const Slice& key, void* value, size_t charge,
966
- DeleterFn deleter)>& callback,
978
+ const std::function<void(const Slice& key, ObjectPtr value, size_t charge,
979
+ const CacheItemHelper* helper)>& callback,
967
980
  const ApplyToAllEntriesOptions& opts) override {
968
981
  target_->ApplyToAllEntries(callback, opts);
969
982
  }
@@ -991,9 +1004,8 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
991
1004
  public:
992
1005
  explicit TargetCacheChargeTrackingCache(std::shared_ptr<Cache> target);
993
1006
 
994
- using Cache::Insert;
995
- Status Insert(const Slice& key, void* value, size_t charge,
996
- void (*deleter)(const Slice& key, void* value),
1007
+ Status Insert(const Slice& key, ObjectPtr value,
1008
+ const CacheItemHelper* helper, size_t charge,
997
1009
  Handle** handle = nullptr,
998
1010
  Priority priority = Priority::LOW) override;
999
1011
 
@@ -1009,7 +1021,7 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
1009
1021
  }
1010
1022
 
1011
1023
  private:
1012
- static const Cache::DeleterFn kNoopDeleter;
1024
+ static const Cache::CacheItemHelper* kCrmHelper;
1013
1025
 
1014
1026
  std::size_t cur_cache_charge_;
1015
1027
  std::size_t cache_charge_peak_;
@@ -3870,6 +3870,34 @@ TEST_F(DBBasicTestWithTimestamp, MergeAfterDeletion) {
3870
3870
 
3871
3871
  Close();
3872
3872
  }
3873
+
3874
+ TEST_F(DBBasicTestWithTimestamp, RangeTombstoneApproximateSize) {
3875
+ // Test code path for calculating range tombstone compensated size
3876
+ // during flush and compaction.
3877
+ Options options = CurrentOptions();
3878
+ const size_t kTimestampSize = Timestamp(0, 0).size();
3879
+ TestComparator test_cmp(kTimestampSize);
3880
+ options.comparator = &test_cmp;
3881
+ DestroyAndReopen(options);
3882
+ // So that the compaction below is non-bottommost and will calcualte
3883
+ // compensated range tombstone size.
3884
+ ASSERT_OK(db_->Put(WriteOptions(), Key(1), Timestamp(1, 0), "val"));
3885
+ ASSERT_OK(Flush());
3886
+ MoveFilesToLevel(5);
3887
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
3888
+ Key(1), Timestamp(1, 0)));
3889
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(1),
3890
+ Key(2), Timestamp(2, 0)));
3891
+ ASSERT_OK(Flush());
3892
+ ASSERT_OK(dbfull()->RunManualCompaction(
3893
+ static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
3894
+ ->cfd(),
3895
+ 0 /* input_level */, 1 /* output_level */, CompactRangeOptions(),
3896
+ nullptr /* begin */, nullptr /* end */, true /* exclusive */,
3897
+ true /* disallow_trivial_move */,
3898
+ std::numeric_limits<uint64_t>::max() /* max_file_num_to_ignore */,
3899
+ "" /*trim_ts*/));
3900
+ }
3873
3901
  } // namespace ROCKSDB_NAMESPACE
3874
3902
 
3875
3903
  int main(int argc, char** argv) {
@@ -91,7 +91,7 @@ FlushJob::FlushJob(
91
91
  std::vector<SequenceNumber> existing_snapshots,
92
92
  SequenceNumber earliest_write_conflict_snapshot,
93
93
  SnapshotChecker* snapshot_checker, JobContext* job_context,
94
- LogBuffer* log_buffer, FSDirectory* db_directory,
94
+ FlushReason flush_reason, LogBuffer* log_buffer, FSDirectory* db_directory,
95
95
  FSDirectory* output_file_directory, CompressionType output_compression,
96
96
  Statistics* stats, EventLogger* event_logger, bool measure_io_stats,
97
97
  const bool sync_output_directory, const bool write_manifest,
@@ -114,6 +114,7 @@ FlushJob::FlushJob(
114
114
  earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
115
115
  snapshot_checker_(snapshot_checker),
116
116
  job_context_(job_context),
117
+ flush_reason_(flush_reason),
117
118
  log_buffer_(log_buffer),
118
119
  db_directory_(db_directory),
119
120
  output_file_directory_(output_file_directory),
@@ -245,9 +246,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, FileMetaData* file_meta,
245
246
  }
246
247
  Status mempurge_s = Status::NotFound("No MemPurge.");
247
248
  if ((mempurge_threshold > 0.0) &&
248
- (cfd_->GetFlushReason() == FlushReason::kWriteBufferFull) &&
249
- (!mems_.empty()) && MemPurgeDecider(mempurge_threshold) &&
250
- !(db_options_.atomic_flush)) {
249
+ (flush_reason_ == FlushReason::kWriteBufferFull) && (!mems_.empty()) &&
250
+ MemPurgeDecider(mempurge_threshold) && !(db_options_.atomic_flush)) {
251
251
  cfd_->SetMempurgeUsed();
252
252
  mempurge_s = MemPurge();
253
253
  if (!mempurge_s.ok()) {
@@ -878,7 +878,7 @@ Status FlushJob::WriteLevel0Table() {
878
878
  << total_num_deletes << "total_data_size"
879
879
  << total_data_size << "memory_usage"
880
880
  << total_memory_usage << "flush_reason"
881
- << GetFlushReasonString(cfd_->GetFlushReason());
881
+ << GetFlushReasonString(flush_reason_);
882
882
 
883
883
  {
884
884
  ScopedArenaIterator iter(
@@ -1076,7 +1076,7 @@ std::unique_ptr<FlushJobInfo> FlushJob::GetFlushJobInfo() const {
1076
1076
  info->smallest_seqno = meta_.fd.smallest_seqno;
1077
1077
  info->largest_seqno = meta_.fd.largest_seqno;
1078
1078
  info->table_properties = table_properties_;
1079
- info->flush_reason = cfd_->GetFlushReason();
1079
+ info->flush_reason = flush_reason_;
1080
1080
  info->blob_compression_type = mutable_cf_options_.blob_compression_type;
1081
1081
 
1082
1082
  // Update BlobFilesInfo.
@@ -67,8 +67,8 @@ class FlushJob {
67
67
  std::vector<SequenceNumber> existing_snapshots,
68
68
  SequenceNumber earliest_write_conflict_snapshot,
69
69
  SnapshotChecker* snapshot_checker, JobContext* job_context,
70
- LogBuffer* log_buffer, FSDirectory* db_directory,
71
- FSDirectory* output_file_directory,
70
+ FlushReason flush_reason, LogBuffer* log_buffer,
71
+ FSDirectory* db_directory, FSDirectory* output_file_directory,
72
72
  CompressionType output_compression, Statistics* stats,
73
73
  EventLogger* event_logger, bool measure_io_stats,
74
74
  const bool sync_output_directory, const bool write_manifest,
@@ -150,6 +150,7 @@ class FlushJob {
150
150
  SequenceNumber earliest_write_conflict_snapshot_;
151
151
  SnapshotChecker* snapshot_checker_;
152
152
  JobContext* job_context_;
153
+ FlushReason flush_reason_;
153
154
  LogBuffer* log_buffer_;
154
155
  FSDirectory* db_directory_;
155
156
  FSDirectory* output_file_directory_;
@@ -164,15 +164,15 @@ TEST_F(FlushJobTest, Empty) {
164
164
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
165
165
  EventLogger event_logger(db_options_.info_log.get());
166
166
  SnapshotChecker* snapshot_checker = nullptr; // not relavant
167
- FlushJob flush_job(dbname_, versions_->GetColumnFamilySet()->GetDefault(),
168
- db_options_, *cfd->GetLatestMutableCFOptions(),
169
- std::numeric_limits<uint64_t>::max() /* memtable_id */,
170
- env_options_, versions_.get(), &mutex_, &shutting_down_,
171
- {}, kMaxSequenceNumber, snapshot_checker, &job_context,
172
- nullptr, nullptr, nullptr, kNoCompression, nullptr,
173
- &event_logger, false, true /* sync_output_directory */,
174
- true /* write_manifest */, Env::Priority::USER,
175
- nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
167
+ FlushJob flush_job(
168
+ dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
169
+ *cfd->GetLatestMutableCFOptions(),
170
+ std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
171
+ versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
172
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
173
+ nullptr, kNoCompression, nullptr, &event_logger, false,
174
+ true /* sync_output_directory */, true /* write_manifest */,
175
+ Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
176
176
  {
177
177
  InstrumentedMutexLock l(&mutex_);
178
178
  flush_job.PickMemTable();
@@ -255,9 +255,9 @@ TEST_F(FlushJobTest, NonEmpty) {
255
255
  *cfd->GetLatestMutableCFOptions(),
256
256
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
257
257
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
258
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
259
- db_options_.statistics.get(), &event_logger, true,
260
- true /* sync_output_directory */, true /* write_manifest */,
258
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
259
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
260
+ true, true /* sync_output_directory */, true /* write_manifest */,
261
261
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
262
262
 
263
263
  HistogramData hist;
@@ -318,9 +318,9 @@ TEST_F(FlushJobTest, FlushMemTablesSingleColumnFamily) {
318
318
  dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
319
319
  *cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
320
320
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
321
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
322
- db_options_.statistics.get(), &event_logger, true,
323
- true /* sync_output_directory */, true /* write_manifest */,
321
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
322
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
323
+ true, true /* sync_output_directory */, true /* write_manifest */,
324
324
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
325
325
  HistogramData hist;
326
326
  FileMetaData file_meta;
@@ -391,8 +391,8 @@ TEST_F(FlushJobTest, FlushMemtablesMultipleColumnFamilies) {
391
391
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
392
392
  memtable_ids[k], env_options_, versions_.get(), &mutex_,
393
393
  &shutting_down_, snapshot_seqs, kMaxSequenceNumber, snapshot_checker,
394
- &job_context, nullptr, nullptr, nullptr, kNoCompression,
395
- db_options_.statistics.get(), &event_logger, true,
394
+ &job_context, FlushReason::kTest, nullptr, nullptr, nullptr,
395
+ kNoCompression, db_options_.statistics.get(), &event_logger, true,
396
396
  false /* sync_output_directory */, false /* write_manifest */,
397
397
  Env::Priority::USER, nullptr /*IOTracer*/,
398
398
  empty_seqno_to_time_mapping_));
@@ -520,9 +520,9 @@ TEST_F(FlushJobTest, Snapshots) {
520
520
  *cfd->GetLatestMutableCFOptions(),
521
521
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
522
522
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
523
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
524
- db_options_.statistics.get(), &event_logger, true,
525
- true /* sync_output_directory */, true /* write_manifest */,
523
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
524
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
525
+ true, true /* sync_output_directory */, true /* write_manifest */,
526
526
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
527
527
  mutex_.Lock();
528
528
  flush_job.PickMemTable();
@@ -576,9 +576,9 @@ TEST_F(FlushJobTest, GetRateLimiterPriorityForWrite) {
576
576
  dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
577
577
  *cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
578
578
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
579
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
580
- db_options_.statistics.get(), &event_logger, true,
581
- true /* sync_output_directory */, true /* write_manifest */,
579
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
580
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
581
+ true, true /* sync_output_directory */, true /* write_manifest */,
582
582
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
583
583
 
584
584
  // When the state from WriteController is normal.
@@ -656,9 +656,9 @@ TEST_F(FlushJobTimestampTest, AllKeysExpired) {
656
656
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
657
657
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
658
658
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
659
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
660
- db_options_.statistics.get(), &event_logger, true,
661
- true /* sync_output_directory */, true /* write_manifest */,
659
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
660
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
661
+ true, true /* sync_output_directory */, true /* write_manifest */,
662
662
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
663
663
  /*db_id=*/"",
664
664
  /*db_session_id=*/"", full_history_ts_low);
@@ -709,9 +709,9 @@ TEST_F(FlushJobTimestampTest, NoKeyExpired) {
709
709
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
710
710
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
711
711
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
712
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
713
- db_options_.statistics.get(), &event_logger, true,
714
- true /* sync_output_directory */, true /* write_manifest */,
712
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
713
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
714
+ true, true /* sync_output_directory */, true /* write_manifest */,
715
715
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
716
716
  /*db_id=*/"",
717
717
  /*db_session_id=*/"", full_history_ts_low);
@@ -82,10 +82,6 @@ class HistoryTrimmingIterator : public InternalIterator {
82
82
 
83
83
  bool IsValuePinned() const override { return input_->IsValuePinned(); }
84
84
 
85
- bool IsDeleteRangeSentinelKey() const override {
86
- return input_->IsDeleteRangeSentinelKey();
87
- }
88
-
89
85
  private:
90
86
  InternalIterator* input_;
91
87
  const std::string filter_ts_;
@@ -659,17 +659,18 @@ void InternalStats::CollectCacheEntryStats(bool foreground) {
659
659
  min_interval_factor);
660
660
  }
661
661
 
662
- std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
662
+ std::function<void()> Blah() {
663
+ static int x = 42;
664
+ return [&]() { ++x; };
665
+ }
666
+
667
+ std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
668
+ const Cache::CacheItemHelper* helper)>
663
669
  InternalStats::CacheEntryRoleStats::GetEntryCallback() {
664
- return [&](const Slice& /*key*/, void* /*value*/, size_t charge,
665
- Cache::DeleterFn deleter) {
666
- auto e = role_map_.find(deleter);
667
- size_t role_idx;
668
- if (e == role_map_.end()) {
669
- role_idx = static_cast<size_t>(CacheEntryRole::kMisc);
670
- } else {
671
- role_idx = static_cast<size_t>(e->second);
672
- }
670
+ return [&](const Slice& /*key*/, Cache::ObjectPtr /*value*/, size_t charge,
671
+ const Cache::CacheItemHelper* helper) -> void {
672
+ size_t role_idx =
673
+ static_cast<size_t>(helper ? helper->role : CacheEntryRole::kMisc);
673
674
  entry_counts[role_idx]++;
674
675
  total_charges[role_idx] += charge;
675
676
  };
@@ -680,7 +681,6 @@ void InternalStats::CacheEntryRoleStats::BeginCollection(
680
681
  Clear();
681
682
  last_start_time_micros_ = start_time_micros;
682
683
  ++collection_count;
683
- role_map_ = CopyCacheDeleterRoleMap();
684
684
  std::ostringstream str;
685
685
  str << cache->Name() << "@" << static_cast<void*>(cache) << "#"
686
686
  << port::GetProcessID();
@@ -472,7 +472,8 @@ class InternalStats {
472
472
  }
473
473
 
474
474
  void BeginCollection(Cache*, SystemClock*, uint64_t start_time_micros);
475
- std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
475
+ std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
476
+ const Cache::CacheItemHelper* helper)>
476
477
  GetEntryCallback();
477
478
  void EndCollection(Cache*, SystemClock*, uint64_t end_time_micros);
478
479
  void SkippedCollection();
@@ -482,7 +483,6 @@ class InternalStats {
482
483
  SystemClock* clock) const;
483
484
 
484
485
  private:
485
- UnorderedMap<Cache::DeleterFn, CacheEntryRole> role_map_;
486
486
  uint64_t GetLastDurationMicros() const;
487
487
  };
488
488
 
@@ -515,10 +515,11 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
515
515
 
516
516
  size_t uncompressed_size = 0;
517
517
  int remaining = 0;
518
+ const char* input = header + header_size;
518
519
  do {
519
- remaining = uncompress_->Uncompress(header + header_size, length,
520
- uncompressed_buffer_.get(),
521
- &uncompressed_size);
520
+ remaining = uncompress_->Uncompress(
521
+ input, length, uncompressed_buffer_.get(), &uncompressed_size);
522
+ input = nullptr;
522
523
  if (remaining < 0) {
523
524
  buffer_.clear();
524
525
  return kBadRecord;
@@ -830,10 +831,11 @@ bool FragmentBufferedReader::TryReadFragment(
830
831
  uncompressed_record_.clear();
831
832
  size_t uncompressed_size = 0;
832
833
  int remaining = 0;
834
+ const char* input = header + header_size;
833
835
  do {
834
- remaining = uncompress_->Uncompress(header + header_size, length,
835
- uncompressed_buffer_.get(),
836
- &uncompressed_size);
836
+ remaining = uncompress_->Uncompress(
837
+ input, length, uncompressed_buffer_.get(), &uncompressed_size);
838
+ input = nullptr;
837
839
  if (remaining < 0) {
838
840
  buffer_.clear();
839
841
  *fragment_type_or_err = kBadRecord;
@@ -979,6 +979,38 @@ TEST_P(CompressionLogTest, Fragmentation) {
979
979
  ASSERT_EQ("EOF", Read());
980
980
  }
981
981
 
982
+ TEST_P(CompressionLogTest, AlignedFragmentation) {
983
+ CompressionType compression_type = std::get<2>(GetParam());
984
+ if (!StreamingCompressionTypeSupported(compression_type)) {
985
+ ROCKSDB_GTEST_SKIP("Test requires support for compression type");
986
+ return;
987
+ }
988
+ ASSERT_OK(SetupTestEnv());
989
+ Random rnd(301);
990
+ int num_filler_records = 0;
991
+ // Keep writing small records until the next record will be aligned at the
992
+ // beginning of the block.
993
+ while ((WrittenBytes() & (kBlockSize - 1)) >= kHeaderSize) {
994
+ char entry = 'a';
995
+ ASSERT_OK(writer_->AddRecord(Slice(&entry, 1)));
996
+ num_filler_records++;
997
+ }
998
+ const std::vector<std::string> wal_entries = {
999
+ rnd.RandomBinaryString(3 * kBlockSize),
1000
+ };
1001
+ for (const std::string& wal_entry : wal_entries) {
1002
+ Write(wal_entry);
1003
+ }
1004
+
1005
+ for (int i = 0; i < num_filler_records; ++i) {
1006
+ ASSERT_EQ("a", Read());
1007
+ }
1008
+ for (const std::string& wal_entry : wal_entries) {
1009
+ ASSERT_EQ(wal_entry, Read());
1010
+ }
1011
+ ASSERT_EQ("EOF", Read());
1012
+ }
1013
+
982
1014
  INSTANTIATE_TEST_CASE_P(
983
1015
  Compression, CompressionLogTest,
984
1016
  ::testing::Combine(::testing::Values(0, 1), ::testing::Bool(),
@@ -1026,10 +1058,11 @@ TEST_P(StreamingCompressionTest, Basic) {
1026
1058
  for (int i = 0; i < (int)compressed_buffers.size(); i++) {
1027
1059
  // Call uncompress till either the entire input is consumed or the output
1028
1060
  // buffer size is equal to the allocated output buffer size.
1061
+ const char* input = compressed_buffers[i].c_str();
1029
1062
  do {
1030
- ret_val = uncompress->Uncompress(compressed_buffers[i].c_str(),
1031
- compressed_buffers[i].size(),
1063
+ ret_val = uncompress->Uncompress(input, compressed_buffers[i].size(),
1032
1064
  uncompressed_output_buffer, &output_pos);
1065
+ input = nullptr;
1033
1066
  if (output_pos > 0) {
1034
1067
  std::string uncompressed_fragment;
1035
1068
  uncompressed_fragment.assign(uncompressed_output_buffer, output_pos);
@@ -1067,11 +1067,15 @@ static bool SaveValue(void* arg, const char* entry) {
1067
1067
 
1068
1068
  if (s->value || s->columns) {
1069
1069
  std::string result;
1070
+ // `op_failure_scope` (an output parameter) is not provided (set to
1071
+ // nullptr) since a failure must be propagated regardless of its
1072
+ // value.
1070
1073
  *(s->status) = MergeHelper::TimedFullMerge(
1071
1074
  merge_operator, s->key->user_key(), &v,
1072
1075
  merge_context->GetOperands(), &result, s->logger, s->statistics,
1073
1076
  s->clock, /* result_operand */ nullptr,
1074
- /* update_num_ops_stats */ true);
1077
+ /* update_num_ops_stats */ true,
1078
+ /* op_failure_scope */ nullptr);
1075
1079
 
1076
1080
  if (s->status->ok()) {
1077
1081
  if (s->value) {
@@ -1130,18 +1134,26 @@ static bool SaveValue(void* arg, const char* entry) {
1130
1134
  *(s->status) = WideColumnSerialization::GetValueOfDefaultColumn(
1131
1135
  v, value_of_default);
1132
1136
  if (s->status->ok()) {
1137
+ // `op_failure_scope` (an output parameter) is not provided (set
1138
+ // to nullptr) since a failure must be propagated regardless of
1139
+ // its value.
1133
1140
  *(s->status) = MergeHelper::TimedFullMerge(
1134
1141
  merge_operator, s->key->user_key(), &value_of_default,
1135
1142
  merge_context->GetOperands(), s->value, s->logger,
1136
1143
  s->statistics, s->clock, /* result_operand */ nullptr,
1137
- /* update_num_ops_stats */ true);
1144
+ /* update_num_ops_stats */ true,
1145
+ /* op_failure_scope */ nullptr);
1138
1146
  }
1139
1147
  } else if (s->columns) {
1140
1148
  std::string result;
1149
+ // `op_failure_scope` (an output parameter) is not provided (set to
1150
+ // nullptr) since a failure must be propagated regardless of its
1151
+ // value.
1141
1152
  *(s->status) = MergeHelper::TimedFullMergeWithEntity(
1142
1153
  merge_operator, s->key->user_key(), v,
1143
1154
  merge_context->GetOperands(), &result, s->logger, s->statistics,
1144
- s->clock, /* update_num_ops_stats */ true);
1155
+ s->clock, /* update_num_ops_stats */ true,
1156
+ /* op_failure_scope */ nullptr);
1145
1157
 
1146
1158
  if (s->status->ok()) {
1147
1159
  *(s->status) = s->columns->SetWideColumnValue(result);
@@ -1177,11 +1189,15 @@ static bool SaveValue(void* arg, const char* entry) {
1177
1189
  if (*(s->merge_in_progress)) {
1178
1190
  if (s->value || s->columns) {
1179
1191
  std::string result;
1192
+ // `op_failure_scope` (an output parameter) is not provided (set to
1193
+ // nullptr) since a failure must be propagated regardless of its
1194
+ // value.
1180
1195
  *(s->status) = MergeHelper::TimedFullMerge(
1181
1196
  merge_operator, s->key->user_key(), nullptr,
1182
1197
  merge_context->GetOperands(), &result, s->logger, s->statistics,
1183
1198
  s->clock, /* result_operand */ nullptr,
1184
- /* update_num_ops_stats */ true);
1199
+ /* update_num_ops_stats */ true,
1200
+ /* op_failure_scope */ nullptr);
1185
1201
 
1186
1202
  if (s->status->ok()) {
1187
1203
  if (s->value) {
@@ -1191,6 +1207,11 @@ static bool SaveValue(void* arg, const char* entry) {
1191
1207
  s->columns->SetPlainValue(result);
1192
1208
  }
1193
1209
  }
1210
+ } else {
1211
+ // We have found a final value (a base deletion) and have newer
1212
+ // merge operands that we do not intend to merge. Nothing remains
1213
+ // to be done so assign status to OK.
1214
+ *(s->status) = Status::OK();
1194
1215
  }
1195
1216
  } else {
1196
1217
  *(s->status) = Status::NotFound();
@@ -1217,11 +1238,15 @@ static bool SaveValue(void* arg, const char* entry) {
1217
1238
  merge_context->GetOperandsDirectionBackward())) {
1218
1239
  if (s->value || s->columns) {
1219
1240
  std::string result;
1241
+ // `op_failure_scope` (an output parameter) is not provided (set to
1242
+ // nullptr) since a failure must be propagated regardless of its
1243
+ // value.
1220
1244
  *(s->status) = MergeHelper::TimedFullMerge(
1221
1245
  merge_operator, s->key->user_key(), nullptr,
1222
1246
  merge_context->GetOperands(), &result, s->logger, s->statistics,
1223
1247
  s->clock, /* result_operand */ nullptr,
1224
- /* update_num_ops_stats */ true);
1248
+ /* update_num_ops_stats */ true,
1249
+ /* op_failure_scope */ nullptr);
1225
1250
 
1226
1251
  if (s->status->ok()) {
1227
1252
  if (s->value) {