@nxtedition/rocksdb 7.1.29 → 7.1.31

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 (382) hide show
  1. package/binding.cc +34 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -2
  3. package/deps/rocksdb/rocksdb/cache/cache_test.cc +15 -23
  4. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -1
  5. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +4 -5
  6. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -1
  7. package/deps/rocksdb/rocksdb/crash_test.mk +1 -1
  8. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +15 -0
  9. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +1 -1
  10. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -1
  11. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +78 -6
  12. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +32 -6
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -8
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +47 -8
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -3
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +105 -166
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +3 -4
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +46 -15
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +47 -26
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +17 -10
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +11 -5
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +12 -6
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -2
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +337 -103
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -5
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -2
  28. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +524 -1
  29. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +164 -0
  30. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +6 -6
  31. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5 -7
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -1
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +4 -4
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +2 -3
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +1 -1
  38. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  39. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -23
  40. package/deps/rocksdb/rocksdb/db/merge_helper.cc +30 -0
  41. package/deps/rocksdb/rocksdb/db/merge_helper.h +9 -0
  42. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +29 -9
  43. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +10 -7
  44. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +12 -8
  45. package/deps/rocksdb/rocksdb/db/version_set.cc +11 -6
  46. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +142 -0
  47. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +59 -53
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -2
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -3
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +7 -4
  52. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +0 -2
  53. package/deps/rocksdb/rocksdb/env/env.cc +16 -19
  54. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -1
  55. package/deps/rocksdb/rocksdb/env/env_chroot.cc +20 -20
  56. package/deps/rocksdb/rocksdb/env/env_encryption.cc +62 -60
  57. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  58. package/deps/rocksdb/rocksdb/env/env_test.cc +179 -176
  59. package/deps/rocksdb/rocksdb/env/file_system.cc +3 -4
  60. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -2
  61. package/deps/rocksdb/rocksdb/env/io_posix.h +1 -2
  62. package/deps/rocksdb/rocksdb/env/mock_env.h +1 -0
  63. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +4 -4
  64. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +6 -5
  65. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +2 -5
  66. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +6 -7
  67. package/deps/rocksdb/rocksdb/file/file_util.cc +1 -1
  68. package/deps/rocksdb/rocksdb/file/filename.cc +16 -17
  69. package/deps/rocksdb/rocksdb/file/filename.h +4 -5
  70. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +492 -496
  71. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +1 -1
  72. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +1 -3
  73. package/deps/rocksdb/rocksdb/file/read_write_util.cc +1 -0
  74. package/deps/rocksdb/rocksdb/file/read_write_util.h +1 -0
  75. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +6 -8
  76. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +1 -2
  77. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -4
  78. package/deps/rocksdb/rocksdb/include/rocksdb/block_cache_trace_writer.h +4 -4
  79. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +166 -167
  80. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +1 -0
  81. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +0 -1
  82. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +12 -12
  83. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +2 -0
  84. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +1 -0
  85. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +1 -0
  86. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -1
  87. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +1 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +1 -0
  89. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +0 -4
  90. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -3
  91. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +1 -1
  92. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  94. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +1 -0
  95. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +1 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +1 -0
  97. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +4 -4
  98. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -4
  100. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +1 -1
  101. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +2 -2
  102. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  103. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +3 -3
  104. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +3 -7
  105. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +20 -23
  106. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/logging/event_logger.cc +1 -3
  108. package/deps/rocksdb/rocksdb/logging/event_logger.h +4 -5
  109. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +2 -1
  110. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -3
  111. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -2
  112. package/deps/rocksdb/rocksdb/logging/logging.h +3 -3
  113. package/deps/rocksdb/rocksdb/memory/allocator.h +1 -0
  114. package/deps/rocksdb/rocksdb/memory/arena_test.cc +1 -1
  115. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +2 -0
  116. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -0
  117. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -0
  118. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +17 -20
  119. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +13 -15
  120. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +11 -10
  121. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +3 -3
  122. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +2 -2
  123. package/deps/rocksdb/rocksdb/memtable/skiplist.h +30 -28
  124. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +4 -6
  125. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +73 -70
  126. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +1 -1
  127. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +21 -23
  128. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +24 -38
  130. package/deps/rocksdb/rocksdb/monitoring/histogram.h +10 -17
  131. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +19 -19
  132. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +22 -30
  133. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +4 -6
  134. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -0
  135. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +4 -12
  136. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -3
  137. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  138. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +12 -14
  139. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +2 -3
  140. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -1
  141. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -3
  142. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +1 -0
  143. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  144. package/deps/rocksdb/rocksdb/monitoring/statistics.h +7 -7
  145. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +12 -22
  146. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +7 -10
  147. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  148. package/deps/rocksdb/rocksdb/port/lang.h +3 -1
  149. package/deps/rocksdb/rocksdb/port/likely.h +2 -2
  150. package/deps/rocksdb/rocksdb/port/mmap.h +2 -2
  151. package/deps/rocksdb/rocksdb/port/port_dirent.h +2 -2
  152. package/deps/rocksdb/rocksdb/port/port_posix.cc +32 -27
  153. package/deps/rocksdb/rocksdb/port/port_posix.h +31 -30
  154. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -1
  155. package/deps/rocksdb/rocksdb/port/sys_time.h +1 -1
  156. package/deps/rocksdb/rocksdb/port/win/io_win.h +6 -7
  157. package/deps/rocksdb/rocksdb/port/win/port_win.h +12 -20
  158. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +5 -4
  159. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -5
  160. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -4
  161. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +30 -49
  162. package/deps/rocksdb/rocksdb/port/win/win_thread.h +5 -5
  163. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -62
  164. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +2 -2
  165. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +4 -3
  166. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -0
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -2
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -1
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -1
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -4
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +0 -1
  173. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +2 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -1
  175. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -30
  176. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +2 -1
  177. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  178. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +3 -3
  179. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -0
  180. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +4 -5
  181. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -3
  182. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -2
  183. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +1 -0
  184. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +0 -1
  185. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +1 -1
  186. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +0 -1
  187. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -6
  188. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -1
  189. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -6
  191. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -2
  192. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +90 -80
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +5 -4
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +63 -69
  195. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +2 -1
  196. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +58 -57
  197. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +3 -3
  198. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +35 -30
  199. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -10
  200. package/deps/rocksdb/rocksdb/table/iter_heap.h +2 -0
  201. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -1
  202. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -3
  203. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +31 -16
  204. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -6
  205. package/deps/rocksdb/rocksdb/table/multiget_context.h +5 -6
  206. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +1 -0
  207. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +1 -1
  208. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +7 -10
  209. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -1
  210. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +2 -2
  211. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +4 -3
  212. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +2 -2
  213. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -0
  214. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +10 -21
  215. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +14 -12
  216. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +2 -5
  217. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -3
  218. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +0 -6
  219. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +0 -33
  220. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -6
  221. package/deps/rocksdb/rocksdb/table/table_properties.cc +24 -37
  222. package/deps/rocksdb/rocksdb/table/table_reader.h +3 -2
  223. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +9 -8
  224. package/deps/rocksdb/rocksdb/table/table_test.cc +77 -82
  225. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +1 -0
  226. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  227. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +8 -18
  228. package/deps/rocksdb/rocksdb/test_util/sync_point.h +2 -2
  229. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +4 -3
  230. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +13 -18
  231. package/deps/rocksdb/rocksdb/test_util/testharness.cc +1 -2
  232. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -7
  233. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +3 -4
  234. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +1 -1
  235. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +1 -0
  236. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -7
  237. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +3 -2
  238. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +296 -314
  239. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +6 -6
  240. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +2 -1
  241. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +57 -64
  242. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +6 -5
  243. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +2 -2
  244. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  245. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  246. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +1 -2
  247. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +10 -10
  248. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -1
  249. package/deps/rocksdb/rocksdb/tools/write_stress.cc +6 -3
  250. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +12 -31
  251. package/deps/rocksdb/rocksdb/util/autovector.h +3 -6
  252. package/deps/rocksdb/rocksdb/util/autovector_test.cc +12 -12
  253. package/deps/rocksdb/rocksdb/util/bloom_test.cc +8 -12
  254. package/deps/rocksdb/rocksdb/util/coding.cc +1 -0
  255. package/deps/rocksdb/rocksdb/util/coding.h +17 -15
  256. package/deps/rocksdb/rocksdb/util/coding_test.cc +14 -15
  257. package/deps/rocksdb/rocksdb/util/comparator.cc +4 -4
  258. package/deps/rocksdb/rocksdb/util/compression.h +6 -3
  259. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +2 -2
  260. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +5 -8
  261. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +1 -1
  262. package/deps/rocksdb/rocksdb/util/crc32c.cc +202 -297
  263. package/deps/rocksdb/rocksdb/util/crc32c.h +2 -3
  264. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +2 -0
  265. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +39 -54
  266. package/deps/rocksdb/rocksdb/util/defer.h +2 -1
  267. package/deps/rocksdb/rocksdb/util/defer_test.cc +2 -1
  268. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +2 -1
  269. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +1 -1
  270. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  271. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -1
  272. package/deps/rocksdb/rocksdb/util/filelock_test.cc +24 -29
  273. package/deps/rocksdb/rocksdb/util/filter_bench.cc +4 -4
  274. package/deps/rocksdb/rocksdb/util/hash_test.cc +2 -2
  275. package/deps/rocksdb/rocksdb/util/heap.h +5 -4
  276. package/deps/rocksdb/rocksdb/util/heap_test.cc +15 -25
  277. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  278. package/deps/rocksdb/rocksdb/util/murmurhash.cc +7 -2
  279. package/deps/rocksdb/rocksdb/util/murmurhash.h +4 -3
  280. package/deps/rocksdb/rocksdb/util/mutexlock.h +5 -11
  281. package/deps/rocksdb/rocksdb/util/random.cc +1 -0
  282. package/deps/rocksdb/rocksdb/util/random.h +2 -4
  283. package/deps/rocksdb/rocksdb/util/random_test.cc +2 -1
  284. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +4 -3
  285. package/deps/rocksdb/rocksdb/util/slice.cc +1 -1
  286. package/deps/rocksdb/rocksdb/util/slice_test.cc +1 -2
  287. package/deps/rocksdb/rocksdb/util/status.cc +2 -0
  288. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -0
  289. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +64 -76
  290. package/deps/rocksdb/rocksdb/util/thread_local.cc +18 -32
  291. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -3
  292. package/deps/rocksdb/rocksdb/util/thread_operation.h +34 -43
  293. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +54 -73
  294. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +18 -18
  295. package/deps/rocksdb/rocksdb/util/timer.h +4 -9
  296. package/deps/rocksdb/rocksdb/util/timer_queue.h +1 -0
  297. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +1 -0
  298. package/deps/rocksdb/rocksdb/util/xxhash.cc +1 -2
  299. package/deps/rocksdb/rocksdb/util/xxhash.h +7 -4
  300. package/deps/rocksdb/rocksdb/util/xxph3.h +3 -1
  301. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +16 -24
  302. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +1 -1
  303. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +106 -104
  304. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +3 -4
  305. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +6 -6
  306. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +1 -2
  307. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +3 -4
  308. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -1
  309. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +11 -15
  310. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -2
  311. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +3 -3
  312. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +12 -12
  313. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +56 -55
  314. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +91 -74
  315. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +17 -34
  316. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +21 -45
  317. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +74 -97
  318. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +17 -18
  319. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -4
  320. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +19 -19
  321. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +19 -18
  322. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +7 -10
  323. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +3 -4
  324. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +2 -2
  325. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +10 -15
  326. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +2 -1
  327. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +1 -0
  328. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +5 -3
  329. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -2
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +4 -5
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -7
  332. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -13
  333. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +1 -0
  334. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +7 -9
  335. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +4 -5
  336. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +4 -3
  337. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +1 -1
  338. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +3 -3
  339. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +2 -4
  340. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +2 -2
  341. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +39 -50
  342. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +2 -2
  343. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +4 -3
  344. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +2 -2
  345. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +5 -7
  346. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +5 -4
  347. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  348. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +3 -6
  349. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +1 -1
  350. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +2 -2
  351. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -1
  352. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +1 -0
  353. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -1
  354. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +1 -1
  355. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +18 -13
  356. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +1 -3
  357. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +15 -14
  358. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +14 -12
  359. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -2
  360. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +4 -7
  361. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1 -2
  362. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  363. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +1 -1
  364. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -1
  365. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +3 -2
  366. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +1 -2
  367. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +3 -2
  368. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +5 -5
  369. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -4
  370. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +5 -4
  372. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +1 -0
  374. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +3 -4
  375. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +2 -6
  376. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +80 -79
  377. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -3
  378. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +9 -17
  379. package/index.js +4 -0
  380. package/package.json +2 -2
  381. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  382. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -293,7 +293,7 @@ bool UniversalCompactionPicker::NeedsCompaction(
293
293
  Compaction* UniversalCompactionPicker::PickCompaction(
294
294
  const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
295
295
  const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
296
- LogBuffer* log_buffer, SequenceNumber /* earliest_memtable_seqno */) {
296
+ LogBuffer* log_buffer, const SequenceNumber /* earliest_mem_seqno */) {
297
297
  UniversalCompactionBuilder builder(ioptions_, icmp_, cf_name,
298
298
  mutable_cf_options, mutable_db_options,
299
299
  vstorage, this, log_buffer);
@@ -308,9 +308,10 @@ void UniversalCompactionBuilder::SortedRun::Dump(char* out_buf,
308
308
  if (file->fd.GetPathId() == 0 || !print_path) {
309
309
  snprintf(out_buf, out_buf_size, "file %" PRIu64, file->fd.GetNumber());
310
310
  } else {
311
- snprintf(out_buf, out_buf_size, "file %" PRIu64
312
- "(path "
313
- "%" PRIu32 ")",
311
+ snprintf(out_buf, out_buf_size,
312
+ "file %" PRIu64
313
+ "(path "
314
+ "%" PRIu32 ")",
314
315
  file->fd.GetNumber(), file->fd.GetPathId());
315
316
  }
316
317
  } else {
@@ -743,6 +744,13 @@ Compaction* UniversalCompactionBuilder::PickCompactionToReduceSortedRuns(
743
744
  grandparents = vstorage_->LevelFiles(sorted_runs_[first_index_after].level);
744
745
  }
745
746
 
747
+ if (output_level != 0 &&
748
+ picker_->FilesRangeOverlapWithCompaction(
749
+ inputs, output_level,
750
+ Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
751
+ start_level, output_level))) {
752
+ return nullptr;
753
+ }
746
754
  CompactionReason compaction_reason;
747
755
  if (max_number_of_files_to_compact == UINT_MAX) {
748
756
  compaction_reason = CompactionReason::kUniversalSizeRatio;
@@ -1081,6 +1089,24 @@ Compaction* UniversalCompactionBuilder::PickIncrementalForReduceSizeAmp(
1081
1089
  inputs.push_back(second_last_level_inputs);
1082
1090
  inputs.push_back(bottom_level_inputs);
1083
1091
 
1092
+ int start_level = Compaction::kInvalidLevel;
1093
+ for (const auto& in : inputs) {
1094
+ if (!in.empty()) {
1095
+ // inputs should already be sorted by level
1096
+ start_level = in.level;
1097
+ break;
1098
+ }
1099
+ }
1100
+
1101
+ // intra L0 compactions outputs could have overlap
1102
+ if (output_level != 0 &&
1103
+ picker_->FilesRangeOverlapWithCompaction(
1104
+ inputs, output_level,
1105
+ Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
1106
+ start_level, output_level))) {
1107
+ return nullptr;
1108
+ }
1109
+
1084
1110
  // TODO support multi paths?
1085
1111
  uint32_t path_id = 0;
1086
1112
  return new Compaction(
@@ -1210,7 +1236,10 @@ Compaction* UniversalCompactionBuilder::PickDeleteTriggeredCompaction() {
1210
1236
  if (!output_level_inputs.empty()) {
1211
1237
  inputs.push_back(output_level_inputs);
1212
1238
  }
1213
- if (picker_->FilesRangeOverlapWithCompaction(inputs, output_level)) {
1239
+ if (picker_->FilesRangeOverlapWithCompaction(
1240
+ inputs, output_level,
1241
+ Compaction::EvaluatePenultimateLevel(
1242
+ vstorage_, ioptions_, start_level, output_level))) {
1214
1243
  return nullptr;
1215
1244
  }
1216
1245
 
@@ -1312,6 +1341,15 @@ Compaction* UniversalCompactionBuilder::PickCompactionWithSortedRunRange(
1312
1341
  output_level = sorted_runs_[end_index + 1].level - 1;
1313
1342
  }
1314
1343
 
1344
+ // intra L0 compactions outputs could have overlap
1345
+ if (output_level != 0 &&
1346
+ picker_->FilesRangeOverlapWithCompaction(
1347
+ inputs, output_level,
1348
+ Compaction::EvaluatePenultimateLevel(vstorage_, ioptions_,
1349
+ start_level, output_level))) {
1350
+ return nullptr;
1351
+ }
1352
+
1315
1353
  // We never check size for
1316
1354
  // compaction_options_universal.compression_size_percent,
1317
1355
  // because we always compact all the files, so always compress.
@@ -21,8 +21,7 @@ class UniversalCompactionPicker : public CompactionPicker {
21
21
  virtual Compaction* PickCompaction(
22
22
  const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
23
23
  const MutableDBOptions& mutable_db_options, VersionStorageInfo* vstorage,
24
- LogBuffer* log_buffer,
25
- SequenceNumber earliest_memtable_seqno = kMaxSequenceNumber) override;
24
+ LogBuffer* log_buffer, const SequenceNumber earliest_mem_seqno) override;
26
25
  virtual int MaxOutputLevel() const override { return NumberLevels() - 1; }
27
26
 
28
27
  virtual bool NeedsCompaction(
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include "db/db_test_util.h"
12
12
  #include "port/stack_trace.h"
13
+ #include "rocksdb/iostats_context.h"
13
14
  #include "rocksdb/listener.h"
14
15
  #include "rocksdb/utilities/debug.h"
15
16
  #include "test_util/mock_time_env.h"
@@ -416,7 +417,7 @@ TEST_P(TieredCompactionTest, RangeBasedTieredStorageUniversal) {
416
417
  // No data is moved from cold tier to hot tier because no input files from L5
417
418
  // or higher, it's not safe to move data to output_to_penultimate_level level.
418
419
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
419
- ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
420
+ ASSERT_EQ("0,0,0,0,0,1", FilesPerLevel());
420
421
 
421
422
  // Add 2 keys in higher level, but in separated files, all keys can be moved
422
423
  // up if it's hot
@@ -1488,6 +1489,528 @@ TEST_F(PrecludeLastLevelTest, SmallPrecludeTime) {
1488
1489
  Close();
1489
1490
  }
1490
1491
 
1492
+ TEST_F(PrecludeLastLevelTest, LastLevelOnlyCompactionPartial) {
1493
+ const int kNumTrigger = 4;
1494
+ const int kNumLevels = 7;
1495
+ const int kNumKeys = 100;
1496
+ const int kKeyPerSec = 10;
1497
+
1498
+ Options options = CurrentOptions();
1499
+ options.compaction_style = kCompactionStyleUniversal;
1500
+ options.preserve_internal_time_seconds = 2000;
1501
+ options.env = mock_env_.get();
1502
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1503
+ options.num_levels = kNumLevels;
1504
+ DestroyAndReopen(options);
1505
+
1506
+ // pass some time first, otherwise the first a few keys write time are going
1507
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1508
+ dbfull()->TEST_WaitForPeridicTaskRun(
1509
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
1510
+
1511
+ int sst_num = 0;
1512
+ // Write files that are overlap and enough to trigger compaction
1513
+ for (; sst_num < kNumTrigger; sst_num++) {
1514
+ for (int i = 0; i < kNumKeys; i++) {
1515
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
1516
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1517
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1518
+ });
1519
+ }
1520
+ ASSERT_OK(Flush());
1521
+ }
1522
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1523
+
1524
+ // all data is pushed to the last level
1525
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1526
+
1527
+ // enable preclude feature
1528
+ options.preclude_last_level_data_seconds = 2000;
1529
+ options.last_level_temperature = Temperature::kCold;
1530
+ Reopen(options);
1531
+
1532
+ CompactRangeOptions cro;
1533
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1534
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1535
+
1536
+ // some data are moved up, some are not
1537
+ ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
1538
+ ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
1539
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1540
+
1541
+ std::vector<KeyVersion> key_versions;
1542
+ ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
1543
+ std::numeric_limits<size_t>::max(),
1544
+ &key_versions));
1545
+
1546
+ // make sure there're more than 300 keys and first 100 keys are having seqno
1547
+ // zeroed out, the last 100 key seqno not zeroed out
1548
+ ASSERT_GT(key_versions.size(), 300);
1549
+ for (int i = 0; i < 100; i++) {
1550
+ ASSERT_EQ(key_versions[i].sequence, 0);
1551
+ }
1552
+ auto rit = key_versions.rbegin();
1553
+ for (int i = 0; i < 100; i++) {
1554
+ ASSERT_GT(rit->sequence, 0);
1555
+ rit++;
1556
+ }
1557
+
1558
+ Close();
1559
+ }
1560
+
1561
+ class PrecludeLastLevelTestWithParms
1562
+ : public PrecludeLastLevelTest,
1563
+ public testing::WithParamInterface<bool> {
1564
+ public:
1565
+ PrecludeLastLevelTestWithParms() : PrecludeLastLevelTest() {}
1566
+ };
1567
+
1568
+ TEST_P(PrecludeLastLevelTestWithParms, LastLevelOnlyCompactionNoPreclude) {
1569
+ const int kNumTrigger = 4;
1570
+ const int kNumLevels = 7;
1571
+ const int kNumKeys = 100;
1572
+ const int kKeyPerSec = 10;
1573
+
1574
+ bool enable_preclude_last_level = GetParam();
1575
+
1576
+ Options options = CurrentOptions();
1577
+ options.compaction_style = kCompactionStyleUniversal;
1578
+ options.preserve_internal_time_seconds = 2000;
1579
+ options.env = mock_env_.get();
1580
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1581
+ options.num_levels = kNumLevels;
1582
+ DestroyAndReopen(options);
1583
+
1584
+ // pass some time first, otherwise the first a few keys write time are going
1585
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1586
+ dbfull()->TEST_WaitForPeridicTaskRun(
1587
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
1588
+
1589
+ Random rnd(301);
1590
+ int sst_num = 0;
1591
+ // Write files that are overlap and enough to trigger compaction
1592
+ for (; sst_num < kNumTrigger; sst_num++) {
1593
+ for (int i = 0; i < kNumKeys; i++) {
1594
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), rnd.RandomString(100)));
1595
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1596
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1597
+ });
1598
+ }
1599
+ ASSERT_OK(Flush());
1600
+ }
1601
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1602
+
1603
+ // all data is pushed to the last level
1604
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1605
+
1606
+ std::atomic_bool is_manual_compaction_running = false;
1607
+ std::atomic_bool verified_compaction_order = false;
1608
+
1609
+ // Make sure the manual compaction is in progress and try to trigger a
1610
+ // SizeRatio compaction by flushing 4 files to L0. The compaction will try to
1611
+ // compact 4 files at L0 to L5 (the last empty level).
1612
+ // If the preclude_last_feature is enabled, the auto triggered compaction
1613
+ // cannot be picked. Otherwise, the auto triggered compaction can run in
1614
+ // parallel with the last level compaction.
1615
+ // L0: [a] [b] [c] [d]
1616
+ // L5: (locked if preclude_last_level is enabled)
1617
+ // L6: [z] (locked: manual compaction in progress)
1618
+ // TODO: in this case, L0 files should just be compacted to L4, so the 2
1619
+ // compactions won't be overlapped.
1620
+ SyncPoint::GetInstance()->SetCallBack(
1621
+ "CompactionJob::ProcessKeyValueCompaction()::Processing", [&](void* arg) {
1622
+ auto compaction = static_cast<Compaction*>(arg);
1623
+ if (compaction->is_manual_compaction()) {
1624
+ is_manual_compaction_running = true;
1625
+ TEST_SYNC_POINT(
1626
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1627
+ "ManualCompaction1");
1628
+ TEST_SYNC_POINT(
1629
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1630
+ "ManualCompaction2");
1631
+ is_manual_compaction_running = false;
1632
+ }
1633
+ });
1634
+
1635
+ SyncPoint::GetInstance()->SetCallBack(
1636
+ "UniversalCompactionBuilder::PickCompaction:Return", [&](void* arg) {
1637
+ auto compaction = static_cast<Compaction*>(arg);
1638
+ if (enable_preclude_last_level && is_manual_compaction_running) {
1639
+ ASSERT_TRUE(compaction == nullptr);
1640
+ verified_compaction_order = true;
1641
+ } else {
1642
+ ASSERT_TRUE(compaction != nullptr);
1643
+ verified_compaction_order = true;
1644
+ }
1645
+ if (!compaction || !compaction->is_manual_compaction()) {
1646
+ TEST_SYNC_POINT(
1647
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1648
+ "AutoCompactionPicked");
1649
+ }
1650
+ });
1651
+
1652
+ SyncPoint::GetInstance()->LoadDependency({
1653
+ {"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1654
+ "ManualCompaction1",
1655
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:StartWrite"},
1656
+ {"PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1657
+ "AutoCompactionPicked",
1658
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:"
1659
+ "ManualCompaction2"},
1660
+ });
1661
+
1662
+ SyncPoint::GetInstance()->EnableProcessing();
1663
+
1664
+ // only enable if the Parameter is true
1665
+ if (enable_preclude_last_level) {
1666
+ options.preclude_last_level_data_seconds = 2000;
1667
+ }
1668
+ options.max_background_jobs = 8;
1669
+ options.last_level_temperature = Temperature::kCold;
1670
+ Reopen(options);
1671
+
1672
+ auto manual_compaction_thread = port::Thread([this]() {
1673
+ CompactRangeOptions cro;
1674
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1675
+ cro.exclusive_manual_compaction = false;
1676
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1677
+ });
1678
+
1679
+ TEST_SYNC_POINT(
1680
+ "PrecludeLastLevelTest::LastLevelOnlyCompactionConflit:StartWrite");
1681
+ auto stop_token =
1682
+ dbfull()->TEST_write_controler().GetCompactionPressureToken();
1683
+
1684
+ for (; sst_num < kNumTrigger * 2; sst_num++) {
1685
+ for (int i = 0; i < kNumKeys; i++) {
1686
+ // the value needs to be big enough to trigger full compaction
1687
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
1688
+ dbfull()->TEST_WaitForPeridicTaskRun([&] {
1689
+ mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
1690
+ });
1691
+ }
1692
+ ASSERT_OK(Flush());
1693
+ }
1694
+
1695
+ manual_compaction_thread.join();
1696
+
1697
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1698
+
1699
+ if (enable_preclude_last_level) {
1700
+ ASSERT_NE("0,0,0,0,0,1,1", FilesPerLevel());
1701
+ } else {
1702
+ ASSERT_EQ("0,0,0,0,0,1,1", FilesPerLevel());
1703
+ }
1704
+ ASSERT_TRUE(verified_compaction_order);
1705
+
1706
+ SyncPoint::GetInstance()->DisableProcessing();
1707
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1708
+ stop_token.reset();
1709
+
1710
+ Close();
1711
+ }
1712
+
1713
+ INSTANTIATE_TEST_CASE_P(PrecludeLastLevelTestWithParms,
1714
+ PrecludeLastLevelTestWithParms, testing::Bool());
1715
+
1716
+ // partition the SST into 3 ranges [0, 19] [20, 39] [40, ...]
1717
+ class ThreeRangesPartitioner : public SstPartitioner {
1718
+ public:
1719
+ const char* Name() const override { return "SingleKeySstPartitioner"; }
1720
+
1721
+ PartitionerResult ShouldPartition(
1722
+ const PartitionerRequest& request) override {
1723
+ if ((cmp->CompareWithoutTimestamp(*request.current_user_key,
1724
+ DBTestBase::Key(20)) >= 0 &&
1725
+ cmp->CompareWithoutTimestamp(*request.prev_user_key,
1726
+ DBTestBase::Key(20)) < 0) ||
1727
+ (cmp->CompareWithoutTimestamp(*request.current_user_key,
1728
+ DBTestBase::Key(40)) >= 0 &&
1729
+ cmp->CompareWithoutTimestamp(*request.prev_user_key,
1730
+ DBTestBase::Key(40)) < 0)) {
1731
+ return kRequired;
1732
+ } else {
1733
+ return kNotRequired;
1734
+ }
1735
+ }
1736
+
1737
+ bool CanDoTrivialMove(const Slice& /*smallest_user_key*/,
1738
+ const Slice& /*largest_user_key*/) override {
1739
+ return false;
1740
+ }
1741
+
1742
+ const Comparator* cmp = BytewiseComparator();
1743
+ };
1744
+
1745
+ class ThreeRangesPartitionerFactory : public SstPartitionerFactory {
1746
+ public:
1747
+ static const char* kClassName() {
1748
+ return "TombstoneTestSstPartitionerFactory";
1749
+ }
1750
+ const char* Name() const override { return kClassName(); }
1751
+
1752
+ std::unique_ptr<SstPartitioner> CreatePartitioner(
1753
+ const SstPartitioner::Context& /* context */) const override {
1754
+ return std::unique_ptr<SstPartitioner>(new ThreeRangesPartitioner());
1755
+ }
1756
+ };
1757
+
1758
+ TEST_F(PrecludeLastLevelTest, PartialPenultimateLevelCompaction) {
1759
+ const int kNumTrigger = 4;
1760
+ const int kNumLevels = 7;
1761
+ const int kKeyPerSec = 10;
1762
+
1763
+ Options options = CurrentOptions();
1764
+ options.compaction_style = kCompactionStyleUniversal;
1765
+ options.env = mock_env_.get();
1766
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1767
+ options.preserve_internal_time_seconds = 10000;
1768
+ options.num_levels = kNumLevels;
1769
+ DestroyAndReopen(options);
1770
+
1771
+ // pass some time first, otherwise the first a few keys write time are going
1772
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1773
+ dbfull()->TEST_WaitForPeridicTaskRun(
1774
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
1775
+
1776
+ Random rnd(301);
1777
+
1778
+ for (int i = 0; i < 300; i++) {
1779
+ ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
1780
+ dbfull()->TEST_WaitForPeridicTaskRun(
1781
+ [&] { mock_clock_->MockSleepForSeconds(kKeyPerSec); });
1782
+ }
1783
+ ASSERT_OK(Flush());
1784
+ CompactRangeOptions cro;
1785
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1786
+
1787
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1788
+
1789
+ // make sure all data is compacted to the last level
1790
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1791
+
1792
+ // Create 3 L5 files
1793
+ auto factory = std::make_shared<ThreeRangesPartitionerFactory>();
1794
+ options.sst_partitioner_factory = factory;
1795
+
1796
+ Reopen(options);
1797
+
1798
+ for (int i = 0; i < kNumTrigger - 1; i++) {
1799
+ for (int j = 0; j < 100; j++) {
1800
+ ASSERT_OK(Put(Key(i * 100 + j), rnd.RandomString(10)));
1801
+ }
1802
+ ASSERT_OK(Flush());
1803
+ }
1804
+
1805
+ ASSERT_OK(dbfull()->WaitForCompact(true));
1806
+
1807
+ // L5: [0,19] [20,39] [40,299]
1808
+ // L6: [0, 299]
1809
+ ASSERT_EQ("0,0,0,0,0,3,1", FilesPerLevel());
1810
+
1811
+ // enable tiered storage feature
1812
+ options.preclude_last_level_data_seconds = 10000;
1813
+ options.last_level_temperature = Temperature::kCold;
1814
+ options.statistics = CreateDBStatistics();
1815
+ Reopen(options);
1816
+
1817
+ ColumnFamilyMetaData meta;
1818
+ db_->GetColumnFamilyMetaData(&meta);
1819
+ ASSERT_EQ(meta.levels[5].files.size(), 3);
1820
+ ASSERT_EQ(meta.levels[6].files.size(), 1);
1821
+ ASSERT_EQ(meta.levels[6].files[0].smallestkey, Key(0));
1822
+ ASSERT_EQ(meta.levels[6].files[0].largestkey, Key(299));
1823
+
1824
+ std::string file_path = meta.levels[5].files[1].db_path;
1825
+ std::vector<std::string> files;
1826
+ // pick 3rd file @L5 + file@L6 for compaction
1827
+ files.push_back(file_path + "/" + meta.levels[5].files[2].name);
1828
+ files.push_back(file_path + "/" + meta.levels[6].files[0].name);
1829
+ ASSERT_OK(db_->CompactFiles(CompactionOptions(), files, 6));
1830
+
1831
+ // The compaction only moved partial of the hot data to hot tier, range[0,39]
1832
+ // is unsafe to move up, otherwise, they will be overlapped with the existing
1833
+ // files@L5.
1834
+ // The output should be:
1835
+ // L5: [0,19] [20,39] [40,299] <-- Temperature::kUnknown
1836
+ // L6: [0,19] [20,39] <-- Temperature::kCold
1837
+ // L6 file is split because of the customized partitioner
1838
+ ASSERT_EQ("0,0,0,0,0,3,2", FilesPerLevel());
1839
+
1840
+ // even all the data is hot, but not all data are moved to the hot tier
1841
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1842
+ ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
1843
+
1844
+ db_->GetColumnFamilyMetaData(&meta);
1845
+ ASSERT_EQ(meta.levels[5].files.size(), 3);
1846
+ ASSERT_EQ(meta.levels[6].files.size(), 2);
1847
+ for (const auto& file : meta.levels[5].files) {
1848
+ ASSERT_EQ(file.temperature, Temperature::kUnknown);
1849
+ }
1850
+ for (const auto& file : meta.levels[6].files) {
1851
+ ASSERT_EQ(file.temperature, Temperature::kCold);
1852
+ }
1853
+ ASSERT_EQ(meta.levels[6].files[0].smallestkey, Key(0));
1854
+ ASSERT_EQ(meta.levels[6].files[0].largestkey, Key(19));
1855
+ ASSERT_EQ(meta.levels[6].files[1].smallestkey, Key(20));
1856
+ ASSERT_EQ(meta.levels[6].files[1].largestkey, Key(39));
1857
+
1858
+ Close();
1859
+ }
1860
+
1861
+ struct TestPropertiesCollector : public TablePropertiesCollector {
1862
+ Status AddUserKey(const Slice& key, const Slice& /*value*/,
1863
+ EntryType /*type*/, SequenceNumber /*seq*/,
1864
+ uint64_t /*file_size*/) override {
1865
+ if (cmp->Compare(key, DBTestBase::Key(100)) == 0) {
1866
+ has_key_100 = true;
1867
+ }
1868
+ if (cmp->Compare(key, DBTestBase::Key(200)) == 0) {
1869
+ has_key_200 = true;
1870
+ }
1871
+
1872
+ return Status::OK();
1873
+ }
1874
+
1875
+ const char* Name() const override { return "TestTablePropertiesCollector"; }
1876
+
1877
+ UserCollectedProperties GetReadableProperties() const override {
1878
+ UserCollectedProperties ret;
1879
+ return ret;
1880
+ }
1881
+
1882
+ Status Finish(UserCollectedProperties* /*properties*/) override {
1883
+ // The LSM tree would be like:
1884
+ // L5: [0,19] [20,39] [40,299]
1885
+ // L6: [0, 299]
1886
+ // the 3rd file @L5 has both 100 and 200, which will be marked for
1887
+ // compaction
1888
+ // Also avoid marking flushed SST for compaction, which won't have both 100
1889
+ // and 200
1890
+ if (has_key_100 && has_key_200) {
1891
+ need_compact_ = true;
1892
+ } else {
1893
+ need_compact_ = false;
1894
+ }
1895
+ has_key_100 = false;
1896
+ has_key_200 = false;
1897
+ return Status::OK();
1898
+ }
1899
+
1900
+ bool NeedCompact() const override { return need_compact_; }
1901
+
1902
+ const Comparator* cmp = BytewiseComparator();
1903
+
1904
+ private:
1905
+ bool has_key_100 = false;
1906
+ bool has_key_200 = false;
1907
+
1908
+ bool need_compact_ = false;
1909
+ };
1910
+
1911
+ class TestPropertiesCollectorFactory : public TablePropertiesCollectorFactory {
1912
+ public:
1913
+ TablePropertiesCollector* CreateTablePropertiesCollector(
1914
+ TablePropertiesCollectorFactory::Context /*context*/) override {
1915
+ return new TestPropertiesCollector;
1916
+ }
1917
+ const char* Name() const override { return "TestTablePropertiesCollector"; }
1918
+ };
1919
+
1920
+ TEST_F(PrecludeLastLevelTest, PartialPenultimateLevelCompactionWithRangeDel) {
1921
+ const int kNumTrigger = 4;
1922
+ const int kNumLevels = 7;
1923
+ const int kKeyPerSec = 10;
1924
+
1925
+ Options options = CurrentOptions();
1926
+ options.compaction_style = kCompactionStyleUniversal;
1927
+ options.env = mock_env_.get();
1928
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1929
+ options.preserve_internal_time_seconds = 10000;
1930
+ options.num_levels = kNumLevels;
1931
+ // set a small max_compaction_bytes to avoid input level expansion
1932
+ options.max_compaction_bytes = 30000;
1933
+ options.ignore_max_compaction_bytes_for_input = false;
1934
+ DestroyAndReopen(options);
1935
+
1936
+ // pass some time first, otherwise the first a few keys write time are going
1937
+ // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
1938
+ dbfull()->TEST_WaitForPeridicTaskRun(
1939
+ [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
1940
+
1941
+ Random rnd(301);
1942
+
1943
+ for (int i = 0; i < 300; i++) {
1944
+ ASSERT_OK(Put(Key(i), rnd.RandomString(100)));
1945
+ dbfull()->TEST_WaitForPeridicTaskRun(
1946
+ [&] { mock_clock_->MockSleepForSeconds(kKeyPerSec); });
1947
+ }
1948
+ ASSERT_OK(Flush());
1949
+ CompactRangeOptions cro;
1950
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
1951
+
1952
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
1953
+
1954
+ // make sure all data is compacted to the last level
1955
+ ASSERT_EQ("0,0,0,0,0,0,1", FilesPerLevel());
1956
+
1957
+ // Create 3 L5 files
1958
+ auto factory = std::make_shared<ThreeRangesPartitionerFactory>();
1959
+ options.sst_partitioner_factory = factory;
1960
+
1961
+ // the user defined properties_collector will mark the 3rd file for compaction
1962
+ auto collector_factory = std::make_shared<TestPropertiesCollectorFactory>();
1963
+ options.table_properties_collector_factories.resize(1);
1964
+ options.table_properties_collector_factories[0] = collector_factory;
1965
+ // enable tiered storage feature
1966
+ options.preclude_last_level_data_seconds = 10000;
1967
+ options.last_level_temperature = Temperature::kCold;
1968
+ Reopen(options);
1969
+
1970
+ for (int i = 0; i < kNumTrigger - 2; i++) {
1971
+ for (int j = 0; j < 100; j++) {
1972
+ ASSERT_OK(Put(Key(i * 100 + j), rnd.RandomString(10)));
1973
+ }
1974
+ ASSERT_OK(Flush());
1975
+ }
1976
+
1977
+ // make sure there is one and only one compaction supports per-key placement
1978
+ // but has the penultimate level output disabled.
1979
+ std::atomic_int per_key_comp_num = 0;
1980
+ SyncPoint::GetInstance()->SetCallBack(
1981
+ "UniversalCompactionBuilder::PickCompaction:Return", [&](void* arg) {
1982
+ auto compaction = static_cast<Compaction*>(arg);
1983
+ if (compaction->SupportsPerKeyPlacement()) {
1984
+ ASSERT_EQ(compaction->GetPenultimateOutputRangeType(),
1985
+ Compaction::PenultimateOutputRangeType::kDisabled);
1986
+ per_key_comp_num++;
1987
+ }
1988
+ });
1989
+
1990
+ SyncPoint::GetInstance()->EnableProcessing();
1991
+
1992
+ for (int j = 0; j < 100; j++) {
1993
+ ASSERT_OK(Put(Key(200 + j), rnd.RandomString(10)));
1994
+ }
1995
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1996
+ Key(32), Key(40)));
1997
+ ASSERT_OK(Flush());
1998
+
1999
+ // Before the per-key placement compaction, the LSM tress should be like:
2000
+ // L5: [0,19] [20,40] [40,299]
2001
+ // L6: [0, 299]
2002
+ // The 2nd file @L5 has the largest key 40 because of range del
2003
+
2004
+ ASSERT_OK(dbfull()->WaitForCompact(true));
2005
+
2006
+ ASSERT_EQ(per_key_comp_num, 1);
2007
+
2008
+ // the compaction won't move any data to the penultimate level
2009
+ ASSERT_EQ("0,0,0,0,0,2,3", FilesPerLevel());
2010
+
2011
+ Close();
2012
+ }
2013
+
1491
2014
  #endif // !defined(ROCKSDB_LITE)
1492
2015
 
1493
2016
  } // namespace ROCKSDB_NAMESPACE