@nxtedition/rocksdb 15.4.1 → 15.5.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 (399) hide show
  1. package/binding.cc +24 -15
  2. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  3. package/deps/rocksdb/rocksdb/BUCK +42 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  5. package/deps/rocksdb/rocksdb/Makefile +59 -32
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  8. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  11. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  17. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  24. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  26. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  27. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  28. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  29. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  51. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  54. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  55. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  57. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  58. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  59. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  60. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  61. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  62. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  63. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  64. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  65. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  66. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  79. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  80. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  81. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  82. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  83. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  84. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  85. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  86. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  87. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  90. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  91. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  92. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  93. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  94. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  95. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  96. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  97. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  98. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  99. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  100. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  101. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  102. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  103. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  104. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  105. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  109. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  111. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  112. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  113. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  114. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  115. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  116. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  117. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  118. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  119. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  120. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  121. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  122. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  123. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  124. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  125. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  126. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  127. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  128. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  129. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  130. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  131. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  132. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  133. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  134. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  135. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  136. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  137. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  138. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  139. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  140. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  141. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  142. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  143. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  144. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  145. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  146. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  147. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  148. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  150. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  151. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  160. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  161. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  162. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  163. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  164. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  165. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  166. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  167. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  168. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  169. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  170. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  171. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  172. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  173. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  174. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  175. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  176. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  177. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  179. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  180. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  181. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  182. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  183. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  187. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  188. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  192. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  193. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  194. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  198. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  200. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  202. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  203. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  204. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  205. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  206. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  210. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  211. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  212. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  213. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  214. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  215. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  216. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  217. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  218. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  219. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  220. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  221. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  222. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  223. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  224. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  225. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  226. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  227. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  228. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  229. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  230. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  231. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  232. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  233. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  234. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  235. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  236. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  237. package/deps/rocksdb/rocksdb/src.mk +12 -0
  238. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  239. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  240. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  241. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  253. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  254. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  255. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  256. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  258. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  259. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  260. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  261. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  264. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  265. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  266. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  267. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  268. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  269. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  273. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  274. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  275. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  276. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  277. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  278. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  279. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  280. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  281. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  282. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  283. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  284. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  286. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  287. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  288. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  289. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  290. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  291. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  292. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  293. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  294. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  295. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  296. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  297. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  298. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  299. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  300. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  301. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  302. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  303. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  304. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  305. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  306. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  307. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  308. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  309. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  310. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  311. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  312. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  313. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  314. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  315. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  316. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  317. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  318. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  319. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  320. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  321. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  323. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  324. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  325. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  326. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  327. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  328. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  329. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  331. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  332. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  333. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  334. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  335. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  336. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  337. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  338. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  339. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  340. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  341. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  342. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  343. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  344. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  355. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  356. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  358. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  360. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  361. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  362. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  364. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  365. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  366. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  367. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  368. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  369. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  370. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  375. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  376. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  377. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  378. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  380. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  381. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  388. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  389. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  390. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  391. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  392. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  393. package/deps/rocksdb/rocksdb.gyp +7 -0
  394. package/iterator.js +2 -2
  395. package/package.json +1 -1
  396. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  397. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -105,7 +105,7 @@ class TestCompactionListener : public EventListener {
105
105
  ASSERT_EQ(ci.output_files.size(), ci.output_file_infos.size());
106
106
 
107
107
  ASSERT_TRUE(test_);
108
- ASSERT_EQ(test_->db_, db);
108
+ ASSERT_EQ(test_->db_.get(), db);
109
109
 
110
110
  std::vector<std::vector<FileMetaData>> files_by_level;
111
111
  test_->dbfull()->TEST_GetFilesMetaData(test_->handles_[ci.cf_id],
@@ -197,7 +197,7 @@ TEST_F(EventListenerTest, OnSingleDBCompactionTest) {
197
197
 
198
198
  ASSERT_EQ(listener->compacted_dbs_.size(), cf_names.size());
199
199
  for (size_t i = 0; i < cf_names.size(); ++i) {
200
- ASSERT_EQ(listener->compacted_dbs_[i], db_);
200
+ ASSERT_EQ(listener->compacted_dbs_[i], db_.get());
201
201
  }
202
202
  }
203
203
 
@@ -268,7 +268,7 @@ class TestFlushListener : public EventListener {
268
268
  // that assumption does not hold (see the test case MultiDBMultiListeners
269
269
  // below).
270
270
  ASSERT_TRUE(test_);
271
- if (db == test_->db_) {
271
+ if (db == test_->db_.get()) {
272
272
  std::vector<std::vector<FileMetaData>> files_by_level;
273
273
  ASSERT_LT(info.cf_id, test_->handles_.size());
274
274
  ASSERT_GE(info.cf_id, 0u);
@@ -343,7 +343,7 @@ TEST_F(EventListenerTest, OnSingleDBFlushTest) {
343
343
 
344
344
  // make sure callback functions are called in the right order
345
345
  for (size_t i = 0; i < cf_names.size(); ++i) {
346
- ASSERT_EQ(listener->flushed_dbs_[i], db_);
346
+ ASSERT_EQ(listener->flushed_dbs_[i], db_.get());
347
347
  ASSERT_EQ(listener->flushed_column_family_names_[i], cf_names[i]);
348
348
  }
349
349
  }
@@ -387,7 +387,7 @@ TEST_F(EventListenerTest, MultiCF) {
387
387
  // make sure callback functions are called in the right order
388
388
  if (i == 7) {
389
389
  for (size_t j = 0; j < cf_names.size(); j++) {
390
- ASSERT_EQ(listener->flushed_dbs_[j], db_);
390
+ ASSERT_EQ(listener->flushed_dbs_[j], db_.get());
391
391
  ASSERT_EQ(listener->flushed_column_family_names_[j], cf_names[j]);
392
392
  }
393
393
  }
@@ -422,22 +422,21 @@ TEST_F(EventListenerTest, MultiDBMultiListeners) {
422
422
  DBOptions db_opts(options);
423
423
  ColumnFamilyOptions cf_opts(options);
424
424
 
425
- std::vector<DB*> dbs;
425
+ std::vector<std::unique_ptr<DB>> dbs;
426
426
  std::vector<std::vector<ColumnFamilyHandle*>> vec_handles;
427
427
 
428
428
  for (int d = 0; d < kNumDBs; ++d) {
429
429
  ASSERT_OK(DestroyDB(dbname_ + std::to_string(d), options));
430
- DB* db;
430
+ ASSERT_OK(
431
+ DB::Open(options, dbname_ + std::to_string(d), &dbs.emplace_back()));
431
432
  std::vector<ColumnFamilyHandle*> handles;
432
- ASSERT_OK(DB::Open(options, dbname_ + std::to_string(d), &db));
433
433
  for (size_t c = 0; c < cf_names.size(); ++c) {
434
434
  ColumnFamilyHandle* handle;
435
- ASSERT_OK(db->CreateColumnFamily(cf_opts, cf_names[c], &handle));
435
+ ASSERT_OK(dbs.back()->CreateColumnFamily(cf_opts, cf_names[c], &handle));
436
436
  handles.push_back(handle);
437
437
  }
438
438
 
439
439
  vec_handles.push_back(std::move(handles));
440
- dbs.push_back(db);
441
440
  }
442
441
 
443
442
  for (int d = 0; d < kNumDBs; ++d) {
@@ -450,23 +449,23 @@ TEST_F(EventListenerTest, MultiDBMultiListeners) {
450
449
  for (size_t c = 0; c < cf_names.size(); ++c) {
451
450
  for (int d = 0; d < kNumDBs; ++d) {
452
451
  ASSERT_OK(dbs[d]->Flush(FlushOptions(), vec_handles[d][c]));
453
- ASSERT_OK(
454
- static_cast_with_check<DBImpl>(dbs[d])->TEST_WaitForFlushMemTable());
452
+ ASSERT_OK(static_cast_with_check<DBImpl>(dbs[d].get())
453
+ ->TEST_WaitForFlushMemTable());
455
454
  }
456
455
  }
457
456
 
458
457
  for (int d = 0; d < kNumDBs; ++d) {
459
458
  // Ensure background work is fully finished including listener callbacks
460
459
  // before accessing listener state.
461
- ASSERT_OK(
462
- static_cast_with_check<DBImpl>(dbs[d])->TEST_WaitForBackgroundWork());
460
+ ASSERT_OK(static_cast_with_check<DBImpl>(dbs[d].get())
461
+ ->TEST_WaitForBackgroundWork());
463
462
  }
464
463
 
465
464
  for (auto* listener : listeners) {
466
465
  int pos = 0;
467
466
  for (size_t c = 0; c < cf_names.size(); ++c) {
468
467
  for (int d = 0; d < kNumDBs; ++d) {
469
- ASSERT_EQ(listener->flushed_dbs_[pos], dbs[d]);
468
+ ASSERT_EQ(listener->flushed_dbs_[pos], dbs[d].get());
470
469
  ASSERT_EQ(listener->flushed_column_family_names_[pos], cf_names[c]);
471
470
  pos++;
472
471
  }
@@ -481,8 +480,8 @@ TEST_F(EventListenerTest, MultiDBMultiListeners) {
481
480
  }
482
481
  vec_handles.clear();
483
482
 
484
- for (auto db : dbs) {
485
- delete db;
483
+ for (auto& db : dbs) {
484
+ db.reset();
486
485
  }
487
486
  }
488
487
 
@@ -1309,16 +1308,21 @@ class BlobDBJobLevelEventListenerTest : public EventListener {
1309
1308
  explicit BlobDBJobLevelEventListenerTest(EventListenerTest* test)
1310
1309
  : test_(test), call_count_(0) {}
1311
1310
 
1312
- const VersionStorageInfo* GetVersionStorageInfo() const {
1313
- VersionSet* const versions = test_->dbfull()->GetVersionSet();
1311
+ // NOTE: it's not safe to rely on test_->db_ for these functions because
1312
+ // the DB may be in the process of closing when these are called, and the
1313
+ // unique_ptr is set to nullptr before invoking ~DB()
1314
+
1315
+ const VersionStorageInfo* GetVersionStorageInfo(DB* db) const {
1316
+ DBImpl* db_impl = static_cast_with_check<DBImpl>(db);
1317
+ VersionSet* const versions = db_impl->GetVersionSet();
1314
1318
  assert(versions);
1315
1319
 
1316
1320
  ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
1317
1321
  EXPECT_NE(cfd, nullptr);
1318
1322
 
1319
- test_->dbfull()->TEST_LockMutex();
1323
+ db_impl->TEST_LockMutex();
1320
1324
  Version* const current = cfd->current();
1321
- test_->dbfull()->TEST_UnlockMutex();
1325
+ db_impl->TEST_UnlockMutex();
1322
1326
  EXPECT_NE(current, nullptr);
1323
1327
 
1324
1328
  const VersionStorageInfo* const storage_info = current->storage_info();
@@ -1328,8 +1332,9 @@ class BlobDBJobLevelEventListenerTest : public EventListener {
1328
1332
  }
1329
1333
 
1330
1334
  void CheckBlobFileAdditions(
1335
+ DB* db,
1331
1336
  const std::vector<BlobFileAdditionInfo>& blob_file_addition_infos) const {
1332
- const auto* vstorage = GetVersionStorageInfo();
1337
+ const auto* vstorage = GetVersionStorageInfo(db);
1333
1338
 
1334
1339
  EXPECT_FALSE(blob_file_addition_infos.empty());
1335
1340
 
@@ -1357,7 +1362,7 @@ class BlobDBJobLevelEventListenerTest : public EventListener {
1357
1362
  return result;
1358
1363
  }
1359
1364
 
1360
- void OnFlushCompleted(DB* /*db*/, const FlushJobInfo& info) override {
1365
+ void OnFlushCompleted(DB* db, const FlushJobInfo& info) override {
1361
1366
  {
1362
1367
  std::lock_guard<std::mutex> lock(mutex_);
1363
1368
  IncreaseCallCount(/*mutex_locked*/ true);
@@ -1366,16 +1371,15 @@ class BlobDBJobLevelEventListenerTest : public EventListener {
1366
1371
 
1367
1372
  EXPECT_EQ(info.blob_compression_type, kNoCompression);
1368
1373
 
1369
- CheckBlobFileAdditions(info.blob_file_addition_infos);
1374
+ CheckBlobFileAdditions(db, info.blob_file_addition_infos);
1370
1375
  }
1371
1376
 
1372
- void OnCompactionCompleted(DB* /*db*/,
1373
- const CompactionJobInfo& info) override {
1377
+ void OnCompactionCompleted(DB* db, const CompactionJobInfo& info) override {
1374
1378
  IncreaseCallCount(/*mutex_locked*/ false);
1375
1379
 
1376
1380
  EXPECT_EQ(info.blob_compression_type, kNoCompression);
1377
1381
 
1378
- CheckBlobFileAdditions(info.blob_file_addition_infos);
1382
+ CheckBlobFileAdditions(db, info.blob_file_addition_infos);
1379
1383
 
1380
1384
  EXPECT_FALSE(info.blob_file_garbage_infos.empty());
1381
1385
 
@@ -1639,6 +1643,129 @@ TEST_F(EventListenerTest, BlobDBFileTest) {
1639
1643
  blob_event_listener->CheckCounters();
1640
1644
  }
1641
1645
 
1646
+ class BackgroundJobPressureTestListener : public EventListener {
1647
+ public:
1648
+ void OnBackgroundJobPressureChanged(
1649
+ DB* /*db*/, const BackgroundJobPressure& snapshot) override {
1650
+ std::lock_guard<std::mutex> lock(mu_);
1651
+ snapshots_.push_back(snapshot);
1652
+ }
1653
+
1654
+ std::vector<BackgroundJobPressure> GetSnapshots() {
1655
+ std::lock_guard<std::mutex> lock(mu_);
1656
+ return snapshots_;
1657
+ }
1658
+
1659
+ void Reset() {
1660
+ std::lock_guard<std::mutex> lock(mu_);
1661
+ snapshots_.clear();
1662
+ }
1663
+
1664
+ private:
1665
+ std::mutex mu_;
1666
+ std::vector<BackgroundJobPressure> snapshots_;
1667
+ };
1668
+
1669
+ TEST_F(EventListenerTest, BackgroundJobPressure) {
1670
+ auto listener = std::make_shared<BackgroundJobPressureTestListener>();
1671
+ Options options = CurrentOptions();
1672
+ options.create_if_missing = true;
1673
+ options.max_background_jobs = 8;
1674
+ options.disable_auto_compactions = false;
1675
+ options.level0_slowdown_writes_trigger = 4;
1676
+ options.level0_stop_writes_trigger = 100;
1677
+ options.level0_file_num_compaction_trigger = 4;
1678
+ options.listeners.push_back(listener);
1679
+ DestroyAndReopen(options);
1680
+
1681
+ // Structural invariant checked on every snapshot.
1682
+ auto CheckInvariants = [](const std::vector<BackgroundJobPressure>& snaps) {
1683
+ ASSERT_GT(snaps.size(), 0u);
1684
+ for (const auto& s : snaps) {
1685
+ ASSERT_EQ(s.compaction_scheduled,
1686
+ s.compaction_low_scheduled + s.compaction_bottom_scheduled);
1687
+ ASSERT_EQ(s.compaction_running,
1688
+ s.compaction_low_running + s.compaction_bottom_running);
1689
+ }
1690
+ };
1691
+
1692
+ // Block compaction so L0 files accumulate.
1693
+ env_->SetBackgroundThreads(1, Env::Priority::LOW);
1694
+ test::SleepingBackgroundTask sleeping_task;
1695
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task,
1696
+ Env::Priority::LOW);
1697
+ sleeping_task.WaitUntilSleeping();
1698
+
1699
+ // Phase 1: No pressure — 3 SST files (below slowdown trigger=4).
1700
+ for (int i = 0; i < 3; i++) {
1701
+ ASSERT_OK(Put("k" + std::to_string(i), std::string(100, 'x')));
1702
+ ASSERT_OK(Flush());
1703
+ }
1704
+
1705
+ auto snapshots = listener->GetSnapshots();
1706
+ CheckInvariants(snapshots);
1707
+ for (const auto& s : snapshots) {
1708
+ ASSERT_EQ(s.compaction_running, 0);
1709
+ ASSERT_EQ(s.compaction_scheduled, 0);
1710
+ ASSERT_FALSE(s.compaction_speedup_active);
1711
+ ASSERT_LT(s.write_stall_proximity_pct, 100);
1712
+ }
1713
+ // Note: we don't assert flush_running/flush_scheduled == 0 here because
1714
+ // MaybeScheduleFlushOrCompaction() runs before the pressure callback and
1715
+ // may schedule new flush work, making flush counts non-deterministic.
1716
+
1717
+ // Phase 2: Build pressure — flush past slowdown trigger (4 L0 SST files).
1718
+ // Compaction is blocked, so L0 SST files pile up.
1719
+ listener->Reset();
1720
+ {
1721
+ FlushOptions fo;
1722
+ fo.allow_write_stall = true;
1723
+ for (int i = 3; i < 10; i++) {
1724
+ ASSERT_OK(Put("k" + std::to_string(i), std::string(100, 'x')));
1725
+ ASSERT_OK(db_->Flush(fo));
1726
+ }
1727
+ }
1728
+
1729
+ snapshots = listener->GetSnapshots();
1730
+ CheckInvariants(snapshots);
1731
+ for (const auto& s : snapshots) {
1732
+ ASSERT_EQ(s.compaction_running, 0);
1733
+ }
1734
+ // Scan history: pressure indicators appear as L0 SST files accumulate
1735
+ bool found_speedup = false;
1736
+ bool found_compaction_scheduled = false;
1737
+ bool found_high_proximity = false;
1738
+ for (const auto& s : snapshots) {
1739
+ if (s.compaction_speedup_active) {
1740
+ found_speedup = true;
1741
+ }
1742
+ if (s.compaction_scheduled > 0) {
1743
+ found_compaction_scheduled = true;
1744
+ }
1745
+ if (s.write_stall_proximity_pct >= 100) {
1746
+ found_high_proximity = true;
1747
+ }
1748
+ }
1749
+ ASSERT_TRUE(found_speedup);
1750
+ ASSERT_TRUE(found_compaction_scheduled);
1751
+ ASSERT_TRUE(found_high_proximity);
1752
+
1753
+ // Phase 3: Relieve pressure — unblock compaction, wait for completion.
1754
+ listener->Reset();
1755
+ sleeping_task.WakeUp();
1756
+ sleeping_task.WaitUntilDone();
1757
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1758
+
1759
+ snapshots = listener->GetSnapshots();
1760
+ CheckInvariants(snapshots);
1761
+ // Latest: all compactions finished, healthy
1762
+ const auto& latest3 = snapshots.back();
1763
+ ASSERT_EQ(latest3.compaction_running, 0);
1764
+ ASSERT_EQ(latest3.compaction_scheduled, 0);
1765
+ ASSERT_FALSE(latest3.compaction_speedup_active);
1766
+ ASSERT_LT(latest3.write_stall_proximity_pct, 100);
1767
+ }
1768
+
1642
1769
  } // namespace ROCKSDB_NAMESPACE
1643
1770
 
1644
1771
  int main(int argc, char** argv) {
@@ -98,7 +98,7 @@ class LogCompactionFilter : public CompactionFilter {
98
98
 
99
99
  TEST_F(ManualCompactionTest, CompactTouchesAllKeys) {
100
100
  for (int iter = 0; iter < 2; ++iter) {
101
- DB* db;
101
+ std::unique_ptr<DB> db;
102
102
  Options options;
103
103
  if (iter == 0) { // level compaction
104
104
  options.num_levels = 3;
@@ -128,7 +128,7 @@ TEST_F(ManualCompactionTest, CompactTouchesAllKeys) {
128
128
  delete itr;
129
129
 
130
130
  delete options.compaction_filter;
131
- delete db;
131
+ db.reset();
132
132
  ASSERT_OK(DestroyDB(dbname_, options));
133
133
  }
134
134
  }
@@ -137,7 +137,7 @@ TEST_F(ManualCompactionTest, Test) {
137
137
  // Open database. Disable compression since it affects the creation
138
138
  // of layers and the code below is trying to test against a very
139
139
  // specific scenario.
140
- DB* db;
140
+ std::unique_ptr<DB> db;
141
141
  Options db_options;
142
142
  db_options.write_buffer_size = 1024;
143
143
  db_options.create_if_missing = true;
@@ -185,12 +185,12 @@ TEST_F(ManualCompactionTest, Test) {
185
185
  ASSERT_EQ(kNumKeys, num_keys) << "Bad number of keys";
186
186
 
187
187
  // close database
188
- delete db;
188
+ db.reset();
189
189
  ASSERT_OK(DestroyDB(dbname_, Options()));
190
190
  }
191
191
 
192
192
  TEST_F(ManualCompactionTest, SkipLevel) {
193
- DB* db;
193
+ std::unique_ptr<DB> db;
194
194
  Options options;
195
195
  options.level_compaction_dynamic_level_bytes = false;
196
196
  options.num_levels = 3;
@@ -298,7 +298,7 @@ TEST_F(ManualCompactionTest, SkipLevel) {
298
298
  }
299
299
 
300
300
  delete filter;
301
- delete db;
301
+ db.reset();
302
302
  ASSERT_OK(DestroyDB(dbname_, options));
303
303
  }
304
304
 
@@ -72,7 +72,9 @@ ImmutableMemTableOptions::ImmutableMemTableOptions(
72
72
  allow_data_in_errors(ioptions.allow_data_in_errors),
73
73
  paranoid_memory_checks(mutable_cf_options.paranoid_memory_checks),
74
74
  memtable_veirfy_per_key_checksum_on_seek(
75
- mutable_cf_options.memtable_veirfy_per_key_checksum_on_seek) {}
75
+ mutable_cf_options.memtable_veirfy_per_key_checksum_on_seek),
76
+ memtable_batch_lookup_optimization(
77
+ ioptions.memtable_batch_lookup_optimization) {}
76
78
 
77
79
  MemTable::MemTable(const InternalKeyComparator& cmp,
78
80
  const ImmutableOptions& ioptions,
@@ -1575,65 +1577,179 @@ void MemTable::MultiGet(const ReadOptions& read_options, MultiGetRange* range,
1575
1577
  }
1576
1578
  }
1577
1579
  }
1578
- for (auto iter = temp_range.begin(); iter != temp_range.end(); ++iter) {
1579
- bool found_final_value{false};
1580
- bool merge_in_progress = iter->s->IsMergeInProgress();
1581
- if (!no_range_del) {
1582
- std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
1583
- NewRangeTombstoneIteratorInternal(
1584
- read_options, GetInternalKeySeqno(iter->lkey->internal_key()),
1585
- immutable_memtable));
1586
- SequenceNumber covering_seq =
1587
- range_del_iter->MaxCoveringTombstoneSeqnum(iter->lkey->user_key());
1588
- if (covering_seq > iter->max_covering_tombstone_seq) {
1589
- iter->max_covering_tombstone_seq = covering_seq;
1590
- if (iter->timestamp) {
1591
- // Will be overwritten in SaveValue() if there is a point key with
1592
- // a higher seqno.
1593
- iter->timestamp->assign(range_del_iter->timestamp().data(),
1594
- range_del_iter->timestamp().size());
1580
+
1581
+ // Use batch lookup optimization when enabled
1582
+ bool use_batch_optimization = moptions_.memtable_batch_lookup_optimization;
1583
+ bool validate = moptions_.paranoid_memory_checks ||
1584
+ moptions_.memtable_veirfy_per_key_checksum_on_seek;
1585
+
1586
+ if (use_batch_optimization) {
1587
+ // Phase 1: Handle range tombstones and set up Savers for batched lookup
1588
+ std::array<Saver, MultiGetContext::MAX_BATCH_SIZE> savers{};
1589
+ std::array<const char*, MultiGetContext::MAX_BATCH_SIZE> memtable_keys{};
1590
+ std::array<void*, MultiGetContext::MAX_BATCH_SIZE> callback_args{};
1591
+ std::array<bool, MultiGetContext::MAX_BATCH_SIZE> found_final_values{};
1592
+ std::array<bool, MultiGetContext::MAX_BATCH_SIZE> merge_in_progresses{};
1593
+ size_t num_keys = 0;
1594
+
1595
+ for (auto iter = temp_range.begin(); iter != temp_range.end(); ++iter) {
1596
+ if (!no_range_del) {
1597
+ std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
1598
+ NewRangeTombstoneIteratorInternal(
1599
+ read_options, GetInternalKeySeqno(iter->lkey->internal_key()),
1600
+ immutable_memtable));
1601
+ SequenceNumber covering_seq =
1602
+ range_del_iter->MaxCoveringTombstoneSeqnum(iter->lkey->user_key());
1603
+ if (covering_seq > iter->max_covering_tombstone_seq) {
1604
+ iter->max_covering_tombstone_seq = covering_seq;
1605
+ if (iter->timestamp) {
1606
+ iter->timestamp->assign(range_del_iter->timestamp().data(),
1607
+ range_del_iter->timestamp().size());
1608
+ }
1595
1609
  }
1596
1610
  }
1611
+
1612
+ found_final_values[num_keys] = false;
1613
+ merge_in_progresses[num_keys] = iter->s->IsMergeInProgress();
1614
+ Saver& saver = savers[num_keys];
1615
+ saver.status = iter->s;
1616
+ saver.found_final_value = &found_final_values[num_keys];
1617
+ saver.merge_in_progress = &merge_in_progresses[num_keys];
1618
+ saver.key = iter->lkey;
1619
+ saver.value = iter->value ? iter->value->GetSelf() : nullptr;
1620
+ saver.columns = iter->columns;
1621
+ saver.timestamp = iter->timestamp;
1622
+ saver.seq = kMaxSequenceNumber;
1623
+ saver.mem = this;
1624
+ saver.merge_context = &(iter->merge_context);
1625
+ saver.max_covering_tombstone_seq = iter->max_covering_tombstone_seq;
1626
+ saver.merge_operator = moptions_.merge_operator;
1627
+ saver.logger = moptions_.info_log;
1628
+ saver.inplace_update_support = moptions_.inplace_update_support;
1629
+ saver.statistics = moptions_.statistics;
1630
+ saver.clock = clock_;
1631
+ saver.callback_ = callback;
1632
+ saver.is_blob_index = &iter->is_blob_index;
1633
+ saver.do_merge = true;
1634
+ saver.allow_data_in_errors = moptions_.allow_data_in_errors;
1635
+ saver.protection_bytes_per_key = moptions_.protection_bytes_per_key;
1636
+
1637
+ memtable_keys[num_keys] = iter->lkey->memtable_key().data();
1638
+ callback_args[num_keys] = &savers[num_keys];
1639
+ num_keys++;
1597
1640
  }
1598
- SequenceNumber dummy_seq;
1599
- GetFromTable(*(iter->lkey), iter->max_covering_tombstone_seq, true,
1600
- callback, &iter->is_blob_index,
1601
- iter->value ? iter->value->GetSelf() : nullptr, iter->columns,
1602
- iter->timestamp, iter->s, &(iter->merge_context), &dummy_seq,
1603
- &found_final_value, &merge_in_progress);
1604
-
1605
- if (!found_final_value && merge_in_progress) {
1606
- if (iter->s->ok()) {
1607
- *(iter->s) = Status::MergeInProgress();
1608
- } else {
1609
- assert(iter->s->IsMergeInProgress());
1641
+
1642
+ // Phase 2: Batched lookup
1643
+ if (num_keys > 0) {
1644
+ Status check_s =
1645
+ table_->MultiGet(num_keys, memtable_keys.data(), callback_args.data(),
1646
+ SaveValue, moptions_.allow_data_in_errors,
1647
+ validate ? moptions_.paranoid_memory_checks : false,
1648
+ validate ? key_validation_callback_ : nullptr);
1649
+ if (check_s.IsCorruption()) {
1650
+ // Mark all remaining keys as corruption
1651
+ for (auto iter = temp_range.begin(); iter != temp_range.end(); ++iter) {
1652
+ *(iter->s) = check_s;
1653
+ range->MarkKeyDone(iter);
1654
+ }
1655
+ return;
1610
1656
  }
1611
1657
  }
1612
1658
 
1613
- if (found_final_value ||
1614
- (!iter->s->ok() && !iter->s->IsMergeInProgress())) {
1615
- // `found_final_value` should be set if an error/corruption occurs.
1616
- // The check on iter->s is just there in case GetFromTable() did not
1617
- // set `found_final_value` properly.
1618
- assert(found_final_value);
1619
- if (iter->value) {
1620
- iter->value->PinSelf();
1621
- range->AddValueSize(iter->value->size());
1622
- } else {
1623
- assert(iter->columns);
1624
- range->AddValueSize(iter->columns->serialized_size());
1659
+ // Phase 3: Process results
1660
+ size_t result_idx = 0;
1661
+ for (auto iter = temp_range.begin(); iter != temp_range.end();
1662
+ ++iter, ++result_idx) {
1663
+ bool found_final_value = found_final_values[result_idx];
1664
+ bool merge_in_progress = merge_in_progresses[result_idx];
1665
+
1666
+ if (!found_final_value && merge_in_progress) {
1667
+ if (iter->s->ok()) {
1668
+ *(iter->s) = Status::MergeInProgress();
1669
+ } else {
1670
+ assert(iter->s->IsMergeInProgress());
1671
+ }
1672
+ }
1673
+
1674
+ if (found_final_value ||
1675
+ (!iter->s->ok() && !iter->s->IsMergeInProgress())) {
1676
+ assert(found_final_value);
1677
+ if (iter->value) {
1678
+ iter->value->PinSelf();
1679
+ range->AddValueSize(iter->value->size());
1680
+ } else {
1681
+ assert(iter->columns);
1682
+ range->AddValueSize(iter->columns->serialized_size());
1683
+ }
1684
+
1685
+ range->MarkKeyDone(iter);
1686
+ RecordTick(moptions_.statistics, MEMTABLE_HIT);
1687
+ if (range->GetValueSize() > read_options.value_size_soft_limit) {
1688
+ for (auto range_iter = range->begin(); range_iter != range->end();
1689
+ ++range_iter) {
1690
+ range->MarkKeyDone(range_iter);
1691
+ *(range_iter->s) = Status::Aborted();
1692
+ }
1693
+ break;
1694
+ }
1695
+ }
1696
+ }
1697
+ } else {
1698
+ // Per-key lookup path
1699
+ for (auto iter = temp_range.begin(); iter != temp_range.end(); ++iter) {
1700
+ bool found_final_value{false};
1701
+ bool merge_in_progress = iter->s->IsMergeInProgress();
1702
+ if (!no_range_del) {
1703
+ std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
1704
+ NewRangeTombstoneIteratorInternal(
1705
+ read_options, GetInternalKeySeqno(iter->lkey->internal_key()),
1706
+ immutable_memtable));
1707
+ SequenceNumber covering_seq =
1708
+ range_del_iter->MaxCoveringTombstoneSeqnum(iter->lkey->user_key());
1709
+ if (covering_seq > iter->max_covering_tombstone_seq) {
1710
+ iter->max_covering_tombstone_seq = covering_seq;
1711
+ if (iter->timestamp) {
1712
+ iter->timestamp->assign(range_del_iter->timestamp().data(),
1713
+ range_del_iter->timestamp().size());
1714
+ }
1715
+ }
1716
+ }
1717
+ SequenceNumber dummy_seq;
1718
+ GetFromTable(
1719
+ *(iter->lkey), iter->max_covering_tombstone_seq, true, callback,
1720
+ &iter->is_blob_index, iter->value ? iter->value->GetSelf() : nullptr,
1721
+ iter->columns, iter->timestamp, iter->s, &(iter->merge_context),
1722
+ &dummy_seq, &found_final_value, &merge_in_progress);
1723
+
1724
+ if (!found_final_value && merge_in_progress) {
1725
+ if (iter->s->ok()) {
1726
+ *(iter->s) = Status::MergeInProgress();
1727
+ } else {
1728
+ assert(iter->s->IsMergeInProgress());
1729
+ }
1625
1730
  }
1626
1731
 
1627
- range->MarkKeyDone(iter);
1628
- RecordTick(moptions_.statistics, MEMTABLE_HIT);
1629
- if (range->GetValueSize() > read_options.value_size_soft_limit) {
1630
- // Set all remaining keys in range to Abort
1631
- for (auto range_iter = range->begin(); range_iter != range->end();
1632
- ++range_iter) {
1633
- range->MarkKeyDone(range_iter);
1634
- *(range_iter->s) = Status::Aborted();
1732
+ if (found_final_value ||
1733
+ (!iter->s->ok() && !iter->s->IsMergeInProgress())) {
1734
+ assert(found_final_value);
1735
+ if (iter->value) {
1736
+ iter->value->PinSelf();
1737
+ range->AddValueSize(iter->value->size());
1738
+ } else {
1739
+ assert(iter->columns);
1740
+ range->AddValueSize(iter->columns->serialized_size());
1741
+ }
1742
+
1743
+ range->MarkKeyDone(iter);
1744
+ RecordTick(moptions_.statistics, MEMTABLE_HIT);
1745
+ if (range->GetValueSize() > read_options.value_size_soft_limit) {
1746
+ for (auto range_iter = range->begin(); range_iter != range->end();
1747
+ ++range_iter) {
1748
+ range->MarkKeyDone(range_iter);
1749
+ *(range_iter->s) = Status::Aborted();
1750
+ }
1751
+ break;
1635
1752
  }
1636
- break;
1637
1753
  }
1638
1754
  }
1639
1755
  }
@@ -1841,6 +1957,36 @@ void MemTableRep::Get(const LookupKey& k, void* callback_args,
1841
1957
  }
1842
1958
  }
1843
1959
 
1960
+ Status MemTableRep::MultiGet(
1961
+ size_t num_keys, const char* const* keys, void** callback_args,
1962
+ bool (*callback_func)(void* arg, const char* entry),
1963
+ bool allow_data_in_errors, bool detect_key_out_of_order,
1964
+ const std::function<Status(const char*, bool)>& key_validation_callback) {
1965
+ bool validate = detect_key_out_of_order || key_validation_callback != nullptr;
1966
+ std::unique_ptr<Iterator> iter(GetIterator());
1967
+ for (size_t i = 0; i < num_keys; ++i) {
1968
+ Slice dummy;
1969
+ if (validate) {
1970
+ Status s = iter->SeekAndValidate(dummy, keys[i], allow_data_in_errors,
1971
+ detect_key_out_of_order,
1972
+ key_validation_callback);
1973
+ for (; iter->Valid() && s.ok() &&
1974
+ callback_func(callback_args[i], iter->key());
1975
+ s = iter->NextAndValidate(allow_data_in_errors)) {
1976
+ }
1977
+ if (!s.ok()) {
1978
+ return s;
1979
+ }
1980
+ } else {
1981
+ iter->Seek(dummy, keys[i]);
1982
+ for (; iter->Valid() && callback_func(callback_args[i], iter->key());
1983
+ iter->Next()) {
1984
+ }
1985
+ }
1986
+ }
1987
+ return Status::OK();
1988
+ }
1989
+
1844
1990
  void MemTable::RefLogContainingPrepSection(uint64_t log) {
1845
1991
  assert(log > 0);
1846
1992
  auto cur = min_prep_log_referenced_.load();
@@ -65,6 +65,7 @@ struct ImmutableMemTableOptions {
65
65
  bool allow_data_in_errors;
66
66
  bool paranoid_memory_checks;
67
67
  bool memtable_veirfy_per_key_checksum_on_seek;
68
+ bool memtable_batch_lookup_optimization;
68
69
  };
69
70
 
70
71
  // Batched counters to updated when inserting keys in one write batch.
@@ -599,6 +600,11 @@ class MemTable final : public ReadOnlyMemTable {
599
600
  std::memory_order_relaxed);
600
601
  }
601
602
 
603
+ // Returns true if a flush has already been scheduled for this memtable
604
+ bool HasFlushScheduled() const {
605
+ return flush_state_.load(std::memory_order_relaxed) == FLUSH_SCHEDULED;
606
+ }
607
+
602
608
  InternalIterator* NewIterator(
603
609
  const ReadOptions& read_options,
604
610
  UnownedPtr<const SeqnoToTimeMapping> seqno_to_time_mapping, Arena* arena,
@@ -33,12 +33,12 @@ std::string ValueWithWriteTime(std::string value, uint64_t write_time) {
33
33
  class MemTableListTest : public testing::Test {
34
34
  public:
35
35
  std::string dbname;
36
- DB* db;
36
+ std::unique_ptr<DB> db;
37
37
  Options options;
38
38
  std::vector<ColumnFamilyHandle*> handles;
39
39
  std::atomic<uint64_t> file_number;
40
40
 
41
- MemTableListTest() : db(nullptr), file_number(1) {
41
+ MemTableListTest() : file_number(1) {
42
42
  dbname = test::PerThreadDBPath("memtable_list_test");
43
43
  options.create_if_missing = true;
44
44
  EXPECT_OK(DestroyDB(dbname, options));
@@ -88,8 +88,7 @@ class MemTableListTest : public testing::Test {
88
88
  }
89
89
  }
90
90
  handles.clear();
91
- delete db;
92
- db = nullptr;
91
+ db.reset();
93
92
  EXPECT_OK(DestroyDB(dbname, options, cf_descs));
94
93
  }
95
94
  }