@nxtedition/rocksdb 8.1.4 → 8.1.6

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 (223) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
  2. package/deps/rocksdb/rocksdb/Makefile +15 -3
  3. package/deps/rocksdb/rocksdb/TARGETS +6 -0
  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_file_builder.cc +5 -26
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
  30. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
  33. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
  34. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
  35. package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
  36. package/deps/rocksdb/rocksdb/db/builder.h +2 -1
  37. package/deps/rocksdb/rocksdb/db/c.cc +15 -0
  38. package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
  39. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
  40. package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  60. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
  61. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
  67. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
  76. package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
  77. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  78. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
  79. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
  80. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
  81. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
  83. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
  84. package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
  85. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  86. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
  87. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  88. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  89. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  90. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
  93. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
  94. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
  95. package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
  96. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
  97. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
  98. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  99. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  100. package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
  101. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
  103. package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
  104. package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
  105. package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
  106. package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
  107. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  108. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
  110. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  111. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  112. package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
  113. package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
  114. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
  115. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  116. package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
  117. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  118. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
  119. package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
  121. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
  122. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
  123. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
  124. package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
  125. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  126. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
  127. package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
  128. package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
  129. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  130. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
  137. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
  138. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
  139. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
  140. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
  142. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
  144. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  146. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
  148. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
  150. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  151. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
  152. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  153. package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
  154. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
  155. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  156. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
  157. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  158. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  159. package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
  160. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  161. package/deps/rocksdb/rocksdb/src.mk +3 -0
  162. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
  175. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
  177. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
  178. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
  181. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
  182. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
  183. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
  185. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  186. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  187. package/deps/rocksdb/rocksdb/table/format.h +6 -3
  188. package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
  189. package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
  190. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
  191. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  192. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  193. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  194. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
  196. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
  197. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
  198. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  199. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
  200. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
  201. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  202. package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
  203. package/deps/rocksdb/rocksdb/util/compression.h +11 -2
  204. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  205. package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
  206. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
  207. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
  208. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
  209. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
  210. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  211. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
  212. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
  213. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
  214. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
  215. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
  216. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
  217. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
  218. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  219. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
  220. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
  221. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
  222. package/package.json +1 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
@@ -49,6 +49,9 @@
49
49
  #include "util/string_util.h"
50
50
  #include "utilities/merge_operators.h"
51
51
 
52
+ // In case defined by Windows headers
53
+ #undef small
54
+
52
55
  namespace ROCKSDB_NAMESPACE {
53
56
  class MockEnv;
54
57
 
@@ -870,17 +873,34 @@ class FlushCounterListener : public EventListener {
870
873
  #endif
871
874
 
872
875
  // A test merge operator mimics put but also fails if one of merge operands is
873
- // "corrupted".
876
+ // "corrupted", "corrupted_try_merge", or "corrupted_must_merge".
874
877
  class TestPutOperator : public MergeOperator {
875
878
  public:
876
879
  virtual bool FullMergeV2(const MergeOperationInput& merge_in,
877
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
+ };
878
897
  if (merge_in.existing_value != nullptr &&
879
- *(merge_in.existing_value) == "corrupted") {
898
+ !check_operand(*merge_in.existing_value,
899
+ &merge_out->op_failure_scope)) {
880
900
  return false;
881
901
  }
882
902
  for (auto value : merge_in.operand_list) {
883
- if (value == "corrupted") {
903
+ if (!check_operand(value, &merge_out->op_failure_scope)) {
884
904
  return false;
885
905
  }
886
906
  }
@@ -900,17 +920,18 @@ class CacheWrapper : public Cache {
900
920
 
901
921
  const char* Name() const override { return target_->Name(); }
902
922
 
903
- using Cache::Insert;
904
- Status Insert(const Slice& key, void* value, size_t charge,
905
- void (*deleter)(const Slice& key, void* value),
923
+ Status Insert(const Slice& key, ObjectPtr value,
924
+ const CacheItemHelper* helper, size_t charge,
906
925
  Handle** handle = nullptr,
907
926
  Priority priority = Priority::LOW) override {
908
- return target_->Insert(key, value, charge, deleter, handle, priority);
927
+ return target_->Insert(key, value, helper, charge, handle, priority);
909
928
  }
910
929
 
911
- using Cache::Lookup;
912
- Handle* Lookup(const Slice& key, Statistics* stats = nullptr) override {
913
- 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);
914
935
  }
915
936
 
916
937
  bool Ref(Handle* handle) override { return target_->Ref(handle); }
@@ -920,7 +941,7 @@ class CacheWrapper : public Cache {
920
941
  return target_->Release(handle, erase_if_last_ref);
921
942
  }
922
943
 
923
- void* Value(Handle* handle) override { return target_->Value(handle); }
944
+ ObjectPtr Value(Handle* handle) override { return target_->Value(handle); }
924
945
 
925
946
  void Erase(const Slice& key) override { target_->Erase(key); }
926
947
  uint64_t NewId() override { return target_->NewId(); }
@@ -949,18 +970,13 @@ class CacheWrapper : public Cache {
949
970
  return target_->GetCharge(handle);
950
971
  }
951
972
 
952
- DeleterFn GetDeleter(Handle* handle) const override {
953
- return target_->GetDeleter(handle);
954
- }
955
-
956
- void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
957
- bool thread_safe) override {
958
- target_->ApplyToAllCacheEntries(callback, thread_safe);
973
+ const CacheItemHelper* GetCacheItemHelper(Handle* handle) const override {
974
+ return target_->GetCacheItemHelper(handle);
959
975
  }
960
976
 
961
977
  void ApplyToAllEntries(
962
- const std::function<void(const Slice& key, void* value, size_t charge,
963
- DeleterFn deleter)>& callback,
978
+ const std::function<void(const Slice& key, ObjectPtr value, size_t charge,
979
+ const CacheItemHelper* helper)>& callback,
964
980
  const ApplyToAllEntriesOptions& opts) override {
965
981
  target_->ApplyToAllEntries(callback, opts);
966
982
  }
@@ -988,9 +1004,8 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
988
1004
  public:
989
1005
  explicit TargetCacheChargeTrackingCache(std::shared_ptr<Cache> target);
990
1006
 
991
- using Cache::Insert;
992
- Status Insert(const Slice& key, void* value, size_t charge,
993
- void (*deleter)(const Slice& key, void* value),
1007
+ Status Insert(const Slice& key, ObjectPtr value,
1008
+ const CacheItemHelper* helper, size_t charge,
994
1009
  Handle** handle = nullptr,
995
1010
  Priority priority = Priority::LOW) override;
996
1011
 
@@ -1006,7 +1021,7 @@ class TargetCacheChargeTrackingCache : public CacheWrapper {
1006
1021
  }
1007
1022
 
1008
1023
  private:
1009
- static const Cache::DeleterFn kNoopDeleter;
1024
+ static const Cache::CacheItemHelper* kCrmHelper;
1010
1025
 
1011
1026
  std::size_t cur_cache_charge_;
1012
1027
  std::size_t cache_charge_peak_;
@@ -610,6 +610,52 @@ TEST_F(DBWALTest, WALWithChecksumHandoff) {
610
610
  #endif // ROCKSDB_ASSERT_STATUS_CHECKED
611
611
  }
612
612
 
613
+ #ifndef ROCKSDB_LITE
614
+ TEST_F(DBWALTest, LockWal) {
615
+ do {
616
+ Options options = CurrentOptions();
617
+ options.create_if_missing = true;
618
+ DestroyAndReopen(options);
619
+ SyncPoint::GetInstance()->DisableProcessing();
620
+ SyncPoint::GetInstance()->LoadDependency(
621
+ {{"DBWALTest::LockWal:AfterGetSortedWal",
622
+ "DBWALTest::LockWal:BeforeFlush:1"}});
623
+ SyncPoint::GetInstance()->EnableProcessing();
624
+
625
+ ASSERT_OK(Put("foo", "v"));
626
+ ASSERT_OK(Put("bar", "v"));
627
+ port::Thread worker([&]() {
628
+ TEST_SYNC_POINT("DBWALTest::LockWal:BeforeFlush:1");
629
+ Status tmp_s = db_->Flush(FlushOptions());
630
+ ASSERT_OK(tmp_s);
631
+ });
632
+
633
+ ASSERT_OK(db_->LockWAL());
634
+ // Verify writes are stopped
635
+ WriteOptions wopts;
636
+ wopts.no_slowdown = true;
637
+ Status s = db_->Put(wopts, "foo", "dontcare");
638
+ ASSERT_TRUE(s.IsIncomplete());
639
+ {
640
+ VectorLogPtr wals;
641
+ ASSERT_OK(db_->GetSortedWalFiles(wals));
642
+ ASSERT_FALSE(wals.empty());
643
+ }
644
+ TEST_SYNC_POINT("DBWALTest::LockWal:AfterGetSortedWal");
645
+ FlushOptions flush_opts;
646
+ flush_opts.wait = false;
647
+ s = db_->Flush(flush_opts);
648
+ ASSERT_TRUE(s.IsTryAgain());
649
+ ASSERT_OK(db_->UnlockWAL());
650
+ ASSERT_OK(db_->Put(WriteOptions(), "foo", "dontcare"));
651
+
652
+ worker.join();
653
+
654
+ SyncPoint::GetInstance()->DisableProcessing();
655
+ } while (ChangeWalOptions());
656
+ }
657
+ #endif //! ROCKSDB_LITE
658
+
613
659
  class DBRecoveryTestBlobError
614
660
  : public DBWALTest,
615
661
  public testing::WithParamInterface<std::string> {
@@ -1599,6 +1645,89 @@ TEST_F(DBWALTest, RaceInstallFlushResultsWithWalObsoletion) {
1599
1645
  delete db1;
1600
1646
  }
1601
1647
 
1648
+ TEST_F(DBWALTest, FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL) {
1649
+ Options options = CurrentOptions();
1650
+ options.track_and_verify_wals_in_manifest = true;
1651
+ DestroyAndReopen(options);
1652
+
1653
+ // Accumulate memtable m1 and create the 1st wal (i.e, 4.log)
1654
+ ASSERT_OK(Put(Key(1), ""));
1655
+ ASSERT_OK(Put(Key(2), ""));
1656
+ ASSERT_OK(Put(Key(3), ""));
1657
+
1658
+ const std::string wal_file_path = db_->GetName() + "/000004.log";
1659
+
1660
+ // Coerce the following sequence of events:
1661
+ // (1) Flush() marks 4.log to be obsoleted, 8.log to be the latest (i.e,
1662
+ // active) log and release the lock
1663
+ // (2) SyncWAL() proceeds with the lock. It
1664
+ // creates a new manifest and syncs all the inactive wals before the latest
1665
+ // (i.e, active log), which is 4.log. Note that SyncWAL() is not aware of the
1666
+ // fact that 4.log has marked as to be obseleted. Prior to the fix, such wal
1667
+ // sync will then add a WAL addition record of 4.log to the new manifest
1668
+ // without any special treatment.
1669
+ // (3) BackgroundFlush() will eventually purge 4.log.
1670
+ bool wal_synced = false;
1671
+ SyncPoint::GetInstance()->SetCallBack(
1672
+ "FindObsoleteFiles::PostMutexUnlock", [&](void*) {
1673
+ ASSERT_OK(env_->FileExists(wal_file_path));
1674
+
1675
+ SyncPoint::GetInstance()->SetCallBack(
1676
+ "VersionSet::ProcessManifestWrites:"
1677
+ "PostDecidingCreateNewManifestOrNot",
1678
+ [&](void* arg) {
1679
+ bool* new_descriptor_log = (bool*)arg;
1680
+ *new_descriptor_log = true;
1681
+ });
1682
+
1683
+ ASSERT_OK(db_->SyncWAL());
1684
+ wal_synced = true;
1685
+ });
1686
+
1687
+ SyncPoint::GetInstance()->SetCallBack(
1688
+ "DBImpl::DeleteObsoleteFileImpl:AfterDeletion2", [&](void* arg) {
1689
+ std::string* file_name = (std::string*)arg;
1690
+ if (*file_name == wal_file_path) {
1691
+ TEST_SYNC_POINT(
1692
+ "DBWALTest::"
1693
+ "FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL::"
1694
+ "PostDeleteWAL");
1695
+ }
1696
+ });
1697
+
1698
+ SyncPoint::GetInstance()->LoadDependency(
1699
+ {{"DBImpl::BackgroundCallFlush:FilesFound",
1700
+ "PreConfrimObsoletedWALSynced"},
1701
+ {"DBWALTest::FixSyncWalOnObseletedWalWithNewManifestCausingMissingWAL::"
1702
+ "PostDeleteWAL",
1703
+ "PreConfrimWALDeleted"}});
1704
+
1705
+ SyncPoint::GetInstance()->EnableProcessing();
1706
+
1707
+ ASSERT_OK(Flush());
1708
+
1709
+ TEST_SYNC_POINT("PreConfrimObsoletedWALSynced");
1710
+ ASSERT_TRUE(wal_synced);
1711
+
1712
+ TEST_SYNC_POINT("PreConfrimWALDeleted");
1713
+ // BackgroundFlush() purged 4.log
1714
+ // because the memtable associated with the WAL was flushed and new WAL was
1715
+ // created (i.e, 8.log)
1716
+ ASSERT_TRUE(env_->FileExists(wal_file_path).IsNotFound());
1717
+
1718
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1719
+ SyncPoint::GetInstance()->DisableProcessing();
1720
+
1721
+ // To verify the corruption of "Missing WAL with log number: 4" under
1722
+ // `options.track_and_verify_wals_in_manifest = true` is fixed.
1723
+ //
1724
+ // Before the fix, `db_->SyncWAL()` will sync and record WAL addtion of the
1725
+ // obseleted WAL 4.log in a new manifest without any special treament.
1726
+ // This will result in missing-wal corruption in DB::Reopen().
1727
+ Status s = TryReopen(options);
1728
+ EXPECT_OK(s);
1729
+ }
1730
+
1602
1731
  // Test scope:
1603
1732
  // - We expect to open data store under all circumstances
1604
1733
  // - We expect only data upto the point where the first error was encountered
@@ -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) {
@@ -323,6 +323,27 @@ TEST_F(TimestampCompatibleCompactionTest, CompactFilesRangeCheckL1) {
323
323
  static_cast<int>(compaction_job_info.input_files.size()));
324
324
  }
325
325
  }
326
+
327
+ TEST_F(TimestampCompatibleCompactionTest, EmptyCompactionOutput) {
328
+ Options options = CurrentOptions();
329
+ options.env = env_;
330
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
331
+ DestroyAndReopen(options);
332
+
333
+ std::string ts_str = Timestamp(1);
334
+ WriteOptions wopts;
335
+ ASSERT_OK(
336
+ db_->DeleteRange(wopts, db_->DefaultColumnFamily(), "k1", "k3", ts_str));
337
+ ASSERT_OK(Flush());
338
+
339
+ ts_str = Timestamp(3);
340
+ Slice ts = ts_str;
341
+ CompactRangeOptions cro;
342
+ // range tombstone will be dropped during compaction
343
+ cro.full_history_ts_low = &ts;
344
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
345
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
346
+ }
326
347
  #endif // !ROCKSDB_LITE
327
348
 
328
349
  } // namespace ROCKSDB_NAMESPACE
@@ -150,6 +150,31 @@ int InternalKeyComparator::Compare(const ParsedInternalKey& a,
150
150
  return r;
151
151
  }
152
152
 
153
+ int InternalKeyComparator::Compare(const Slice& a,
154
+ const ParsedInternalKey& b) const {
155
+ // Order by:
156
+ // increasing user key (according to user-supplied comparator)
157
+ // decreasing sequence number
158
+ // decreasing type (though sequence# should be enough to disambiguate)
159
+ int r = user_comparator_.Compare(ExtractUserKey(a), b.user_key);
160
+ if (r == 0) {
161
+ const uint64_t anum =
162
+ DecodeFixed64(a.data() + a.size() - kNumInternalBytes);
163
+ const uint64_t bnum = (b.sequence << 8) | b.type;
164
+ if (anum > bnum) {
165
+ r = -1;
166
+ } else if (anum < bnum) {
167
+ r = +1;
168
+ }
169
+ }
170
+ return r;
171
+ }
172
+
173
+ int InternalKeyComparator::Compare(const ParsedInternalKey& a,
174
+ const Slice& b) const {
175
+ return -Compare(b, a);
176
+ }
177
+
153
178
  LookupKey::LookupKey(const Slice& _user_key, SequenceNumber s,
154
179
  const Slice* ts) {
155
180
  size_t usize = _user_key.size();
@@ -283,6 +283,8 @@ class InternalKeyComparator
283
283
 
284
284
  int Compare(const InternalKey& a, const InternalKey& b) const;
285
285
  int Compare(const ParsedInternalKey& a, const ParsedInternalKey& b) const;
286
+ int Compare(const Slice& a, const ParsedInternalKey& b) const;
287
+ int Compare(const ParsedInternalKey& a, const Slice& b) const;
286
288
  // In this `Compare()` overload, the sequence numbers provided in
287
289
  // `a_global_seqno` and `b_global_seqno` override the sequence numbers in `a`
288
290
  // and `b`, respectively. To disable sequence number override(s), provide the
@@ -112,8 +112,9 @@ Status UpdateManifestForFilesState(
112
112
  lf->smallest, lf->largest, lf->fd.smallest_seqno,
113
113
  lf->fd.largest_seqno, lf->marked_for_compaction, temp,
114
114
  lf->oldest_blob_file_number, lf->oldest_ancester_time,
115
- lf->file_creation_time, lf->file_checksum,
116
- lf->file_checksum_func_name, lf->unique_id);
115
+ lf->file_creation_time, lf->epoch_number, lf->file_checksum,
116
+ lf->file_checksum_func_name, lf->unique_id,
117
+ lf->compensated_range_deletion_size);
117
118
  }
118
119
  }
119
120
  } else {
@@ -694,6 +694,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithGlobalSeqnoPickedSeqno) {
694
694
  bool verify_checksums_before_ingest = std::get<1>(GetParam());
695
695
  do {
696
696
  Options options = CurrentOptions();
697
+ options.disable_auto_compactions = true;
697
698
  DestroyAndReopen(options);
698
699
  std::map<std::string, std::string> true_data;
699
700
 
@@ -800,6 +801,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithMultipleValueType) {
800
801
  bool verify_checksums_before_ingest = std::get<1>(GetParam());
801
802
  do {
802
803
  Options options = CurrentOptions();
804
+ options.disable_auto_compactions = true;
803
805
  options.merge_operator.reset(new TestPutOperator());
804
806
  DestroyAndReopen(options);
805
807
  std::map<std::string, std::string> true_data;
@@ -927,6 +929,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestFileWithMixedValueType) {
927
929
  bool verify_checksums_before_ingest = std::get<1>(GetParam());
928
930
  do {
929
931
  Options options = CurrentOptions();
932
+ options.disable_auto_compactions = true;
930
933
  options.merge_operator.reset(new TestPutOperator());
931
934
  DestroyAndReopen(options);
932
935
  std::map<std::string, std::string> true_data;
@@ -469,14 +469,90 @@ Status ExternalSstFileIngestionJob::Run() {
469
469
  f.fd.GetNumber(), f.fd.GetPathId(), f.fd.GetFileSize(),
470
470
  f.smallest_internal_key, f.largest_internal_key, f.assigned_seqno,
471
471
  f.assigned_seqno, false, f.file_temperature, kInvalidBlobFileNumber,
472
- oldest_ancester_time, current_time, f.file_checksum,
473
- f.file_checksum_func_name, f.unique_id);
472
+ oldest_ancester_time, current_time,
473
+ ingestion_options_.ingest_behind
474
+ ? kReservedEpochNumberForFileIngestedBehind
475
+ : cfd_->NewEpochNumber(),
476
+ f.file_checksum, f.file_checksum_func_name, f.unique_id, 0);
474
477
  f_metadata.temperature = f.file_temperature;
475
478
  edit_.AddFile(f.picked_level, f_metadata);
476
479
  }
480
+
481
+ CreateEquivalentFileIngestingCompactions();
477
482
  return status;
478
483
  }
479
484
 
485
+ void ExternalSstFileIngestionJob::CreateEquivalentFileIngestingCompactions() {
486
+ // A map from output level to input of compactions equivalent to this
487
+ // ingestion job.
488
+ // TODO: simplify below logic to creating compaction per ingested file
489
+ // instead of per output level, once we figure out how to treat ingested files
490
+ // with adjacent range deletion tombstones to same output level in the same
491
+ // job as non-overlapping compactions.
492
+ std::map<int, CompactionInputFiles>
493
+ output_level_to_file_ingesting_compaction_input;
494
+
495
+ for (const auto& pair : edit_.GetNewFiles()) {
496
+ int output_level = pair.first;
497
+ const FileMetaData& f_metadata = pair.second;
498
+
499
+ CompactionInputFiles& input =
500
+ output_level_to_file_ingesting_compaction_input[output_level];
501
+ if (input.files.empty()) {
502
+ // Treat the source level of ingested files to be level 0
503
+ input.level = 0;
504
+ }
505
+
506
+ compaction_input_metdatas_.push_back(new FileMetaData(f_metadata));
507
+ input.files.push_back(compaction_input_metdatas_.back());
508
+ }
509
+
510
+ for (const auto& pair : output_level_to_file_ingesting_compaction_input) {
511
+ int output_level = pair.first;
512
+ const CompactionInputFiles& input = pair.second;
513
+
514
+ const auto& mutable_cf_options = *(cfd_->GetLatestMutableCFOptions());
515
+ file_ingesting_compactions_.push_back(new Compaction(
516
+ cfd_->current()->storage_info(), *cfd_->ioptions(), mutable_cf_options,
517
+ mutable_db_options_, {input}, output_level,
518
+ MaxFileSizeForLevel(
519
+ mutable_cf_options, output_level,
520
+ cfd_->ioptions()->compaction_style) /* output file size
521
+ limit,
522
+ * not applicable
523
+ */
524
+ ,
525
+ LLONG_MAX /* max compaction bytes, not applicable */,
526
+ 0 /* output path ID, not applicable */, mutable_cf_options.compression,
527
+ mutable_cf_options.compression_opts, Temperature::kUnknown,
528
+ 0 /* max_subcompaction, not applicable */,
529
+ {} /* grandparents, not applicable */, false /* is manual */,
530
+ "" /* trim_ts */, -1 /* score, not applicable */,
531
+ false /* is deletion compaction, not applicable */,
532
+ files_overlap_ /* l0_files_might_overlap, not applicable */,
533
+ CompactionReason::kExternalSstIngestion));
534
+ }
535
+ }
536
+
537
+ void ExternalSstFileIngestionJob::RegisterRange() {
538
+ for (const auto& c : file_ingesting_compactions_) {
539
+ cfd_->compaction_picker()->RegisterCompaction(c);
540
+ }
541
+ }
542
+
543
+ void ExternalSstFileIngestionJob::UnregisterRange() {
544
+ for (const auto& c : file_ingesting_compactions_) {
545
+ cfd_->compaction_picker()->UnregisterCompaction(c);
546
+ delete c;
547
+ }
548
+ file_ingesting_compactions_.clear();
549
+
550
+ for (const auto& f : compaction_input_metdatas_) {
551
+ delete f;
552
+ }
553
+ compaction_input_metdatas_.clear();
554
+ }
555
+
480
556
  void ExternalSstFileIngestionJob::UpdateStats() {
481
557
  // Update internal stats for new ingested files
482
558
  uint64_t total_keys = 0;
@@ -795,8 +871,16 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
795
871
  if (lvl > 0 && lvl < vstorage->base_level()) {
796
872
  continue;
797
873
  }
798
-
799
- if (vstorage->NumLevelFiles(lvl) > 0) {
874
+ if (cfd_->RangeOverlapWithCompaction(
875
+ file_to_ingest->smallest_internal_key.user_key(),
876
+ file_to_ingest->largest_internal_key.user_key(), lvl)) {
877
+ // We must use L0 or any level higher than `lvl` to be able to overwrite
878
+ // the compaction output keys that we overlap with in this level, We also
879
+ // need to assign this file a seqno to overwrite the compaction output
880
+ // keys in level `lvl`
881
+ overlap_with_db = true;
882
+ break;
883
+ } else if (vstorage->NumLevelFiles(lvl) > 0) {
800
884
  bool overlap_with_level = false;
801
885
  status = sv->current->OverlapWithLevelIterator(
802
886
  ro, env_options_, file_to_ingest->smallest_internal_key.user_key(),
@@ -853,6 +937,7 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
853
937
  target_level < cfd_->NumberLevels() - 1) {
854
938
  status = Status::TryAgain(
855
939
  "Files cannot be ingested to Lmax. Please make sure key range of Lmax "
940
+ "and ongoing compaction's output to Lmax"
856
941
  "does not overlap with files to ingest.");
857
942
  return status;
858
943
  }
@@ -870,7 +955,7 @@ Status ExternalSstFileIngestionJob::AssignLevelAndSeqnoForIngestedFile(
870
955
  Status ExternalSstFileIngestionJob::CheckLevelForIngestedBehindFile(
871
956
  IngestedFileInfo* file_to_ingest) {
872
957
  auto* vstorage = cfd_->current()->storage_info();
873
- // first check if new files fit in the bottommost level
958
+ // First, check if new files fit in the bottommost level
874
959
  int bottom_lvl = cfd_->NumberLevels() - 1;
875
960
  if (!IngestedFileFitInLevel(file_to_ingest, bottom_lvl)) {
876
961
  return Status::InvalidArgument(
@@ -878,7 +963,7 @@ Status ExternalSstFileIngestionJob::CheckLevelForIngestedBehindFile(
878
963
  "at the bottommost level!");
879
964
  }
880
965
 
881
- // second check if despite allow_ingest_behind=true we still have 0 seqnums
966
+ // Second, check if despite allow_ingest_behind=true we still have 0 seqnums
882
967
  // at some upper level
883
968
  for (int lvl = 0; lvl < cfd_->NumberLevels() - 1; lvl++) {
884
969
  for (auto file : vstorage->LevelFiles(lvl)) {
@@ -994,14 +1079,8 @@ bool ExternalSstFileIngestionJob::IngestedFileFitInLevel(
994
1079
  // add it to this level
995
1080
  return false;
996
1081
  }
997
- if (cfd_->RangeOverlapWithCompaction(file_smallest_user_key,
998
- file_largest_user_key, level)) {
999
- // File overlap with a running compaction output that will be stored
1000
- // in this level, we cannot add this file to this level
1001
- return false;
1002
- }
1003
1082
 
1004
- // File did not overlap with level files, our compaction output
1083
+ // File did not overlap with level files, nor compaction output
1005
1084
  return true;
1006
1085
  }
1007
1086
 
@@ -11,6 +11,7 @@
11
11
  #include "db/column_family.h"
12
12
  #include "db/internal_stats.h"
13
13
  #include "db/snapshot_impl.h"
14
+ #include "db/version_edit.h"
14
15
  #include "env/file_system_tracer.h"
15
16
  #include "logging/event_logger.h"
16
17
  #include "options/db_options.h"
@@ -78,7 +79,8 @@ class ExternalSstFileIngestionJob {
78
79
  public:
79
80
  ExternalSstFileIngestionJob(
80
81
  VersionSet* versions, ColumnFamilyData* cfd,
81
- const ImmutableDBOptions& db_options, const EnvOptions& env_options,
82
+ const ImmutableDBOptions& db_options,
83
+ const MutableDBOptions& mutable_db_options, const EnvOptions& env_options,
82
84
  SnapshotList* db_snapshots,
83
85
  const IngestExternalFileOptions& ingestion_options,
84
86
  Directories* directories, EventLogger* event_logger,
@@ -88,6 +90,7 @@ class ExternalSstFileIngestionJob {
88
90
  versions_(versions),
89
91
  cfd_(cfd),
90
92
  db_options_(db_options),
93
+ mutable_db_options_(mutable_db_options),
91
94
  env_options_(env_options),
92
95
  db_snapshots_(db_snapshots),
93
96
  ingestion_options_(ingestion_options),
@@ -99,6 +102,17 @@ class ExternalSstFileIngestionJob {
99
102
  assert(directories != nullptr);
100
103
  }
101
104
 
105
+ ~ExternalSstFileIngestionJob() {
106
+ for (const auto& c : file_ingesting_compactions_) {
107
+ cfd_->compaction_picker()->UnregisterCompaction(c);
108
+ delete c;
109
+ }
110
+
111
+ for (const auto& f : compaction_input_metdatas_) {
112
+ delete f;
113
+ }
114
+ }
115
+
102
116
  // Prepare the job by copying external files into the DB.
103
117
  Status Prepare(const std::vector<std::string>& external_files_paths,
104
118
  const std::vector<std::string>& files_checksums,
@@ -120,6 +134,15 @@ class ExternalSstFileIngestionJob {
120
134
  // REQUIRES: Mutex held
121
135
  Status Run();
122
136
 
137
+ // Register key range involved in this ingestion job
138
+ // to prevent key range conflict with other ongoing compaction/file ingestion
139
+ // REQUIRES: Mutex held
140
+ void RegisterRange();
141
+
142
+ // Unregister key range registered for this ingestion job
143
+ // REQUIRES: Mutex held
144
+ void UnregisterRange();
145
+
123
146
  // Update column family stats.
124
147
  // REQUIRES: Mutex held
125
148
  void UpdateStats();
@@ -175,11 +198,17 @@ class ExternalSstFileIngestionJob {
175
198
  template <typename TWritableFile>
176
199
  Status SyncIngestedFile(TWritableFile* file);
177
200
 
201
+ // Create equivalent `Compaction` objects to this file ingestion job
202
+ // , which will be used to check range conflict with other ongoing
203
+ // compactions.
204
+ void CreateEquivalentFileIngestingCompactions();
205
+
178
206
  SystemClock* clock_;
179
207
  FileSystemPtr fs_;
180
208
  VersionSet* versions_;
181
209
  ColumnFamilyData* cfd_;
182
210
  const ImmutableDBOptions& db_options_;
211
+ const MutableDBOptions& mutable_db_options_;
183
212
  const EnvOptions& env_options_;
184
213
  SnapshotList* db_snapshots_;
185
214
  autovector<IngestedFileInfo> files_to_ingest_;
@@ -196,6 +225,14 @@ class ExternalSstFileIngestionJob {
196
225
  // file_checksum_gen_factory is set, DB will generate checksum each file.
197
226
  bool need_generate_file_checksum_{true};
198
227
  std::shared_ptr<IOTracer> io_tracer_;
228
+
229
+ // Below are variables used in (un)registering range for this ingestion job
230
+ //
231
+ // FileMetaData used in inputs of compactions equivalent to this ingestion
232
+ // job
233
+ std::vector<FileMetaData*> compaction_input_metdatas_;
234
+ // Compactions equivalent to this ingestion job
235
+ std::vector<Compaction*> file_ingesting_compactions_;
199
236
  };
200
237
 
201
238
  } // namespace ROCKSDB_NAMESPACE