@nxtedition/rocksdb 7.1.14 → 7.1.16

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/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -9,12 +9,14 @@
9
9
 
10
10
  #pragma once
11
11
 
12
+ #include "db/range_del_aggregator.h"
12
13
  #include "rocksdb/slice.h"
13
14
  #include "rocksdb/types.h"
14
15
 
15
16
  namespace ROCKSDB_NAMESPACE {
16
17
 
17
18
  class Arena;
19
+ class ArenaWrappedDBIter;
18
20
  class InternalKeyComparator;
19
21
 
20
22
  template <class TValue>
@@ -36,6 +38,8 @@ extern InternalIterator* NewMergingIterator(
36
38
  class MergingIterator;
37
39
 
38
40
  // A builder class to build a merging iterator by adding iterators one by one.
41
+ // User should call only one of AddIterator() or AddPointAndTombstoneIterator()
42
+ // exclusively for the same builder.
39
43
  class MergeIteratorBuilder {
40
44
  public:
41
45
  // comparator: the comparator used in merging comparator
@@ -47,18 +51,41 @@ class MergeIteratorBuilder {
47
51
  // Add iter to the merging iterator.
48
52
  void AddIterator(InternalIterator* iter);
49
53
 
54
+ // Add a point key iterator and a range tombstone iterator.
55
+ // `tombstone_iter_ptr` should and only be set by LevelIterator.
56
+ // *tombstone_iter_ptr will be set to where the merging iterator stores
57
+ // `tombstone_iter` when MergeIteratorBuilder::Finish() is called. This is
58
+ // used by LevelIterator to update range tombstone iters when switching to a
59
+ // different SST file. If a single point iterator with a nullptr range
60
+ // tombstone iterator is provided, and the point iterator is not a level
61
+ // iterator, then this builder will return the point iterator directly,
62
+ // instead of creating a merging iterator on top of it. Internally, if all
63
+ // point iterators are not LevelIterator, then range tombstone iterator is
64
+ // only added to the merging iter if there is a non-null `tombstone_iter`.
65
+ void AddPointAndTombstoneIterator(
66
+ InternalIterator* point_iter, TruncatedRangeDelIterator* tombstone_iter,
67
+ TruncatedRangeDelIterator*** tombstone_iter_ptr = nullptr);
68
+
50
69
  // Get arena used to build the merging iterator. It is called one a child
51
70
  // iterator needs to be allocated.
52
71
  Arena* GetArena() { return arena; }
53
72
 
54
73
  // Return the result merging iterator.
55
- InternalIterator* Finish();
74
+ // If db_iter is not nullptr, then db_iter->SetMemtableRangetombstoneIter()
75
+ // will be called with pointer to where the merging iterator
76
+ // stores the memtable range tombstone iterator.
77
+ // This is used for DB iterator to refresh memtable range tombstones.
78
+ InternalIterator* Finish(ArenaWrappedDBIter* db_iter = nullptr);
56
79
 
57
80
  private:
58
81
  MergingIterator* merge_iter;
59
82
  InternalIterator* first_iter;
60
83
  bool use_merging_iter;
61
84
  Arena* arena;
85
+ // Used to set LevelIterator.range_tombstone_iter_.
86
+ // See AddRangeTombstoneIterator() implementation for more detail.
87
+ std::vector<std::pair<size_t, TruncatedRangeDelIterator***>>
88
+ range_del_iter_ptrs_;
62
89
  };
63
90
 
64
91
  } // namespace ROCKSDB_NAMESPACE
@@ -196,10 +196,11 @@ bool NotifyCollectTableCollectorsOnAdd(
196
196
 
197
197
  void NotifyCollectTableCollectorsOnBlockAdd(
198
198
  const std::vector<std::unique_ptr<IntTblPropCollector>>& collectors,
199
- const uint64_t block_raw_bytes, const uint64_t block_compressed_bytes_fast,
199
+ const uint64_t block_uncomp_bytes,
200
+ const uint64_t block_compressed_bytes_fast,
200
201
  const uint64_t block_compressed_bytes_slow) {
201
202
  for (auto& collector : collectors) {
202
- collector->BlockAdd(block_raw_bytes, block_compressed_bytes_fast,
203
+ collector->BlockAdd(block_uncomp_bytes, block_compressed_bytes_fast,
203
204
  block_compressed_bytes_slow);
204
205
  }
205
206
  }
@@ -92,7 +92,7 @@ bool NotifyCollectTableCollectorsOnAdd(
92
92
 
93
93
  void NotifyCollectTableCollectorsOnBlockAdd(
94
94
  const std::vector<std::unique_ptr<IntTblPropCollector>>& collectors,
95
- uint64_t block_raw_bytes, uint64_t block_compressed_bytes_fast,
95
+ uint64_t block_uncomp_bytes, uint64_t block_compressed_bytes_fast,
96
96
  uint64_t block_compressed_bytes_slow);
97
97
 
98
98
  // NotifyCollectTableCollectorsOnFinish() triggers the `Finish` event for all
@@ -11,7 +11,7 @@ namespace ROCKSDB_NAMESPACE {
11
11
 
12
12
  const PersistentCacheOptions PersistentCacheOptions::kEmpty;
13
13
 
14
- void PersistentCacheHelper::InsertRawPage(
14
+ void PersistentCacheHelper::InsertSerialized(
15
15
  const PersistentCacheOptions& cache_options, const BlockHandle& handle,
16
16
  const char* data, const size_t size) {
17
17
  assert(cache_options.persistent_cache);
@@ -24,7 +24,7 @@ void PersistentCacheHelper::InsertRawPage(
24
24
  .PermitUncheckedError();
25
25
  }
26
26
 
27
- void PersistentCacheHelper::InsertUncompressedPage(
27
+ void PersistentCacheHelper::InsertUncompressed(
28
28
  const PersistentCacheOptions& cache_options, const BlockHandle& handle,
29
29
  const BlockContents& contents) {
30
30
  assert(cache_options.persistent_cache);
@@ -42,11 +42,11 @@ void PersistentCacheHelper::InsertUncompressedPage(
42
42
  ;
43
43
  }
44
44
 
45
- Status PersistentCacheHelper::LookupRawPage(
45
+ Status PersistentCacheHelper::LookupSerialized(
46
46
  const PersistentCacheOptions& cache_options, const BlockHandle& handle,
47
- std::unique_ptr<char[]>* raw_data, const size_t raw_data_size) {
47
+ std::unique_ptr<char[]>* out_data, const size_t expected_data_size) {
48
48
  #ifdef NDEBUG
49
- (void)raw_data_size;
49
+ (void)expected_data_size;
50
50
  #endif
51
51
  assert(cache_options.persistent_cache);
52
52
  assert(cache_options.persistent_cache->IsCompressed());
@@ -56,7 +56,7 @@ Status PersistentCacheHelper::LookupRawPage(
56
56
 
57
57
  size_t size;
58
58
  Status s =
59
- cache_options.persistent_cache->Lookup(key.AsSlice(), raw_data, &size);
59
+ cache_options.persistent_cache->Lookup(key.AsSlice(), out_data, &size);
60
60
  if (!s.ok()) {
61
61
  // cache miss
62
62
  RecordTick(cache_options.statistics, PERSISTENT_CACHE_MISS);
@@ -65,13 +65,14 @@ Status PersistentCacheHelper::LookupRawPage(
65
65
 
66
66
  // cache hit
67
67
  // Block-based table is assumed
68
- assert(raw_data_size == handle.size() + BlockBasedTable::kBlockTrailerSize);
69
- assert(size == raw_data_size);
68
+ assert(expected_data_size ==
69
+ handle.size() + BlockBasedTable::kBlockTrailerSize);
70
+ assert(size == expected_data_size);
70
71
  RecordTick(cache_options.statistics, PERSISTENT_CACHE_HIT);
71
72
  return Status::OK();
72
73
  }
73
74
 
74
- Status PersistentCacheHelper::LookupUncompressedPage(
75
+ Status PersistentCacheHelper::LookupUncompressed(
75
76
  const PersistentCacheOptions& cache_options, const BlockHandle& handle,
76
77
  BlockContents* contents) {
77
78
  assert(cache_options.persistent_cache);
@@ -19,26 +19,28 @@ struct BlockContents;
19
19
  // Encapsulates some of the helper logic for read and writing from the cache
20
20
  class PersistentCacheHelper {
21
21
  public:
22
- // insert block into raw page cache
23
- static void InsertRawPage(const PersistentCacheOptions& cache_options,
24
- const BlockHandle& handle, const char* data,
25
- const size_t size);
26
-
27
- // insert block into uncompressed cache
28
- static void InsertUncompressedPage(
29
- const PersistentCacheOptions& cache_options, const BlockHandle& handle,
30
- const BlockContents& contents);
31
-
32
- // lookup block from raw page cacge
33
- static Status LookupRawPage(const PersistentCacheOptions& cache_options,
34
- const BlockHandle& handle,
35
- std::unique_ptr<char[]>* raw_data,
36
- const size_t raw_data_size);
37
-
38
- // lookup block from uncompressed cache
39
- static Status LookupUncompressedPage(
40
- const PersistentCacheOptions& cache_options, const BlockHandle& handle,
41
- BlockContents* contents);
22
+ // Insert block into cache of serialized blocks. Size includes block trailer
23
+ // (if applicable).
24
+ static void InsertSerialized(const PersistentCacheOptions& cache_options,
25
+ const BlockHandle& handle, const char* data,
26
+ const size_t size);
27
+
28
+ // Insert block into cache of uncompressed blocks. No block trailer.
29
+ static void InsertUncompressed(const PersistentCacheOptions& cache_options,
30
+ const BlockHandle& handle,
31
+ const BlockContents& contents);
32
+
33
+ // Lookup block from cache of serialized blocks. Size includes block trailer
34
+ // (if applicable).
35
+ static Status LookupSerialized(const PersistentCacheOptions& cache_options,
36
+ const BlockHandle& handle,
37
+ std::unique_ptr<char[]>* out_data,
38
+ const size_t expected_data_size);
39
+
40
+ // Lookup block from uncompressed cache. No block trailer.
41
+ static Status LookupUncompressed(const PersistentCacheOptions& cache_options,
42
+ const BlockHandle& handle,
43
+ BlockContents* contents);
42
44
  };
43
45
 
44
46
  } // namespace ROCKSDB_NAMESPACE
@@ -277,7 +277,7 @@ Status PlainTableBuilder::Finish() {
277
277
  IOStatus s = WriteBlock(property_block_builder.Finish(), file_, &offset_,
278
278
  &property_block_handle);
279
279
  if (!s.ok()) {
280
- return std::move(s);
280
+ return static_cast<Status>(s);
281
281
  }
282
282
  meta_index_builer.Add(kPropertiesBlockName, property_block_handle);
283
283
 
@@ -36,7 +36,7 @@ class SstFileWriterPropertiesCollector : public IntTblPropCollector {
36
36
  return Status::OK();
37
37
  }
38
38
 
39
- virtual void BlockAdd(uint64_t /* block_raw_bytes */,
39
+ virtual void BlockAdd(uint64_t /* block_uncomp_bytes */,
40
40
  uint64_t /* block_compressed_bytes_fast */,
41
41
  uint64_t /* block_compressed_bytes_slow */) override {
42
42
  // Intentionally left blank. No interest in collecting stats for
@@ -22,6 +22,7 @@
22
22
  #include "options/cf_options.h"
23
23
  #include "rocksdb/options.h"
24
24
  #include "rocksdb/table_properties.h"
25
+ #include "table/unique_id_impl.h"
25
26
  #include "trace_replay/block_cache_tracer.h"
26
27
 
27
28
  namespace ROCKSDB_NAMESPACE {
@@ -40,25 +41,8 @@ struct TableReaderOptions {
40
41
  bool _force_direct_prefetch = false, int _level = -1,
41
42
  BlockCacheTracer* const _block_cache_tracer = nullptr,
42
43
  size_t _max_file_size_for_l0_meta_pin = 0,
43
- const std::string& _cur_db_session_id = "", uint64_t _cur_file_num = 0)
44
- : TableReaderOptions(
45
- _ioptions, _prefix_extractor, _env_options, _internal_comparator,
46
- _skip_filters, _immortal, _force_direct_prefetch, _level,
47
- 0 /* _largest_seqno */, _block_cache_tracer,
48
- _max_file_size_for_l0_meta_pin, _cur_db_session_id, _cur_file_num) {
49
- }
50
-
51
- // @param skip_filters Disables loading/accessing the filter block
52
- TableReaderOptions(
53
- const ImmutableOptions& _ioptions,
54
- const std::shared_ptr<const SliceTransform>& _prefix_extractor,
55
- const EnvOptions& _env_options,
56
- const InternalKeyComparator& _internal_comparator, bool _skip_filters,
57
- bool _immortal, bool _force_direct_prefetch, int _level,
58
- SequenceNumber _largest_seqno,
59
- BlockCacheTracer* const _block_cache_tracer,
60
- size_t _max_file_size_for_l0_meta_pin,
61
- const std::string& _cur_db_session_id, uint64_t _cur_file_num)
44
+ const std::string& _cur_db_session_id = "", uint64_t _cur_file_num = 0,
45
+ UniqueId64x2 _unique_id = {}, SequenceNumber _largest_seqno = 0)
62
46
  : ioptions(_ioptions),
63
47
  prefix_extractor(_prefix_extractor),
64
48
  env_options(_env_options),
@@ -71,7 +55,8 @@ struct TableReaderOptions {
71
55
  block_cache_tracer(_block_cache_tracer),
72
56
  max_file_size_for_l0_meta_pin(_max_file_size_for_l0_meta_pin),
73
57
  cur_db_session_id(_cur_db_session_id),
74
- cur_file_num(_cur_file_num) {}
58
+ cur_file_num(_cur_file_num),
59
+ unique_id(_unique_id) {}
75
60
 
76
61
  const ImmutableOptions& ioptions;
77
62
  const std::shared_ptr<const SliceTransform>& prefix_extractor;
@@ -88,7 +73,7 @@ struct TableReaderOptions {
88
73
  // What level this table/file is on, -1 for "not set, don't know." Used
89
74
  // for level-specific statistics.
90
75
  int level;
91
- // largest seqno in the table
76
+ // largest seqno in the table (or 0 means unknown???)
92
77
  SequenceNumber largest_seqno;
93
78
  BlockCacheTracer* const block_cache_tracer;
94
79
  // Largest L0 file size whose meta-blocks may be pinned (can be zero when
@@ -98,6 +83,9 @@ struct TableReaderOptions {
98
83
  std::string cur_db_session_id;
99
84
 
100
85
  uint64_t cur_file_num;
86
+
87
+ // Known unique_id or {}, kNullUniqueId64x2 means unknown
88
+ UniqueId64x2 unique_id;
101
89
  };
102
90
 
103
91
  struct TableBuilderOptions {
@@ -407,7 +407,7 @@ class TableConstructor : public Constructor {
407
407
  EXPECT_EQ(TEST_GetSink()->contents().size(), builder->FileSize());
408
408
 
409
409
  // Open the table
410
- uniq_id_ = cur_uniq_id_++;
410
+ file_num_ = cur_file_num_++;
411
411
 
412
412
  return Reopen(ioptions, moptions);
413
413
  }
@@ -438,15 +438,15 @@ class TableConstructor : public Constructor {
438
438
  virtual Status Reopen(const ImmutableOptions& ioptions,
439
439
  const MutableCFOptions& moptions) {
440
440
  std::unique_ptr<FSRandomAccessFile> source(new test::StringSource(
441
- TEST_GetSink()->contents(), uniq_id_, ioptions.allow_mmap_reads));
441
+ TEST_GetSink()->contents(), file_num_, ioptions.allow_mmap_reads));
442
442
 
443
443
  file_reader_.reset(new RandomAccessFileReader(std::move(source), "test"));
444
444
  return ioptions.table_factory->NewTableReader(
445
445
  TableReaderOptions(ioptions, moptions.prefix_extractor, soptions,
446
446
  *last_internal_comparator_, /*skip_filters*/ false,
447
- /*immortal*/ false, false, level_, largest_seqno_,
447
+ /*immortal*/ false, false, level_,
448
448
  &block_cache_tracer_, moptions.write_buffer_size, "",
449
- uniq_id_),
449
+ file_num_, kNullUniqueId64x2, largest_seqno_),
450
450
  std::move(file_reader_), TEST_GetSink()->contents().size(),
451
451
  &table_reader_);
452
452
  }
@@ -469,14 +469,14 @@ class TableConstructor : public Constructor {
469
469
 
470
470
  private:
471
471
  void Reset() {
472
- uniq_id_ = 0;
472
+ file_num_ = 0;
473
473
  table_reader_.reset();
474
474
  file_writer_.reset();
475
475
  file_reader_.reset();
476
476
  }
477
477
 
478
478
  const ReadOptions read_options_;
479
- uint64_t uniq_id_;
479
+ uint64_t file_num_;
480
480
  std::unique_ptr<WritableFileWriter> file_writer_;
481
481
  std::unique_ptr<RandomAccessFileReader> file_reader_;
482
482
  std::unique_ptr<TableReader> table_reader_;
@@ -486,11 +486,11 @@ class TableConstructor : public Constructor {
486
486
 
487
487
  TableConstructor();
488
488
 
489
- static uint64_t cur_uniq_id_;
489
+ static uint64_t cur_file_num_;
490
490
  EnvOptions soptions;
491
491
  Env* env_;
492
492
  };
493
- uint64_t TableConstructor::cur_uniq_id_ = 1;
493
+ uint64_t TableConstructor::cur_file_num_ = 1;
494
494
 
495
495
  class MemTableConstructor: public Constructor {
496
496
  public:
@@ -1310,7 +1310,7 @@ class FileChecksumTestHelper {
1310
1310
  Status CalculateFileChecksum(FileChecksumGenerator* file_checksum_generator,
1311
1311
  std::string* checksum) {
1312
1312
  assert(file_checksum_generator != nullptr);
1313
- cur_uniq_id_ = checksum_uniq_id_++;
1313
+ cur_file_num_ = checksum_file_num_++;
1314
1314
  test::StringSink* ss_rw =
1315
1315
  static_cast<test::StringSink*>(file_writer_->writable_file());
1316
1316
  std::unique_ptr<FSRandomAccessFile> source(
@@ -1344,17 +1344,17 @@ class FileChecksumTestHelper {
1344
1344
 
1345
1345
  private:
1346
1346
  bool convert_to_internal_key_;
1347
- uint64_t cur_uniq_id_;
1347
+ uint64_t cur_file_num_;
1348
1348
  std::unique_ptr<WritableFileWriter> file_writer_;
1349
1349
  std::unique_ptr<RandomAccessFileReader> file_reader_;
1350
1350
  std::unique_ptr<TableBuilder> table_builder_;
1351
1351
  stl_wrappers::KVMap kv_map_;
1352
1352
  test::StringSink* sink_ = nullptr;
1353
1353
 
1354
- static uint64_t checksum_uniq_id_;
1354
+ static uint64_t checksum_file_num_;
1355
1355
  };
1356
1356
 
1357
- uint64_t FileChecksumTestHelper::checksum_uniq_id_ = 1;
1357
+ uint64_t FileChecksumTestHelper::checksum_file_num_ = 1;
1358
1358
 
1359
1359
  INSTANTIATE_TEST_CASE_P(FormatVersions, BlockBasedTableTest,
1360
1360
  testing::ValuesIn(test::kFooterFormatVersionsToTest));
@@ -8,9 +8,12 @@ import sys
8
8
  from block_cache_pysim import (
9
9
  ARCCache,
10
10
  CacheEntry,
11
+ create_cache,
11
12
  GDSizeCache,
12
13
  HashTable,
13
14
  HyperbolicPolicy,
15
+ kMicrosInSecond,
16
+ kSampleSize,
14
17
  LFUPolicy,
15
18
  LinUCBCache,
16
19
  LRUCache,
@@ -18,13 +21,10 @@ from block_cache_pysim import (
18
21
  MRUPolicy,
19
22
  OPTCache,
20
23
  OPTCacheEntry,
24
+ run,
21
25
  ThompsonSamplingCache,
22
26
  TraceCache,
23
27
  TraceRecord,
24
- create_cache,
25
- kMicrosInSecond,
26
- kSampleSize,
27
- run,
28
28
  )
29
29
 
30
30
 
@@ -13,6 +13,7 @@ import random
13
13
  import sys
14
14
 
15
15
  import matplotlib
16
+
16
17
  matplotlib.use("Agg")
17
18
  import matplotlib.backends.backend_pdf
18
19
  import matplotlib.pyplot as plt
@@ -37,7 +37,6 @@
37
37
  #include <thread>
38
38
  #include <unordered_map>
39
39
 
40
- #include "cache/clock_cache.h"
41
40
  #include "cache/fast_lru_cache.h"
42
41
  #include "db/db_impl/db_impl.h"
43
42
  #include "db/malloc_stats.h"
@@ -560,7 +559,7 @@ DEFINE_bool(universal_incremental, false,
560
559
  DEFINE_int64(cache_size, 8 << 20, // 8MB
561
560
  "Number of bytes to use as a cache of uncompressed data");
562
561
 
563
- DEFINE_int32(cache_numshardbits, 6,
562
+ DEFINE_int32(cache_numshardbits, -1,
564
563
  "Number of shards for the block cache"
565
564
  " is 2 ** cache_numshardbits. Negative means use default settings."
566
565
  " This is applied only if FLAGS_cache_size is non-negative.");
@@ -617,8 +616,11 @@ DEFINE_int64(simcache_size, -1,
617
616
  DEFINE_bool(cache_index_and_filter_blocks, false,
618
617
  "Cache index/filter blocks in block cache.");
619
618
 
619
+ DEFINE_bool(use_cache_jemalloc_no_dump_allocator, false,
620
+ "Use JemallocNodumpAllocator for block/blob cache.");
621
+
620
622
  DEFINE_bool(use_cache_memkind_kmem_allocator, false,
621
- "Use memkind kmem allocator for block cache.");
623
+ "Use memkind kmem allocator for block/blob cache.");
622
624
 
623
625
  DEFINE_bool(partition_index_and_filters, false,
624
626
  "Partition index and filter blocks.");
@@ -1236,6 +1238,14 @@ DEFINE_uint64(
1236
1238
  "BlockBasedTableOptions.initial_auto_readahead_size and doubles on every "
1237
1239
  "additional read upto max_auto_readahead_size");
1238
1240
 
1241
+ DEFINE_uint64(
1242
+ num_file_reads_for_auto_readahead,
1243
+ ROCKSDB_NAMESPACE::BlockBasedTableOptions()
1244
+ .num_file_reads_for_auto_readahead,
1245
+ "Rocksdb implicit readahead is enabled if reads are sequential and "
1246
+ "num_file_reads_for_auto_readahead indicates after how many sequential "
1247
+ "reads into that file internal auto prefetching should be start.");
1248
+
1239
1249
  static enum ROCKSDB_NAMESPACE::CompressionType StringToCompressionType(
1240
1250
  const char* ctype) {
1241
1251
  assert(ctype);
@@ -3020,20 +3030,39 @@ class Benchmark {
3020
3030
  const char* Name() const override { return "KeepFilter"; }
3021
3031
  };
3022
3032
 
3023
- std::shared_ptr<Cache> NewCache(int64_t capacity) {
3033
+ static std::shared_ptr<MemoryAllocator> GetCacheAllocator() {
3034
+ std::shared_ptr<MemoryAllocator> allocator;
3035
+
3036
+ if (FLAGS_use_cache_jemalloc_no_dump_allocator) {
3037
+ JemallocAllocatorOptions jemalloc_options;
3038
+ if (!NewJemallocNodumpAllocator(jemalloc_options, &allocator).ok()) {
3039
+ fprintf(stderr, "JemallocNodumpAllocator not supported.\n");
3040
+ exit(1);
3041
+ }
3042
+ } else if (FLAGS_use_cache_memkind_kmem_allocator) {
3043
+ #ifdef MEMKIND
3044
+ allocator = std::make_shared<MemkindKmemAllocator>();
3045
+ #else
3046
+ fprintf(stderr, "Memkind library is not linked with the binary.\n");
3047
+ exit(1);
3048
+ #endif
3049
+ }
3050
+
3051
+ return allocator;
3052
+ }
3053
+
3054
+ static std::shared_ptr<Cache> NewCache(int64_t capacity) {
3024
3055
  if (capacity <= 0) {
3025
3056
  return nullptr;
3026
3057
  }
3027
3058
  if (FLAGS_cache_type == "clock_cache") {
3028
- auto cache = ExperimentalNewClockCache(
3029
- static_cast<size_t>(capacity), FLAGS_block_size,
3030
- FLAGS_cache_numshardbits, false /*strict_capacity_limit*/,
3031
- kDefaultCacheMetadataChargePolicy);
3032
- if (!cache) {
3033
- fprintf(stderr, "Clock cache not supported.");
3034
- exit(1);
3035
- }
3036
- return cache;
3059
+ fprintf(stderr, "Old clock cache implementation has been removed.\n");
3060
+ exit(1);
3061
+ } else if (FLAGS_cache_type == "hyper_clock_cache") {
3062
+ return HyperClockCacheOptions(static_cast<size_t>(capacity),
3063
+ FLAGS_block_size /*estimated_entry_charge*/,
3064
+ FLAGS_cache_numshardbits)
3065
+ .MakeSharedCache();
3037
3066
  } else if (FLAGS_cache_type == "fast_lru_cache") {
3038
3067
  return NewFastLRUCache(static_cast<size_t>(capacity), FLAGS_block_size,
3039
3068
  FLAGS_cache_numshardbits,
@@ -3043,21 +3072,9 @@ class Benchmark {
3043
3072
  LRUCacheOptions opts(
3044
3073
  static_cast<size_t>(capacity), FLAGS_cache_numshardbits,
3045
3074
  false /*strict_capacity_limit*/, FLAGS_cache_high_pri_pool_ratio,
3046
- #ifdef MEMKIND
3047
- FLAGS_use_cache_memkind_kmem_allocator
3048
- ? std::make_shared<MemkindKmemAllocator>()
3049
- : nullptr,
3050
- #else
3051
- nullptr,
3052
- #endif
3053
- kDefaultToAdaptiveMutex, kDefaultCacheMetadataChargePolicy,
3054
- FLAGS_cache_low_pri_pool_ratio);
3055
- if (FLAGS_use_cache_memkind_kmem_allocator) {
3056
- #ifndef MEMKIND
3057
- fprintf(stderr, "Memkind library is not linked with the binary.");
3058
- exit(1);
3059
- #endif
3060
- }
3075
+ GetCacheAllocator(), kDefaultToAdaptiveMutex,
3076
+ kDefaultCacheMetadataChargePolicy, FLAGS_cache_low_pri_pool_ratio);
3077
+
3061
3078
  #ifndef ROCKSDB_LITE
3062
3079
  if (!FLAGS_secondary_cache_uri.empty()) {
3063
3080
  Status s = SecondaryCache::CreateFromString(
@@ -3598,6 +3615,9 @@ class Benchmark {
3598
3615
  }
3599
3616
  fresh_db = true;
3600
3617
  method = &Benchmark::TimeSeries;
3618
+ } else if (name == "block_cache_entry_stats") {
3619
+ // DB::Properties::kBlockCacheEntryStats
3620
+ PrintStats("rocksdb.block-cache-entry-stats");
3601
3621
  } else if (name == "stats") {
3602
3622
  PrintStats("rocksdb.stats");
3603
3623
  } else if (name == "resetstats") {
@@ -4372,6 +4392,8 @@ class Benchmark {
4372
4392
  FLAGS_max_auto_readahead_size;
4373
4393
  block_based_options.initial_auto_readahead_size =
4374
4394
  FLAGS_initial_auto_readahead_size;
4395
+ block_based_options.num_file_reads_for_auto_readahead =
4396
+ FLAGS_num_file_reads_for_auto_readahead;
4375
4397
  BlockBasedTableOptions::PrepopulateBlockCache prepopulate_block_cache =
4376
4398
  block_based_options.prepopulate_block_cache;
4377
4399
  switch (FLAGS_prepopulate_block_cache) {
@@ -4444,6 +4466,8 @@ class Benchmark {
4444
4466
  LRUCacheOptions co;
4445
4467
  co.capacity = FLAGS_blob_cache_size;
4446
4468
  co.num_shard_bits = FLAGS_blob_cache_numshardbits;
4469
+ co.memory_allocator = GetCacheAllocator();
4470
+
4447
4471
  options.blob_cache = NewLRUCache(co);
4448
4472
  } else {
4449
4473
  fprintf(
@@ -4464,13 +4488,19 @@ class Benchmark {
4464
4488
  fprintf(stderr, "Unknown prepopulate blob cache mode\n");
4465
4489
  exit(1);
4466
4490
  }
4491
+
4467
4492
  fprintf(stdout,
4468
- "Integrated BlobDB: blob cache enabled, block and blob caches "
4469
- "shared: %d, blob cache size %" PRIu64
4470
- ", blob cache num shard bits: %d, hot/warm blobs prepopulated: "
4471
- "%d\n",
4472
- FLAGS_use_shared_block_and_blob_cache, FLAGS_blob_cache_size,
4473
- FLAGS_blob_cache_numshardbits, FLAGS_prepopulate_blob_cache);
4493
+ "Integrated BlobDB: blob cache enabled"
4494
+ ", block and blob caches shared: %d",
4495
+ FLAGS_use_shared_block_and_blob_cache);
4496
+ if (!FLAGS_use_shared_block_and_blob_cache) {
4497
+ fprintf(stdout,
4498
+ ", blob cache size %" PRIu64
4499
+ ", blob cache num shard bits: %d",
4500
+ FLAGS_blob_cache_size, FLAGS_blob_cache_numshardbits);
4501
+ }
4502
+ fprintf(stdout, ", blob cache prepopulated: %d\n",
4503
+ FLAGS_prepopulate_blob_cache);
4474
4504
  } else {
4475
4505
  fprintf(stdout, "Integrated BlobDB: blob cache disabled\n");
4476
4506
  }
@@ -6900,6 +6930,19 @@ class Benchmark {
6900
6930
  std::unique_ptr<const char[]> key_guard;
6901
6931
  Slice key = AllocateKey(&key_guard);
6902
6932
  std::unique_ptr<char[]> ts_guard;
6933
+ std::unique_ptr<const char[]> begin_key_guard;
6934
+ Slice begin_key = AllocateKey(&begin_key_guard);
6935
+ std::unique_ptr<const char[]> end_key_guard;
6936
+ Slice end_key = AllocateKey(&end_key_guard);
6937
+ uint64_t num_range_deletions = 0;
6938
+ std::vector<std::unique_ptr<const char[]>> expanded_key_guards;
6939
+ std::vector<Slice> expanded_keys;
6940
+ if (FLAGS_expand_range_tombstones) {
6941
+ expanded_key_guards.resize(range_tombstone_width_);
6942
+ for (auto& expanded_key_guard : expanded_key_guards) {
6943
+ expanded_keys.emplace_back(AllocateKey(&expanded_key_guard));
6944
+ }
6945
+ }
6903
6946
  if (user_timestamp_size_ > 0) {
6904
6947
  ts_guard.reset(new char[user_timestamp_size_]);
6905
6948
  }
@@ -6962,6 +7005,45 @@ class Benchmark {
6962
7005
  key.size() + val.size(), Env::IO_HIGH,
6963
7006
  nullptr /* stats */, RateLimiter::OpType::kWrite);
6964
7007
  }
7008
+
7009
+ if (writes_per_range_tombstone_ > 0 &&
7010
+ written > writes_before_delete_range_ &&
7011
+ (written - writes_before_delete_range_) /
7012
+ writes_per_range_tombstone_ <=
7013
+ max_num_range_tombstones_ &&
7014
+ (written - writes_before_delete_range_) %
7015
+ writes_per_range_tombstone_ ==
7016
+ 0) {
7017
+ num_range_deletions++;
7018
+ int64_t begin_num = thread->rand.Next() % FLAGS_num;
7019
+ if (FLAGS_expand_range_tombstones) {
7020
+ for (int64_t offset = 0; offset < range_tombstone_width_; ++offset) {
7021
+ GenerateKeyFromInt(begin_num + offset, FLAGS_num,
7022
+ &expanded_keys[offset]);
7023
+ if (!db->Delete(write_options_, expanded_keys[offset]).ok()) {
7024
+ fprintf(stderr, "delete error: %s\n", s.ToString().c_str());
7025
+ exit(1);
7026
+ }
7027
+ }
7028
+ } else {
7029
+ GenerateKeyFromInt(begin_num, FLAGS_num, &begin_key);
7030
+ GenerateKeyFromInt(begin_num + range_tombstone_width_, FLAGS_num,
7031
+ &end_key);
7032
+ if (!db->DeleteRange(write_options_, db->DefaultColumnFamily(),
7033
+ begin_key, end_key)
7034
+ .ok()) {
7035
+ fprintf(stderr, "deleterange error: %s\n", s.ToString().c_str());
7036
+ exit(1);
7037
+ }
7038
+ }
7039
+ thread->stats.FinishedOps(&db_, db_.db, 1, kWrite);
7040
+ // TODO: DeleteRange is not included in calculcation of bytes/rate
7041
+ // limiter request
7042
+ }
7043
+ }
7044
+ if (num_range_deletions > 0) {
7045
+ std::cout << "Number of range deletions: " << num_range_deletions
7046
+ << std::endl;
6965
7047
  }
6966
7048
  thread->stats.AddBytes(bytes);
6967
7049
  }
@@ -4196,7 +4196,12 @@ void UnsafeRemoveSstFileCommand::DoCommand() {
4196
4196
  VersionEdit edit;
4197
4197
  edit.SetColumnFamily(cfd->GetID());
4198
4198
  edit.DeleteFile(level, sst_file_number_);
4199
- s = w.LogAndApply(cfd, &edit);
4199
+ std::unique_ptr<FSDirectory> db_dir;
4200
+ s = options_.env->GetFileSystem()->NewDirectory(db_path_, IOOptions(),
4201
+ &db_dir, nullptr);
4202
+ if (s.ok()) {
4203
+ s = w.LogAndApply(cfd, &edit, db_dir.get());
4204
+ }
4200
4205
  }
4201
4206
 
4202
4207
  if (!s.ok()) {