@nxtedition/rocksdb 15.4.0 → 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 (402) hide show
  1. package/binding.cc +24 -19
  2. package/cache.js +1 -1
  3. package/chained-batch.js +12 -3
  4. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  5. package/deps/rocksdb/rocksdb/BUCK +42 -0
  6. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  7. package/deps/rocksdb/rocksdb/Makefile +59 -32
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  9. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  10. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  11. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  12. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  13. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  19. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  25. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  26. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  28. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  29. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  31. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  32. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  33. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  34. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  53. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  54. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  55. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  57. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  58. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  59. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  60. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  61. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  62. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  63. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  64. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  65. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  66. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  67. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  68. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  81. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  82. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  83. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  84. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  85. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  86. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  87. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  88. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  89. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  91. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  92. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  93. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  94. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  95. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  96. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  97. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  98. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  99. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  100. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  101. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  102. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  103. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  104. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  105. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  106. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  107. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  110. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  111. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  112. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  113. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  114. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  115. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  116. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  117. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  118. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  119. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  121. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  122. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  123. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  124. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  125. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  126. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  127. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  128. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  129. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  130. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  131. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  132. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  133. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  134. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  135. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  136. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  137. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  138. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  139. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  140. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  141. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  142. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  143. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  144. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  145. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  146. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  147. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  148. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  150. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  151. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  152. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  153. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  160. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  161. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  162. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  163. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  164. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  165. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  166. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  167. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  168. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  169. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  170. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  171. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  172. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  173. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  174. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  175. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  176. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  177. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  179. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  180. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  181. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  182. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  183. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  184. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  185. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  187. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  188. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  189. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  192. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  194. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  195. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  196. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  197. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  198. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  199. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  200. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  202. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  203. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  204. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  205. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  206. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  210. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  211. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  212. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  213. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  214. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  215. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  216. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  217. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  218. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  219. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  220. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  221. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  222. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  223. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  224. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  225. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  226. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  227. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  228. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  229. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  230. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  231. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  232. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  233. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  234. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  235. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  236. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  237. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  238. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  239. package/deps/rocksdb/rocksdb/src.mk +12 -0
  240. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  241. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  242. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  243. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  253. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  254. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  255. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  256. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  257. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  258. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  259. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  260. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  261. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  263. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  264. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  265. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  266. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  267. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  268. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  269. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  270. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  273. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  274. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  275. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  276. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  277. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  278. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  279. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  280. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  281. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  282. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  283. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  284. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  286. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  287. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  288. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  289. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  290. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  291. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  292. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  293. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  294. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  295. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  296. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  297. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  298. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  299. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  300. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  301. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  302. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  303. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  304. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  305. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  306. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  307. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  308. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  309. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  310. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  311. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  312. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  313. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  314. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  315. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  316. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  317. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  318. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  319. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  320. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  321. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  322. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  323. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  324. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  325. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  326. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  327. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  328. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  329. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  331. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  332. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  333. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  334. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  335. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  336. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  337. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  338. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  339. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  340. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  341. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  342. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  343. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  344. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  355. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  356. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  358. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  360. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  361. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  362. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  364. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  365. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  366. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  367. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  368. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  369. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  370. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  371. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  373. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  375. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  376. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  377. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  378. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  380. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  381. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  388. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  389. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  390. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  391. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  392. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  393. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  394. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  395. package/deps/rocksdb/rocksdb.gyp +7 -0
  396. package/index.js +11 -2
  397. package/iterator.js +15 -7
  398. package/package.json +1 -1
  399. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  400. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -0,0 +1,332 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "table/block_based/multi_scan_index_iterator.h"
7
+
8
+ #include "monitoring/statistics_impl.h"
9
+ #include "rocksdb/options.h"
10
+
11
+ namespace ROCKSDB_NAMESPACE {
12
+
13
+ MultiScanIndexIterator::MultiScanIndexIterator(
14
+ std::vector<BlockHandle>&& block_handles,
15
+ std::vector<std::string>&& data_block_separators,
16
+ std::vector<std::tuple<size_t, size_t>>&& block_index_ranges_per_scan,
17
+ const MultiScanArgs* scan_opts, std::shared_ptr<ReadSet> read_set,
18
+ size_t prefetch_max_idx, const InternalKeyComparator& icomp,
19
+ Statistics* statistics)
20
+ : block_handles_(std::move(block_handles)),
21
+ data_block_separators_(std::move(data_block_separators)),
22
+ block_index_ranges_per_scan_(std::move(block_index_ranges_per_scan)),
23
+ scan_opts_(scan_opts),
24
+ read_set_(std::move(read_set)),
25
+ prefetch_max_idx_(prefetch_max_idx),
26
+ icomp_(icomp),
27
+ user_comparator_(icomp.user_comparator()),
28
+ statistics_(statistics) {}
29
+
30
+ MultiScanIndexIterator::~MultiScanIndexIterator() {
31
+ if (statistics_ && wasted_blocks_count_ > 0) {
32
+ RecordTick(statistics_, MULTISCAN_PREFETCH_BLOCKS_WASTED,
33
+ wasted_blocks_count_);
34
+ }
35
+ // Release any remaining pinned blocks
36
+ if (read_set_) {
37
+ for (size_t i = cur_idx_; i < block_handles_.size(); ++i) {
38
+ read_set_->ReleaseBlock(i);
39
+ }
40
+ }
41
+ }
42
+
43
+ void MultiScanIndexIterator::ReleaseBlocks(size_t from_idx, size_t to_idx) {
44
+ for (size_t i = from_idx; i < to_idx; ++i) {
45
+ if (i < prefetch_max_idx_) {
46
+ wasted_blocks_count_++;
47
+ }
48
+ read_set_->ReleaseBlock(i);
49
+ }
50
+ }
51
+
52
+ void MultiScanIndexIterator::Seek(const Slice& target) {
53
+ if (!status_.ok()) {
54
+ return;
55
+ }
56
+
57
+ // Reset scan range exhaustion flag on Seek
58
+ scan_range_exhausted_ = false;
59
+
60
+ // Check the case where there are no ranges prepared
61
+ if (scan_opts_->size() == 0) {
62
+ valid_ = false;
63
+ return;
64
+ }
65
+
66
+ // Enforce forward-only seek
67
+ if (!prev_seek_key_.empty() && icomp_.Compare(target, prev_seek_key_) <= 0) {
68
+ // Seek key is not moving forward — keep current position
69
+ return;
70
+ }
71
+ prev_seek_key_ = target.ToString();
72
+
73
+ const auto& scan_ranges = scan_opts_->GetScanRanges();
74
+ Slice user_seek_target = ExtractUserKey(target);
75
+
76
+ // Allow reseek on the start of the last prepared range
77
+ next_scan_idx_ =
78
+ std::min(next_scan_idx_, block_index_ranges_per_scan_.size() - 1);
79
+
80
+ auto compare_next_scan_start_result =
81
+ user_comparator_.CompareWithoutTimestamp(
82
+ user_seek_target, /*a_has_ts=*/true,
83
+ scan_ranges[next_scan_idx_].range.start.value(),
84
+ /*b_has_ts=*/false);
85
+
86
+ // There are 3 different Cases we need to handle:
87
+ // The following diagram explains different seek targets seeking at various
88
+ // positions on the table, while the next_scan_idx_ points to PreparedRange 2.
89
+ //
90
+ // next_scan_idx_: ------------------┐
91
+ // ▼
92
+ // table: : __[PreparedRange 1]__[PreparedRange 2]__[PreparedRange 3]__
93
+ // Seek target: <----- Case 1 ------>▲<------------- Case 2 -------------->
94
+ // │
95
+ // Case 3
96
+ //
97
+ // Case 1: seek before the start of next prepared range. This could happen
98
+ // due to too many delete tombstones triggering reseek or delete range.
99
+ // Case 2: seek after the start of next prepared range.
100
+ // This could happen due to seek key adjustment from delete range file.
101
+ // Case 3: seek at the beginning of a prepared range (expected case)
102
+
103
+ if (compare_next_scan_start_result < 0) {
104
+ // Case 1: Seek before the start of the next prepared range
105
+ if (next_scan_idx_ == 0) {
106
+ // Should not happen — seek before first prepared range
107
+ assert(false && "Seek target before the first prepared range");
108
+ valid_ = false;
109
+ return;
110
+ }
111
+ auto seek_target_before_previous_prepared_range =
112
+ user_comparator_.CompareWithoutTimestamp(
113
+ user_seek_target, /*a_has_ts=*/true,
114
+ scan_ranges[next_scan_idx_ - 1].range.start.value(),
115
+ /*b_has_ts=*/false) < 0;
116
+ assert(!seek_target_before_previous_prepared_range);
117
+ if (seek_target_before_previous_prepared_range) {
118
+ status_ = Status::InvalidArgument(
119
+ "Seek target is before the previous prepared range at index " +
120
+ std::to_string(next_scan_idx_));
121
+ RecordTick(statistics_, MULTISCAN_SEEK_ERRORS);
122
+ valid_ = false;
123
+ return;
124
+ }
125
+ // Seek within a gap — advance to the right scan range and find block
126
+ SeekToBlock(&user_seek_target);
127
+ } else if (compare_next_scan_start_result > 0) {
128
+ // Case 2: Seek after the start of the next prepared range
129
+ SeekToBlock(&user_seek_target);
130
+ } else {
131
+ // Case 3: Seek at the beginning of a prepared range (expected case)
132
+ assert(next_scan_idx_ < block_index_ranges_per_scan_.size());
133
+ auto [cur_scan_start_idx, cur_scan_end_idx] =
134
+ block_index_ranges_per_scan_[next_scan_idx_];
135
+ ++next_scan_idx_;
136
+
137
+ if (cur_scan_start_idx >= cur_scan_end_idx) {
138
+ // No blocks are prepared for this range at current file
139
+ SetExhausted();
140
+ return;
141
+ }
142
+
143
+ // max_sequential_skip_in_iterations can trigger a reseek on the start
144
+ // key of a scan range, even though we're already past cur_scan_start_idx
145
+ size_t block_idx = std::max(cur_scan_start_idx, cur_idx_);
146
+ if (block_idx >= cur_scan_end_idx) {
147
+ // cur_idx_ has advanced past this range's blocks (e.g., due to a
148
+ // reseek after all ranges were exhausted). Treat as exhausted.
149
+ SetExhausted();
150
+ return;
151
+ }
152
+ SeekToBlockIdx(block_idx);
153
+ }
154
+ }
155
+
156
+ void MultiScanIndexIterator::SeekToBlock(const Slice* user_seek_target) {
157
+ const auto& scan_ranges = scan_opts_->GetScanRanges();
158
+
159
+ // Advance next_scan_idx_ past ranges whose start key <= seek target
160
+ while (next_scan_idx_ < block_index_ranges_per_scan_.size() &&
161
+ user_comparator_.CompareWithoutTimestamp(
162
+ *user_seek_target, /*a_has_ts=*/true,
163
+ scan_ranges[next_scan_idx_].range.start.value(),
164
+ /*b_has_ts=*/false) >= 0) {
165
+ next_scan_idx_++;
166
+ }
167
+
168
+ assert(next_scan_idx_ > 0);
169
+ auto cur_scan_idx = next_scan_idx_ - 1;
170
+ auto [cur_scan_start_idx, cur_scan_end_idx] =
171
+ block_index_ranges_per_scan_[cur_scan_idx];
172
+
173
+ if (cur_scan_start_idx >= cur_scan_end_idx) {
174
+ SetExhausted();
175
+ return;
176
+ }
177
+
178
+ // Release blocks from current position to cur_scan_start_idx (wasted)
179
+ ReleaseBlocks(cur_idx_, cur_scan_start_idx);
180
+
181
+ // Find the correct block within the range using linear search on separators
182
+ size_t block_idx = std::max(cur_scan_start_idx, cur_idx_);
183
+ while (block_idx < data_block_separators_.size() &&
184
+ user_comparator_.CompareWithoutTimestamp(
185
+ *user_seek_target, /*a_has_ts=*/true,
186
+ data_block_separators_[block_idx],
187
+ /*b_has_ts=*/false) > 0) {
188
+ if (block_idx < prefetch_max_idx_) {
189
+ wasted_blocks_count_++;
190
+ }
191
+ read_set_->ReleaseBlock(block_idx);
192
+ block_idx++;
193
+ }
194
+
195
+ if (block_idx >= data_block_separators_.size()) {
196
+ // All remaining blocks were released above. Update cur_idx_ so the
197
+ // destructor does not double-release them.
198
+ cur_idx_ = block_handles_.size();
199
+ SetExhausted();
200
+ return;
201
+ }
202
+
203
+ // Update cur_idx_ before calling SeekToBlockIdx since we've already
204
+ // released all blocks up to block_idx above. This prevents SeekToBlockIdx's
205
+ // ReleaseBlocks(cur_idx_, block_idx) from double-releasing.
206
+ cur_idx_ = block_idx;
207
+ SeekToBlockIdx(block_idx);
208
+ }
209
+
210
+ void MultiScanIndexIterator::SeekToBlockIdx(size_t block_idx) {
211
+ assert(cur_idx_ <= block_idx);
212
+
213
+ // Release any blocks between cur_idx_ and block_idx (wasted)
214
+ ReleaseBlocks(cur_idx_, block_idx);
215
+
216
+ cur_idx_ = block_idx;
217
+ valid_ = true;
218
+ }
219
+
220
+ void MultiScanIndexIterator::SetExhausted() {
221
+ scan_range_exhausted_ = true;
222
+ if (next_scan_idx_ < block_index_ranges_per_scan_.size()) {
223
+ // More ranges remain — signal out-of-bound for current range.
224
+ valid_ = true;
225
+ // Position at the start of the next range so that the next Seek()
226
+ // can find it. We need to be "valid" so that FindBlockForward sets
227
+ // is_out_of_bound_ = true.
228
+ auto [start, end] = block_index_ranges_per_scan_[next_scan_idx_];
229
+ if (start < end) {
230
+ cur_idx_ = start;
231
+ return;
232
+ }
233
+ valid_ = false;
234
+ } else {
235
+ // Last range — natural EOF. Don't set out-of-bound so LevelIterator
236
+ // advances to the next file.
237
+ valid_ = false;
238
+ }
239
+ }
240
+
241
+ void MultiScanIndexIterator::Next() {
242
+ assert(valid_);
243
+
244
+ // Release current block
245
+ read_set_->ReleaseBlock(cur_idx_);
246
+ ++cur_idx_;
247
+
248
+ // Check if we've crossed a scan range boundary
249
+ if (next_scan_idx_ > 0) {
250
+ auto cur_scan_end_idx =
251
+ std::get<1>(block_index_ranges_per_scan_[next_scan_idx_ - 1]);
252
+ if (cur_idx_ >= cur_scan_end_idx) {
253
+ // Current scan range is exhausted
254
+ SetExhausted();
255
+ return;
256
+ }
257
+ }
258
+
259
+ // Check prefetch limit
260
+ if (cur_idx_ >= prefetch_max_idx_) {
261
+ valid_ = false;
262
+ if (scan_opts_->max_prefetch_size > 0) {
263
+ status_ = Status::PrefetchLimitReached();
264
+ }
265
+ return;
266
+ }
267
+
268
+ // Still within current range, valid
269
+ valid_ = true;
270
+ }
271
+
272
+ void MultiScanIndexIterator::SeekToFirst() {
273
+ if (block_index_ranges_per_scan_.empty()) {
274
+ valid_ = false;
275
+ return;
276
+ }
277
+
278
+ cur_idx_ = 0;
279
+ next_scan_idx_ = 0;
280
+ prev_seek_key_.clear();
281
+ wasted_blocks_count_ = 0;
282
+ status_ = Status::OK();
283
+
284
+ auto [start, end] = block_index_ranges_per_scan_[0];
285
+ if (start >= end) {
286
+ valid_ = false;
287
+ return;
288
+ }
289
+ cur_idx_ = start;
290
+ next_scan_idx_ = 1;
291
+ valid_ = true;
292
+ }
293
+
294
+ void MultiScanIndexIterator::SeekForPrev(const Slice& /*target*/) {
295
+ valid_ = false;
296
+ }
297
+
298
+ void MultiScanIndexIterator::SeekToLast() { valid_ = false; }
299
+
300
+ void MultiScanIndexIterator::Prev() { valid_ = false; }
301
+
302
+ Slice MultiScanIndexIterator::key() const {
303
+ assert(valid_);
304
+ assert(cur_idx_ < data_block_separators_.size());
305
+
306
+ // Build internal key: user_key + pack(kMaxSequenceNumber, kValueTypeForSeek)
307
+ cur_key_buf_.clear();
308
+ AppendInternalKey(&cur_key_buf_,
309
+ ParsedInternalKey(data_block_separators_[cur_idx_],
310
+ kMaxSequenceNumber, kValueTypeForSeek));
311
+ return Slice(cur_key_buf_);
312
+ }
313
+
314
+ Slice MultiScanIndexIterator::user_key() const {
315
+ assert(valid_);
316
+ assert(cur_idx_ < data_block_separators_.size());
317
+ return Slice(data_block_separators_[cur_idx_]);
318
+ }
319
+
320
+ IndexValue MultiScanIndexIterator::value() const {
321
+ assert(valid_);
322
+ assert(cur_idx_ < block_handles_.size());
323
+ // Return IndexValue with empty first_internal_key to disable
324
+ // is_at_first_key_from_index_ optimization
325
+ return IndexValue(block_handles_[cur_idx_], Slice());
326
+ }
327
+
328
+ uint64_t MultiScanIndexIterator::GetMaxPrefetchSize() const {
329
+ return scan_opts_->max_prefetch_size;
330
+ }
331
+
332
+ } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,133 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #pragma once
7
+
8
+ #include <string>
9
+ #include <tuple>
10
+ #include <vector>
11
+
12
+ #include "db/dbformat.h"
13
+ #include "rocksdb/io_dispatcher.h"
14
+ #include "table/format.h"
15
+ #include "table/internal_iterator.h"
16
+ #include "util/user_comparator_wrapper.h"
17
+
18
+ namespace ROCKSDB_NAMESPACE {
19
+
20
+ class MultiScanArgs;
21
+ class Statistics;
22
+
23
+ // MultiScanIndexIterator wraps the block handle list produced by
24
+ // Prepare()/CollectBlockHandles() and presents it as an
25
+ // InternalIteratorBase<IndexValue>. This allows BlockBasedTableIterator
26
+ // to use the same SeekImpl()/FindBlockForward() code path for both
27
+ // regular iteration and MultiScan.
28
+ //
29
+ // The iterator supports forward-only Seek() and Next(). Seek targets must
30
+ // be non-decreasing (enforced via prev_seek_key_). When a scan range is
31
+ // exhausted, Next() jumps to the start of the next scan range. When all
32
+ // ranges are exhausted, the iterator becomes invalid.
33
+ class MultiScanIndexIterator : public InternalIteratorBase<IndexValue> {
34
+ public:
35
+ // scan_opts and icomp must outlive this iterator. read_set is shared.
36
+ MultiScanIndexIterator(
37
+ std::vector<BlockHandle>&& block_handles,
38
+ std::vector<std::string>&& data_block_separators,
39
+ std::vector<std::tuple<size_t, size_t>>&& block_index_ranges_per_scan,
40
+ const MultiScanArgs* scan_opts, std::shared_ptr<ReadSet> read_set,
41
+ size_t prefetch_max_idx, const InternalKeyComparator& icomp,
42
+ Statistics* statistics);
43
+
44
+ ~MultiScanIndexIterator() override;
45
+
46
+ // Non-copyable, non-movable.
47
+ MultiScanIndexIterator(const MultiScanIndexIterator&) = delete;
48
+ MultiScanIndexIterator& operator=(const MultiScanIndexIterator&) = delete;
49
+ MultiScanIndexIterator(MultiScanIndexIterator&&) = delete;
50
+ MultiScanIndexIterator& operator=(MultiScanIndexIterator&&) = delete;
51
+
52
+ // Forward-only seek. target must be >= prev_seek_key_.
53
+ void Seek(const Slice& target) override;
54
+
55
+ // Move to the next block. Handles scan range boundaries.
56
+ void Next() override;
57
+
58
+ // Move to the first block of the first scan range.
59
+ void SeekToFirst() override;
60
+
61
+ // Not supported — sets valid_ = false.
62
+ void SeekForPrev(const Slice& target) override;
63
+ void SeekToLast() override;
64
+ void Prev() override;
65
+
66
+ bool Valid() const override { return valid_; }
67
+
68
+ // Returns an internal key built from the current block's separator
69
+ // with kMaxSequenceNumber.
70
+ Slice key() const override;
71
+
72
+ // Returns the user key separator for the current block.
73
+ Slice user_key() const override;
74
+
75
+ // Returns IndexValue with the current block handle and empty
76
+ // first_internal_key (disables is_at_first_key_from_index_ optimization).
77
+ IndexValue value() const override;
78
+
79
+ Status status() const override { return status_; }
80
+
81
+ // Returns the current index into the block_handles/read_set arrays.
82
+ size_t current_read_set_index() const { return cur_idx_; }
83
+
84
+ // Returns the max_prefetch_size from scan options.
85
+ uint64_t GetMaxPrefetchSize() const;
86
+
87
+ // Returns true if the last Next() crossed a scan range boundary.
88
+ // Only valid immediately after Next(); reset to false on the next Seek().
89
+ bool IsScanRangeExhausted() const { return scan_range_exhausted_; }
90
+
91
+ // Returns true if there are more scan ranges after the current one.
92
+ bool HasMoreScanRanges() const {
93
+ return next_scan_idx_ < block_index_ranges_per_scan_.size();
94
+ }
95
+
96
+ private:
97
+ // Release blocks from from_idx (inclusive) to to_idx (exclusive),
98
+ // counting wasted prefetched blocks.
99
+ void ReleaseBlocks(size_t from_idx, size_t to_idx);
100
+
101
+ // Find the correct scan range and block for an unexpected seek target
102
+ // (target doesn't match expected scan range start).
103
+ void SeekToBlock(const Slice* user_seek_target);
104
+
105
+ // Position at block_idx after releasing any skipped blocks.
106
+ void SeekToBlockIdx(size_t block_idx);
107
+
108
+ // Mark the current scan range as exhausted. If more ranges remain,
109
+ // positions at the next range's start (stays valid for out-of-bound
110
+ // detection). If this is the last range, becomes invalid.
111
+ void SetExhausted();
112
+
113
+ std::vector<BlockHandle> block_handles_;
114
+ std::vector<std::string> data_block_separators_;
115
+ std::vector<std::tuple<size_t, size_t>> block_index_ranges_per_scan_;
116
+ const MultiScanArgs* scan_opts_;
117
+ std::shared_ptr<ReadSet> read_set_;
118
+ size_t prefetch_max_idx_;
119
+ const InternalKeyComparator& icomp_;
120
+ UserComparatorWrapper user_comparator_;
121
+ Statistics* statistics_;
122
+
123
+ size_t cur_idx_ = 0;
124
+ size_t next_scan_idx_ = 0;
125
+ bool valid_ = false;
126
+ Status status_;
127
+ std::string prev_seek_key_;
128
+ size_t wasted_blocks_count_ = 0;
129
+ bool scan_range_exhausted_ = false;
130
+ mutable std::string cur_key_buf_;
131
+ };
132
+
133
+ } // namespace ROCKSDB_NAMESPACE
@@ -39,13 +39,15 @@ PartitionedFilterBlockBuilder::PartitionedFilterBlockBuilder(
39
39
  use_value_delta_encoding,
40
40
  BlockBasedTableOptions::kDataBlockBinarySearch /* index_type */,
41
41
  0.75 /* data_block_hash_table_util_ratio */, ts_sz,
42
- persist_user_defined_timestamps, false /* is_user_key */),
42
+ persist_user_defined_timestamps, false /* is_user_key */,
43
+ /*use_separated_kv_storage=*/false),
43
44
  index_on_filter_block_builder_without_seq_(
44
45
  index_block_restart_interval, true /*use_delta_encoding*/,
45
46
  use_value_delta_encoding,
46
47
  BlockBasedTableOptions::kDataBlockBinarySearch /* index_type */,
47
48
  0.75 /* data_block_hash_table_util_ratio */, ts_sz,
48
- persist_user_defined_timestamps, true /* is_user_key */) {
49
+ persist_user_defined_timestamps, true /* is_user_key */,
50
+ /*use_separated_kv_storage=*/false) {
49
51
  // Compute keys_per_partition_
50
52
  keys_per_partition_ = static_cast<uint32_t>(
51
53
  filter_bits_builder_->ApproximateNumEntries(partition_size));
@@ -350,7 +350,7 @@ INSTANTIATE_TEST_CASE_P(
350
350
  FormatVersions, PartitionedFilterBlockTest,
351
351
  testing::Combine(
352
352
  testing::ValuesIn(std::set<uint32_t>{
353
- 2, 3, 4, 5, test::kDefaultFormatVersion, kLatestFormatVersion}),
353
+ 2, 3, 4, 5, test::kDefaultFormatVersion, kLatestBbtFormatVersion}),
354
354
  testing::ValuesIn(test::GetUDTTestModes()), testing::Bool()));
355
355
 
356
356
  TEST_P(PartitionedFilterBlockTest, EmptyBuilder) {
@@ -25,7 +25,7 @@ void ForceReleaseCachedEntry(void* arg, void* h) {
25
25
  // WART: this is specific to block-based table
26
26
  Status VerifyBlockChecksum(const Footer& footer, const char* data,
27
27
  size_t block_size, const std::string& file_name,
28
- uint64_t offset) {
28
+ uint64_t offset, BlockType block_type) {
29
29
  PERF_TIMER_GUARD(block_checksum_time);
30
30
 
31
31
  assert(footer.GetBlockTrailerSize() == 5);
@@ -58,7 +58,8 @@ Status VerifyBlockChecksum(const Footer& footer, const char* data,
58
58
  std::string(modifier ? "(context removed)" : "") + " = " +
59
59
  std::to_string(stored) + ", computed = " + std::to_string(computed) +
60
60
  ", type = " + std::to_string(type) + " in " + file_name + " offset " +
61
- std::to_string(offset) + " size " + std::to_string(block_size));
61
+ std::to_string(offset) + " size " + std::to_string(block_size) +
62
+ ", block_type = " + BlockTypeToString(block_type));
62
63
  }
63
64
  }
64
65
  } // namespace ROCKSDB_NAMESPACE
@@ -10,6 +10,7 @@
10
10
 
11
11
  #include "rocksdb/advanced_cache.h"
12
12
  #include "rocksdb/table.h"
13
+ #include "table/block_based/block_type.h"
13
14
 
14
15
  namespace ROCKSDB_NAMESPACE {
15
16
  class Footer;
@@ -27,10 +28,12 @@ inline MemoryAllocator* GetMemoryAllocator(
27
28
  // Assumes block has a trailer past `data + block_size` as in format.h.
28
29
  // `file_name` provided for generating diagnostic message in returned status.
29
30
  // `offset` might be required for proper verification (also used for message).
31
+ // `block_type` is included in the error message to provide context about
32
+ // which type of block failed checksum verification.
30
33
  //
31
34
  // Returns Status::OK() on checksum match, or Status::Corruption() on checksum
32
35
  // mismatch.
33
36
  Status VerifyBlockChecksum(const Footer& footer, const char* data,
34
37
  size_t block_size, const std::string& file_name,
35
- uint64_t offset);
38
+ uint64_t offset, BlockType block_type);
36
39
  } // namespace ROCKSDB_NAMESPACE
@@ -18,7 +18,6 @@ struct BlockCacheLookupContext;
18
18
  class FilePrefetchBuffer;
19
19
  class GetContext;
20
20
  struct ReadOptions;
21
- struct UncompressionDict;
22
21
 
23
22
  // Provides access to the uncompression dictionary regardless of whether
24
23
  // it is owned by the reader or stored in the cache, or whether it is pinned