@nxtedition/rocksdb 13.5.13 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/binding.cc +33 -2
  2. package/binding.gyp +2 -2
  3. package/chained-batch.js +9 -16
  4. package/deps/rocksdb/rocksdb/BUCK +18 -1
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
  6. package/deps/rocksdb/rocksdb/Makefile +20 -9
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +90 -13
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -75
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.h +44 -36
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +184 -148
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +5 -11
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +116 -47
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +3 -6
  15. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -1
  16. package/deps/rocksdb/rocksdb/db/builder.cc +4 -2
  17. package/deps/rocksdb/rocksdb/db/c.cc +207 -0
  18. package/deps/rocksdb/rocksdb/db/c_test.c +72 -0
  19. package/deps/rocksdb/rocksdb/db/column_family.cc +3 -2
  20. package/deps/rocksdb/rocksdb/db/column_family.h +5 -0
  21. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +51 -38
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +29 -12
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +5 -10
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +566 -366
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +131 -4
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +1 -0
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +4 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +13 -14
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +12 -7
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -10
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +97 -76
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +11 -14
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +16 -3
  39. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +1 -0
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +448 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +22 -20
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +4 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -5
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +7 -3
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_iter.cc +104 -0
  47. package/deps/rocksdb/rocksdb/db/db_iter.h +4 -11
  48. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +331 -58
  49. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +129 -0
  50. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -0
  51. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +40 -0
  52. package/deps/rocksdb/rocksdb/db/db_test2.cc +25 -15
  53. package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -24
  54. package/deps/rocksdb/rocksdb/db/db_test_util.h +29 -14
  55. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +69 -36
  56. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +0 -1
  57. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  58. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -4
  59. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +8 -1
  60. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +275 -79
  61. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +23 -5
  62. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +591 -175
  63. package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -4
  64. package/deps/rocksdb/rocksdb/db/log_reader.cc +5 -2
  65. package/deps/rocksdb/rocksdb/db/memtable.cc +84 -35
  66. package/deps/rocksdb/rocksdb/db/memtable.h +39 -34
  67. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -0
  68. package/deps/rocksdb/rocksdb/db/merge_operator.cc +1 -1
  69. package/deps/rocksdb/rocksdb/db/multi_scan.cc +11 -5
  70. package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -1
  71. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
  72. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +34 -14
  73. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +28 -5
  74. package/deps/rocksdb/rocksdb/db/version_set.cc +159 -14
  75. package/deps/rocksdb/rocksdb/db/version_set.h +2 -0
  76. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -1
  77. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +60 -0
  78. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +16 -1
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +75 -10
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.cc +28 -0
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +2 -0
  82. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -1
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +50 -2
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +57 -0
  85. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +0 -4
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +266 -35
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -6
  89. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +18 -2
  90. package/deps/rocksdb/rocksdb/env/env.cc +12 -0
  91. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -0
  92. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +2 -0
  93. package/deps/rocksdb/rocksdb/env/fs_posix.cc +9 -5
  94. package/deps/rocksdb/rocksdb/env/io_posix.cc +4 -2
  95. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +19 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +33 -31
  97. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +42 -9
  98. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +93 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +43 -49
  100. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +4 -3
  101. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +8 -6
  102. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +487 -0
  103. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +11 -12
  104. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +135 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -0
  106. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +12 -0
  107. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -1
  108. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +8 -0
  109. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +12 -8
  110. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +3 -0
  111. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +19 -9
  112. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +219 -24
  113. package/deps/rocksdb/rocksdb/include/rocksdb/point_lock_bench_tool.h +14 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +2 -2
  115. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +1 -1
  116. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +7 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +16 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +16 -4
  119. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +13 -0
  120. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +0 -2
  122. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +45 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +1 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +1 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +6 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  128. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +3 -3
  129. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +77 -51
  130. package/deps/rocksdb/rocksdb/memtable/skiplist.h +10 -13
  131. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +16 -7
  132. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +9 -4
  133. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -0
  134. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -1
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  137. package/deps/rocksdb/rocksdb/options/options.cc +2 -0
  138. package/deps/rocksdb/rocksdb/options/options_helper.cc +9 -8
  139. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -5
  140. package/deps/rocksdb/rocksdb/port/mmap.cc +1 -1
  141. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -0
  142. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +4 -0
  143. package/deps/rocksdb/rocksdb/src.mk +8 -2
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1125 -765
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +35 -24
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +29 -4
  147. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +732 -256
  148. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +225 -16
  149. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -26
  150. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  151. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -75
  152. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +433 -141
  153. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -0
  154. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +17 -10
  155. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy_impl.h +20 -0
  156. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +112 -85
  157. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +191 -36
  158. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +2 -2
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  160. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +108 -31
  161. package/deps/rocksdb/rocksdb/table/external_table.cc +7 -3
  162. package/deps/rocksdb/rocksdb/table/format.cc +6 -12
  163. package/deps/rocksdb/rocksdb/table/format.h +10 -0
  164. package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
  165. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -1
  166. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -1
  167. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +5 -0
  168. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -1
  169. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +118 -46
  170. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +9 -8
  171. package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
  172. package/deps/rocksdb/rocksdb/table/table_properties.cc +16 -0
  173. package/deps/rocksdb/rocksdb/table/table_test.cc +1540 -155
  174. package/deps/rocksdb/rocksdb/test_util/testutil.h +21 -5
  175. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -5
  176. package/deps/rocksdb/rocksdb/tools/ldb.cc +1 -2
  177. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +2 -0
  178. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -3
  179. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +133 -165
  180. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +173 -64
  181. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +69 -0
  182. package/deps/rocksdb/rocksdb/util/atomic.h +6 -0
  183. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +29 -20
  184. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +10 -6
  185. package/deps/rocksdb/rocksdb/util/bit_fields.h +338 -0
  186. package/deps/rocksdb/rocksdb/util/coding.h +3 -3
  187. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -2
  188. package/deps/rocksdb/rocksdb/util/compression.cc +777 -82
  189. package/deps/rocksdb/rocksdb/util/compression.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/compression_test.cc +5 -3
  191. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +2 -2
  192. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +15 -14
  193. package/deps/rocksdb/rocksdb/util/interval_test.cc +102 -0
  194. package/deps/rocksdb/rocksdb/util/semaphore.h +164 -0
  195. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +10 -6
  196. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -2
  197. package/deps/rocksdb/rocksdb/util/slice_test.cc +136 -0
  198. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  199. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -16
  200. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -1
  201. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
  202. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +7 -4
  203. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +35 -14
  204. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +2 -0
  205. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +5 -2
  206. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/any_lock_manager_test.h +244 -0
  207. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench.cc +18 -0
  208. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench_tool.cc +159 -0
  209. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +1244 -161
  210. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +66 -12
  211. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_stress_test.cc +103 -0
  212. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +1275 -8
  213. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +40 -262
  214. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test_common.h +78 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_validation_test_runner.h +469 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -6
  217. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +4 -0
  218. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +9 -1
  219. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +18 -9
  220. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +2 -0
  221. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +2 -1
  222. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +72 -44
  223. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +92 -15
  224. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +6 -20
  225. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +143 -112
  226. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +23 -16
  227. package/index.js +3 -3
  228. package/package.json +1 -1
  229. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  230. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  231. package/util.h +38 -12
  232. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.cc +0 -17
@@ -80,6 +80,8 @@ class BlockBuilder {
80
80
  // Return true iff no entries have been added since the last Reset()
81
81
  bool empty() const { return buffer_.empty(); }
82
82
 
83
+ std::string& MutableBuffer() { return buffer_; }
84
+
83
85
  private:
84
86
  inline void AddWithLastKeyImpl(const Slice& key, const Slice& value,
85
87
  const Slice& last_key,
@@ -19,7 +19,7 @@
19
19
  namespace ROCKSDB_NAMESPACE {
20
20
 
21
21
  // Flush block by size
22
- class FlushBlockBySizePolicy : public FlushBlockPolicy {
22
+ class FlushBlockBySizePolicy : public RetargetableFlushBlockPolicy {
23
23
  public:
24
24
  // @params block_size: Approximate size of user data packed per
25
25
  // block.
@@ -28,19 +28,19 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
28
28
  FlushBlockBySizePolicy(const uint64_t block_size,
29
29
  const uint64_t block_size_deviation, const bool align,
30
30
  const BlockBuilder& data_block_builder)
31
- : block_size_(block_size),
31
+ : RetargetableFlushBlockPolicy(data_block_builder),
32
+ block_size_(block_size),
32
33
  block_size_deviation_limit_(
33
34
  ((block_size * (100 - block_size_deviation)) + 99) / 100),
34
- align_(align),
35
- data_block_builder_(data_block_builder) {}
35
+ align_(align) {}
36
36
 
37
37
  bool Update(const Slice& key, const Slice& value) override {
38
38
  // it makes no sense to flush when the data block is empty
39
- if (data_block_builder_.empty()) {
39
+ if (data_block_builder_->empty()) {
40
40
  return false;
41
41
  }
42
42
 
43
- auto curr_size = data_block_builder_.CurrentSizeEstimate();
43
+ auto curr_size = data_block_builder_->CurrentSizeEstimate();
44
44
 
45
45
  // Do flush if one of the below two conditions is true:
46
46
  // 1) if the current estimated size already exceeds the block size,
@@ -56,9 +56,9 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
56
56
  return false;
57
57
  }
58
58
 
59
- const auto curr_size = data_block_builder_.CurrentSizeEstimate();
59
+ const auto curr_size = data_block_builder_->CurrentSizeEstimate();
60
60
  auto estimated_size_after =
61
- data_block_builder_.EstimateSizeAfterKV(key, value);
61
+ data_block_builder_->EstimateSizeAfterKV(key, value);
62
62
 
63
63
  if (align_) {
64
64
  estimated_size_after += BlockBasedTable::kBlockTrailerSize;
@@ -72,7 +72,6 @@ class FlushBlockBySizePolicy : public FlushBlockPolicy {
72
72
  const uint64_t block_size_;
73
73
  const uint64_t block_size_deviation_limit_;
74
74
  const bool align_;
75
- const BlockBuilder& data_block_builder_;
76
75
  };
77
76
 
78
77
  FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
@@ -83,10 +82,18 @@ FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
83
82
  table_options.block_align, data_block_builder);
84
83
  }
85
84
 
85
+ std::unique_ptr<RetargetableFlushBlockPolicy> NewFlushBlockBySizePolicy(
86
+ const uint64_t size, const int deviation,
87
+ const BlockBuilder& data_block_builder) {
88
+ return std::make_unique<FlushBlockBySizePolicy>(size, deviation, false,
89
+ data_block_builder);
90
+ }
91
+
86
92
  FlushBlockPolicy* FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
87
93
  const uint64_t size, const int deviation,
88
94
  const BlockBuilder& data_block_builder) {
89
- return new FlushBlockBySizePolicy(size, deviation, false, data_block_builder);
95
+ return NewFlushBlockBySizePolicy(size, deviation, data_block_builder)
96
+ .release();
90
97
  }
91
98
 
92
99
  static int RegisterFlushBlockPolicyFactories(ObjectLibrary& library,
@@ -3,6 +3,7 @@
3
3
  // COPYING file in the root directory) and Apache 2.0 License
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
 
6
+ #pragma once
6
7
  #include "rocksdb/flush_block_policy.h"
7
8
 
8
9
  namespace ROCKSDB_NAMESPACE {
@@ -37,4 +38,23 @@ class FlushBlockEveryKeyPolicyFactory : public FlushBlockPolicyFactory {
37
38
  }
38
39
  };
39
40
 
41
+ // For internal use, policy that is stateless after creation, meaning it can
42
+ // be safely re-targeted to another block builder.
43
+ class RetargetableFlushBlockPolicy : public FlushBlockPolicy {
44
+ public:
45
+ explicit RetargetableFlushBlockPolicy(const BlockBuilder& data_block_builder)
46
+ : data_block_builder_(&data_block_builder) {}
47
+
48
+ void Retarget(const BlockBuilder& data_block_builder) {
49
+ data_block_builder_ = &data_block_builder;
50
+ }
51
+
52
+ protected:
53
+ const BlockBuilder* data_block_builder_;
54
+ };
55
+
56
+ std::unique_ptr<RetargetableFlushBlockPolicy> NewFlushBlockBySizePolicy(
57
+ const uint64_t size, const int deviation,
58
+ const BlockBuilder& data_block_builder);
59
+
40
60
  } // namespace ROCKSDB_NAMESPACE
@@ -152,32 +152,43 @@ PartitionedIndexBuilder::PartitionedIndexBuilder(
152
152
  // sub_index_builder. Otherwise, it could be set to true even one of the
153
153
  // sub_index_builders could not safely exclude seq from the keys, then it
154
154
  // wil be enforced on all sub_index_builders on ::Finish.
155
- seperator_is_key_plus_seq_(false),
156
- use_value_delta_encoding_(use_value_delta_encoding) {}
155
+ must_use_separator_with_seq_(false),
156
+ use_value_delta_encoding_(use_value_delta_encoding) {
157
+ MakeNewSubIndexBuilder();
158
+ }
157
159
 
158
160
  void PartitionedIndexBuilder::MakeNewSubIndexBuilder() {
159
- assert(sub_index_builder_ == nullptr);
160
- sub_index_builder_ = std::make_unique<ShortenedIndexBuilder>(
161
+ auto new_builder = std::make_unique<ShortenedIndexBuilder>(
161
162
  comparator_, table_opt_.index_block_restart_interval,
162
163
  table_opt_.format_version, use_value_delta_encoding_,
163
164
  table_opt_.index_shortening, /* include_first_key */ false, ts_sz_,
164
165
  persist_user_defined_timestamps_);
166
+ sub_index_builder_ = new_builder.get();
167
+ // Start next partition entry, where we will modify the key
168
+ entries_.push_back({{}, std::move(new_builder)});
165
169
 
166
- // Set sub_index_builder_->seperator_is_key_plus_seq_ to true if
167
- // seperator_is_key_plus_seq_ is true (internal-key mode) (set to false by
170
+ BlockBuilder* builder_to_monitor;
171
+ // Set sub_index_builder_->must_use_separator_with_seq_ to true if
172
+ // must_use_separator_with_seq_ is true (internal-key mode) (set to false by
168
173
  // default on Creation) so that flush policy can point to
169
174
  // sub_index_builder_->index_block_builder_
170
- if (seperator_is_key_plus_seq_) {
171
- sub_index_builder_->seperator_is_key_plus_seq_ = true;
175
+ if (must_use_separator_with_seq_) {
176
+ sub_index_builder_->must_use_separator_with_seq_ = true;
177
+ builder_to_monitor = &sub_index_builder_->index_block_builder_;
178
+ } else {
179
+ builder_to_monitor = &sub_index_builder_->index_block_builder_without_seq_;
172
180
  }
173
181
 
174
- flush_policy_.reset(FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
175
- table_opt_.metadata_block_size, table_opt_.block_size_deviation,
176
- // Note: this is sub-optimal since sub_index_builder_ could later reset
177
- // seperator_is_key_plus_seq_ but the probability of that is low.
178
- sub_index_builder_->seperator_is_key_plus_seq_
179
- ? sub_index_builder_->index_block_builder_
180
- : sub_index_builder_->index_block_builder_without_seq_));
182
+ if (flush_policy_ == nullptr) {
183
+ // Note: some partitions could be sub-optimal since sub_index_builder_
184
+ // could later reset must_use_separator_with_seq_ but the probability and
185
+ // impact of that are low.
186
+ flush_policy_ = NewFlushBlockBySizePolicy(table_opt_.metadata_block_size,
187
+ table_opt_.block_size_deviation,
188
+ *builder_to_monitor);
189
+ } else {
190
+ flush_policy_->Retarget(*builder_to_monitor);
191
+ }
181
192
  partition_cut_requested_ = false;
182
193
  }
183
194
 
@@ -185,101 +196,117 @@ void PartitionedIndexBuilder::RequestPartitionCut() {
185
196
  partition_cut_requested_ = true;
186
197
  }
187
198
 
199
+ std::unique_ptr<IndexBuilder::PreparedIndexEntry>
200
+ PartitionedIndexBuilder::CreatePreparedIndexEntry() {
201
+ // Fortunately, for ShortenedIndexBuilder, we can prepare an entry from one
202
+ // similarly configured builder and finish it at another.
203
+ return entries_.front().value->CreatePreparedIndexEntry();
204
+ }
205
+ void PartitionedIndexBuilder::PrepareIndexEntry(
206
+ const Slice& last_key_in_current_block,
207
+ const Slice* first_key_in_next_block, PreparedIndexEntry* out) {
208
+ // Fortunately, for ShortenedIndexBuilder, we can prepare an entry from one
209
+ // similarly configured builder and finish it at another. We just have to
210
+ // keep in mind that this first sub builder keeps track of the original
211
+ // must_use_separator_with_seq_ in the pipeline that is then propagated.
212
+ return entries_.front().value->PrepareIndexEntry(
213
+ last_key_in_current_block, first_key_in_next_block, out);
214
+ }
215
+
216
+ void PartitionedIndexBuilder::MaybeFlush(const Slice& index_key,
217
+ const BlockHandle& index_value) {
218
+ bool do_flush = !sub_index_builder_->index_block_builder_.empty() &&
219
+ (partition_cut_requested_ ||
220
+ flush_policy_->Update(
221
+ index_key, EncodedBlockHandle(index_value).AsSlice()));
222
+ if (do_flush) {
223
+ assert(entries_.back().value.get() == sub_index_builder_);
224
+ cut_filter_block = true;
225
+ MakeNewSubIndexBuilder();
226
+ }
227
+ }
228
+
229
+ void PartitionedIndexBuilder::FinishIndexEntry(const BlockHandle& block_handle,
230
+ PreparedIndexEntry* base_entry) {
231
+ using SPIE = ShortenedIndexBuilder::ShortenedPreparedIndexEntry;
232
+ SPIE* entry = static_cast<SPIE*>(base_entry);
233
+
234
+ MaybeFlush(entry->separator_with_seq, block_handle);
235
+
236
+ sub_index_builder_->FinishIndexEntry(block_handle, base_entry);
237
+ std::swap(entries_.back().key, entry->separator_with_seq);
238
+
239
+ if (!must_use_separator_with_seq_ && entry->must_use_separator_with_seq) {
240
+ // We need to apply !must_use_separator_with_seq to all sub-index builders
241
+ must_use_separator_with_seq_ = true;
242
+ flush_policy_->Retarget(sub_index_builder_->index_block_builder_);
243
+ }
244
+ // NOTE: not compatible with coupled partitioned filters so don't need to
245
+ // cut_filter_block
246
+ }
247
+
188
248
  Slice PartitionedIndexBuilder::AddIndexEntry(
189
249
  const Slice& last_key_in_current_block,
190
250
  const Slice* first_key_in_next_block, const BlockHandle& block_handle,
191
251
  std::string* separator_scratch) {
192
- // Note: to avoid two consecuitive flush in the same method call, we do not
193
- // check flush policy when adding the last key
194
- if (UNLIKELY(first_key_in_next_block == nullptr)) { // no more keys
195
- if (sub_index_builder_ == nullptr) {
196
- MakeNewSubIndexBuilder();
197
- // Reserve next partition entry, where we will modify the key and
198
- // eventually set the value
199
- entries_.push_back({{}, {}});
200
- }
201
- auto sep = sub_index_builder_->AddIndexEntry(
202
- last_key_in_current_block, first_key_in_next_block, block_handle,
203
- separator_scratch);
204
- if (!seperator_is_key_plus_seq_ &&
205
- sub_index_builder_->seperator_is_key_plus_seq_) {
206
- // We need to apply !seperator_is_key_plus_seq to all sub-index builders
207
- seperator_is_key_plus_seq_ = true;
208
- // Would associate flush_policy with the appropriate builder, but it won't
209
- // be used again with no more keys
210
- flush_policy_.reset();
211
- }
212
- entries_.back().key.assign(sep.data(), sep.size());
213
- assert(entries_.back().value == nullptr);
214
- std::swap(entries_.back().value, sub_index_builder_);
252
+ // At least when running without parallel compression, maintain behavior of
253
+ // avoiding a last index partition with just one entry
254
+ if (first_key_in_next_block) {
255
+ MaybeFlush(last_key_in_current_block, block_handle);
256
+ }
257
+
258
+ auto sep = sub_index_builder_->AddIndexEntry(last_key_in_current_block,
259
+ first_key_in_next_block,
260
+ block_handle, separator_scratch);
261
+ entries_.back().key.assign(sep.data(), sep.size());
262
+
263
+ if (!must_use_separator_with_seq_ &&
264
+ sub_index_builder_->must_use_separator_with_seq_) {
265
+ // We need to apply !must_use_separator_with_seq to all sub-index builders
266
+ must_use_separator_with_seq_ = true;
267
+ flush_policy_->Retarget(sub_index_builder_->index_block_builder_);
268
+ }
269
+ if (UNLIKELY(first_key_in_next_block == nullptr)) {
270
+ // no more keys
215
271
  cut_filter_block = true;
216
- return sep;
217
- } else {
218
- // apply flush policy only to non-empty sub_index_builder_
219
- if (sub_index_builder_ != nullptr) {
220
- std::string handle_encoding;
221
- block_handle.EncodeTo(&handle_encoding);
222
- bool do_flush =
223
- partition_cut_requested_ ||
224
- flush_policy_->Update(last_key_in_current_block, handle_encoding);
225
- if (do_flush) {
226
- assert(entries_.back().value == nullptr);
227
- std::swap(entries_.back().value, sub_index_builder_);
228
- cut_filter_block = true;
229
- }
230
- }
231
- if (sub_index_builder_ == nullptr) {
232
- MakeNewSubIndexBuilder();
233
- // Reserve next partition entry, where we will modify the key and
234
- // eventually set the value
235
- entries_.push_back({{}, {}});
236
- }
237
- auto sep = sub_index_builder_->AddIndexEntry(
238
- last_key_in_current_block, first_key_in_next_block, block_handle,
239
- separator_scratch);
240
- entries_.back().key.assign(sep.data(), sep.size());
241
- if (!seperator_is_key_plus_seq_ &&
242
- sub_index_builder_->seperator_is_key_plus_seq_) {
243
- // We need to apply !seperator_is_key_plus_seq to all sub-index builders
244
- seperator_is_key_plus_seq_ = true;
245
- // And use a flush_policy with the appropriate builder
246
- flush_policy_.reset(FlushBlockBySizePolicyFactory::NewFlushBlockPolicy(
247
- table_opt_.metadata_block_size, table_opt_.block_size_deviation,
248
- sub_index_builder_->index_block_builder_));
249
- }
250
- return sep;
251
272
  }
273
+ return sep;
252
274
  }
253
275
 
254
276
  Status PartitionedIndexBuilder::Finish(
255
277
  IndexBlocks* index_blocks, const BlockHandle& last_partition_block_handle) {
256
278
  if (partition_cnt_ == 0) {
257
- partition_cnt_ = entries_.size();
279
+ sub_index_builder_ = nullptr;
280
+ if (!entries_.empty()) {
281
+ // Remove the last entry if it is empty
282
+ if (entries_.back().value->index_block_builder_.empty()) {
283
+ assert(entries_.back().key.empty());
284
+ entries_.pop_back();
285
+ }
286
+ partition_cnt_ = entries_.size();
287
+ }
258
288
  }
259
- // It must be set to null after last key is added
260
- assert(sub_index_builder_ == nullptr);
261
- if (finishing_indexes == true) {
289
+ if (finishing_indexes_ == true) {
262
290
  Entry& last_entry = entries_.front();
263
- std::string handle_encoding;
264
- last_partition_block_handle.EncodeTo(&handle_encoding);
291
+ EncodedBlockHandle handle_encoding(last_partition_block_handle);
265
292
  std::string handle_delta_encoding;
266
293
  PutVarsignedint64(
267
294
  &handle_delta_encoding,
268
295
  last_partition_block_handle.size() - last_encoded_handle_.size());
269
296
  last_encoded_handle_ = last_partition_block_handle;
270
297
  const Slice handle_delta_encoding_slice(handle_delta_encoding);
271
- index_block_builder_.Add(last_entry.key, handle_encoding,
298
+ index_block_builder_.Add(last_entry.key, handle_encoding.AsSlice(),
272
299
  &handle_delta_encoding_slice);
273
- if (!seperator_is_key_plus_seq_) {
300
+ if (!must_use_separator_with_seq_) {
274
301
  index_block_builder_without_seq_.Add(ExtractUserKey(last_entry.key),
275
- handle_encoding,
302
+ handle_encoding.AsSlice(),
276
303
  &handle_delta_encoding_slice);
277
304
  }
278
305
  entries_.pop_front();
279
306
  }
280
307
  // If there is no sub_index left, then return the 2nd level index.
281
308
  if (UNLIKELY(entries_.empty())) {
282
- if (seperator_is_key_plus_seq_) {
309
+ if (must_use_separator_with_seq_) {
283
310
  index_blocks->index_block_contents = index_block_builder_.Finish();
284
311
  } else {
285
312
  index_blocks->index_block_contents =
@@ -293,10 +320,10 @@ Status PartitionedIndexBuilder::Finish(
293
320
  // expect more calls to Finish
294
321
  Entry& entry = entries_.front();
295
322
  // Apply the policy to all sub-indexes
296
- entry.value->seperator_is_key_plus_seq_ = seperator_is_key_plus_seq_;
323
+ entry.value->must_use_separator_with_seq_ = must_use_separator_with_seq_;
297
324
  auto s = entry.value->Finish(index_blocks);
298
325
  index_size_ += index_blocks->index_block_contents.size();
299
- finishing_indexes = true;
326
+ finishing_indexes_ = true;
300
327
  return s.ok() ? Status::Incomplete() : s;
301
328
  }
302
329
  }