@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
@@ -33,6 +33,7 @@
33
33
  #include "db/range_del_aggregator.h"
34
34
  #include "db/version_edit.h"
35
35
  #include "db/version_set.h"
36
+ #include "file/file_util.h"
36
37
  #include "file/filename.h"
37
38
  #include "file/read_write_util.h"
38
39
  #include "file/sst_file_manager_impl.h"
@@ -128,6 +129,10 @@ const char* GetCompactionProximalOutputRangeTypeString(
128
129
  }
129
130
  }
130
131
 
132
+ // Static constant for compaction abort flag - always false, used for
133
+ // compaction service jobs that don't support abort signaling
134
+ const std::atomic<int> CompactionJob::kCompactionAbortedFalse{0};
135
+
131
136
  CompactionJob::CompactionJob(
132
137
  int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
133
138
  const MutableDBOptions& mutable_db_options, const FileOptions& file_options,
@@ -141,10 +146,10 @@ CompactionJob::CompactionJob(
141
146
  CompactionJobStats* compaction_job_stats, Env::Priority thread_pri,
142
147
  const std::shared_ptr<IOTracer>& io_tracer,
143
148
  const std::atomic<bool>& manual_compaction_canceled,
144
- const std::string& db_id, const std::string& db_session_id,
145
- std::string full_history_ts_low, std::string trim_ts,
146
- BlobFileCompletionCallback* blob_callback, int* bg_compaction_scheduled,
147
- int* bg_bottom_compaction_scheduled)
149
+ const std::atomic<int>& compaction_aborted, const std::string& db_id,
150
+ const std::string& db_session_id, std::string full_history_ts_low,
151
+ std::string trim_ts, BlobFileCompletionCallback* blob_callback,
152
+ int* bg_compaction_scheduled, int* bg_bottom_compaction_scheduled)
148
153
  : compact_(new CompactionState(compaction)),
149
154
  internal_stats_(compaction->compaction_reason(), 1),
150
155
  db_options_(db_options),
@@ -168,6 +173,7 @@ CompactionJob::CompactionJob(
168
173
  versions_(versions),
169
174
  shutting_down_(shutting_down),
170
175
  manual_compaction_canceled_(manual_compaction_canceled),
176
+ compaction_aborted_(compaction_aborted),
171
177
  db_directory_(db_directory),
172
178
  blob_output_directory_(blob_output_directory),
173
179
  db_mutex_(db_mutex),
@@ -708,6 +714,7 @@ void CompactionJob::InitializeCompactionRun() {
708
714
  }
709
715
 
710
716
  void CompactionJob::RunSubcompactions() {
717
+ TEST_SYNC_POINT("CompactionJob::RunSubcompactions:BeforeStart");
711
718
  const size_t num_threads = compact_->sub_compact_states.size();
712
719
  assert(num_threads > 0);
713
720
  compact_->compaction->GetOrInitInputTableProperties();
@@ -753,6 +760,71 @@ void CompactionJob::RemoveEmptyOutputs() {
753
760
  }
754
761
  }
755
762
 
763
+ void CompactionJob::CleanupAbortedSubcompactions() {
764
+ ColumnFamilyData* cfd = compact_->compaction->column_family_data();
765
+
766
+ uint64_t total_sst_files_deleted = 0;
767
+ uint64_t total_blob_files_deleted = 0;
768
+
769
+ // Track the first file deletion error to report at the end
770
+ Status first_error;
771
+ int deletion_errors = 0;
772
+
773
+ // Mark all subcompactions as aborted and delete their output files
774
+ for (auto& sub_compact : compact_->sub_compact_states) {
775
+ // Mark this subcompaction as aborted
776
+ sub_compact.status =
777
+ Status::Incomplete(Status::SubCode::kCompactionAborted);
778
+
779
+ // Delete all files (SST and blob) tracked during compaction.
780
+ // GetOutputFilePaths() contains ALL file paths created, including
781
+ // in-progress files that may have been removed from outputs_ or
782
+ // blob_file_additions_.
783
+ for (const bool is_proximal_level : {false, true}) {
784
+ if (is_proximal_level &&
785
+ !compact_->compaction->SupportsPerKeyPlacement()) {
786
+ continue;
787
+ }
788
+ for (const std::string& file_path :
789
+ sub_compact.Outputs(is_proximal_level)->GetOutputFilePaths()) {
790
+ Status s = env_->DeleteFile(file_path);
791
+ if (s.ok()) {
792
+ // Count SST vs blob files by checking extension
793
+ if (file_path.find(".sst") != std::string::npos) {
794
+ total_sst_files_deleted++;
795
+ } else if (file_path.find(".blob") != std::string::npos) {
796
+ total_blob_files_deleted++;
797
+ }
798
+ } else if (!s.IsNotFound()) {
799
+ if (first_error.ok()) {
800
+ first_error = s;
801
+ }
802
+ deletion_errors++;
803
+ }
804
+ }
805
+ }
806
+ sub_compact.CleanupOutputs();
807
+ }
808
+
809
+ if (stats_) {
810
+ RecordTick(stats_, COMPACTION_ABORTED);
811
+ }
812
+
813
+ ROCKS_LOG_INFO(db_options_.info_log,
814
+ "[%s] [JOB %d] Compaction aborted: deleted %" PRIu64
815
+ " SST files and %" PRIu64 " blob files",
816
+ cfd->GetName().c_str(), job_id_, total_sst_files_deleted,
817
+ total_blob_files_deleted);
818
+
819
+ if (!first_error.ok()) {
820
+ ROCKS_LOG_ERROR(db_options_.info_log,
821
+ "[%s] [JOB %d] Cleanup completed with %d file deletion "
822
+ "errors. First error: %s",
823
+ cfd->GetName().c_str(), job_id_, deletion_errors,
824
+ first_error.ToString().c_str());
825
+ }
826
+ }
827
+
756
828
  bool CompactionJob::HasNewBlobFiles() const {
757
829
  for (const auto& state : compact_->sub_compact_states) {
758
830
  if (state.Current().HasBlobFileAdditions()) {
@@ -832,17 +904,17 @@ Status CompactionJob::VerifyOutputFiles() {
832
904
  // use_direct_io_for_flush_and_compaction is true, we will regard this
833
905
  // verification as user reads since the goal is to cache it here for
834
906
  // further user reads
835
- ReadOptions verify_table_read_options(Env::IOActivity::kCompaction);
836
- verify_table_read_options.verify_checksums = true;
837
- verify_table_read_options.readahead_size =
907
+ ReadOptions verification_read_options(Env::IOActivity::kCompaction);
908
+ verification_read_options.verify_checksums = true;
909
+ verification_read_options.readahead_size =
838
910
  file_options_for_read_.compaction_readahead_size;
839
911
 
840
912
  std::unique_ptr<TableReader> table_reader_guard;
841
913
  TableReader* table_reader_ptr = table_reader_guard.get();
842
- verify_table_read_options.rate_limiter_priority =
914
+ verification_read_options.rate_limiter_priority =
843
915
  GetRateLimiterPriority();
844
916
  InternalIterator* iter = cfd->table_cache()->NewIterator(
845
- verify_table_read_options, file_options_, cfd->internal_comparator(),
917
+ verification_read_options, file_options_, cfd->internal_comparator(),
846
918
  output_file.meta,
847
919
  /*range_del_agg=*/nullptr, compact_->compaction->mutable_cf_options(),
848
920
  /*table_reader_ptr=*/&table_reader_ptr,
@@ -870,12 +942,17 @@ Status CompactionJob::VerifyOutputFiles() {
870
942
  !!(verify_output_flags & VerifyOutputFlags::kVerifyBlockChecksum);
871
943
  const bool should_verify_iteration =
872
944
  !!(verify_output_flags & VerifyOutputFlags::kVerifyIteration);
945
+ const bool should_verify_file_checksum =
946
+ !!(verify_output_flags &
947
+ VerifyOutputFlags::kVerifyFileChecksum) &&
948
+ db_options_.file_checksum_gen_factory != nullptr &&
949
+ output_file.meta.file_checksum != kUnknownFileChecksum;
873
950
  if (should_verify_block_checksum) {
874
951
  assert(table_reader_ptr != nullptr);
875
952
  // If verifying iteration as well, verify meta blocks here only to
876
953
  // avoid redundant checks on data blocks
877
954
  s = table_reader_ptr->VerifyChecksum(
878
- verify_table_read_options, TableReaderCaller::kCompaction,
955
+ verification_read_options, TableReaderCaller::kCompaction,
879
956
  /*meta_blocks_only=*/should_verify_iteration);
880
957
  }
881
958
  if (s.ok() && should_verify_iteration) {
@@ -896,6 +973,24 @@ Status CompactionJob::VerifyOutputFiles() {
896
973
  "was computed when written");
897
974
  }
898
975
  }
976
+ if (s.ok() && should_verify_file_checksum) {
977
+ std::string file_checksum;
978
+ std::string file_checksum_func_name;
979
+ std::string fname =
980
+ GetTableFileName(output_file.meta.fd.GetNumber());
981
+ s = GenerateOneFileChecksum(
982
+ fs_.get(), fname, db_options_.file_checksum_gen_factory.get(),
983
+ output_file.meta.file_checksum_func_name, &file_checksum,
984
+ &file_checksum_func_name,
985
+ verification_read_options.readahead_size,
986
+ db_options_.allow_mmap_reads, io_tracer_,
987
+ db_options_.rate_limiter.get(), verification_read_options,
988
+ stats_, db_options_.clock, file_options_for_read_);
989
+ if (s.ok() && file_checksum != output_file.meta.file_checksum) {
990
+ s = Status::Corruption(
991
+ "File checksum mismatch for compaction output file " + fname);
992
+ }
993
+ }
899
994
  }
900
995
  }
901
996
 
@@ -1004,6 +1099,15 @@ Status CompactionJob::Run() {
1004
1099
 
1005
1100
  Status status = CollectSubcompactionErrors();
1006
1101
 
1102
+ // If compaction was aborted or manually paused, clean up any output files
1103
+ // from completed subcompactions to prevent orphaned files on disk.
1104
+ // Skip cleanup for resumable compaction (when progress writer is set)
1105
+ // because the output files are needed for resumption.
1106
+ if ((status.IsCompactionAborted() || status.IsManualCompactionPaused()) &&
1107
+ compaction_progress_writer_ == nullptr) {
1108
+ CleanupAbortedSubcompactions();
1109
+ }
1110
+
1007
1111
  if (status.ok()) {
1008
1112
  status = SyncOutputDirectories();
1009
1113
  }
@@ -1012,6 +1116,9 @@ Status CompactionJob::Run() {
1012
1116
  status = VerifyOutputFiles();
1013
1117
  }
1014
1118
 
1119
+ TEST_SYNC_POINT_CALLBACK("CompactionJob::Run():AfterVerifyOutputFiles",
1120
+ &status);
1121
+
1015
1122
  if (status.ok()) {
1016
1123
  SetOutputTableProperties();
1017
1124
  }
@@ -1415,10 +1522,10 @@ InternalIterator* CompactionJob::CreateInputIterator(
1415
1522
  return input;
1416
1523
  }
1417
1524
 
1418
- void CompactionJob::CreateBlobFileBuilder(SubcompactionState* sub_compact,
1419
- ColumnFamilyData* cfd,
1420
- BlobFileResources& blob_resources,
1421
- const WriteOptions& write_options) {
1525
+ void CompactionJob::CreateBlobFileBuilder(
1526
+ SubcompactionState* sub_compact, ColumnFamilyData* cfd,
1527
+ std::unique_ptr<BlobFileBuilder>& blob_file_builder,
1528
+ const WriteOptions& write_options) {
1422
1529
  const auto& mutable_cf_options =
1423
1530
  sub_compact->compaction->mutable_cf_options();
1424
1531
 
@@ -1427,24 +1534,24 @@ void CompactionJob::CreateBlobFileBuilder(SubcompactionState* sub_compact,
1427
1534
  if (mutable_cf_options.enable_blob_files &&
1428
1535
  sub_compact->compaction->output_level() >=
1429
1536
  mutable_cf_options.blob_file_starting_level) {
1430
- blob_resources.blob_file_builder = std::make_unique<BlobFileBuilder>(
1537
+ blob_file_builder = std::make_unique<BlobFileBuilder>(
1431
1538
  versions_, fs_.get(), &sub_compact->compaction->immutable_options(),
1432
1539
  &mutable_cf_options, &file_options_, &write_options, db_id_,
1433
1540
  db_session_id_, job_id_, cfd->GetID(), cfd->GetName(), write_hint_,
1434
1541
  io_tracer_, blob_callback_, BlobFileCreationReason::kCompaction,
1435
- &blob_resources.blob_file_paths,
1542
+ sub_compact->Current().GetOutputFilePathsPtr(),
1436
1543
  sub_compact->Current().GetBlobFileAdditionsPtr());
1437
1544
  } else {
1438
- blob_resources.blob_file_builder = nullptr;
1545
+ blob_file_builder = nullptr;
1439
1546
  }
1440
1547
  }
1441
1548
 
1442
1549
  std::unique_ptr<CompactionIterator> CompactionJob::CreateCompactionIterator(
1443
1550
  SubcompactionState* sub_compact, ColumnFamilyData* cfd,
1444
1551
  InternalIterator* input, const CompactionFilter* compaction_filter,
1445
- MergeHelper& merge, BlobFileResources& blob_resources,
1552
+ MergeHelper& merge, std::unique_ptr<BlobFileBuilder>& blob_file_builder,
1446
1553
  const WriteOptions& write_options) {
1447
- CreateBlobFileBuilder(sub_compact, cfd, blob_resources, write_options);
1554
+ CreateBlobFileBuilder(sub_compact, cfd, blob_file_builder, write_options);
1448
1555
 
1449
1556
  const std::string* const full_history_ts_low =
1450
1557
  full_history_ts_low_.empty() ? nullptr : &full_history_ts_low_;
@@ -1456,7 +1563,7 @@ std::unique_ptr<CompactionIterator> CompactionJob::CreateCompactionIterator(
1456
1563
  job_context_->earliest_write_conflict_snapshot,
1457
1564
  job_context_->GetJobSnapshotSequence(), job_context_->snapshot_checker,
1458
1565
  env_, ShouldReportDetailedTime(env_, stats_), sub_compact->RangeDelAgg(),
1459
- blob_resources.blob_file_builder.get(), db_options_.allow_data_in_errors,
1566
+ blob_file_builder.get(), db_options_.allow_data_in_errors,
1460
1567
  db_options_.enforce_single_del_contracts, manual_compaction_canceled_,
1461
1568
  sub_compact->compaction
1462
1569
  ->DoesInputReferenceBlobFiles() /* must_count_input_entries */,
@@ -1495,10 +1602,17 @@ Status CompactionJob::ProcessKeyValue(
1495
1602
  SubcompactionState* sub_compact, ColumnFamilyData* cfd,
1496
1603
  CompactionIterator* c_iter, const CompactionFileOpenFunc& open_file_func,
1497
1604
  const CompactionFileCloseFunc& close_file_func, uint64_t& prev_cpu_micros) {
1498
- Status status;
1499
- const uint64_t kRecordStatsEvery = 1000;
1605
+ // Cron interval for periodic operations: stats update, abort check,
1606
+ // and sync points. Uses 1024 (power of 2) for efficient bitwise check.
1607
+ const uint64_t kCronEveryMask = (1 << 10) - 1;
1500
1608
  [[maybe_unused]] const std::optional<const Slice> end = sub_compact->end;
1501
1609
 
1610
+ // Check for abort signal before starting key processing
1611
+ if (compaction_aborted_.load(std::memory_order_acquire) > 0) {
1612
+ return Status::Incomplete(Status::SubCode::kCompactionAborted);
1613
+ }
1614
+
1615
+ Status status;
1502
1616
  IterKey prev_iter_output_key;
1503
1617
  ParsedInternalKey prev_iter_output_internal_key;
1504
1618
 
@@ -1511,8 +1625,16 @@ Status CompactionJob::ProcessKeyValue(
1511
1625
  assert(!end.has_value() ||
1512
1626
  cfd->user_comparator()->Compare(c_iter->user_key(), *end) < 0);
1513
1627
 
1514
- if (c_iter->iter_stats().num_input_records % kRecordStatsEvery ==
1515
- kRecordStatsEvery - 1) {
1628
+ const uint64_t num_records = c_iter->iter_stats().num_input_records;
1629
+
1630
+ // Periodic cron operations: stats update, abort check.
1631
+ if ((num_records & kCronEveryMask) == kCronEveryMask) {
1632
+ // Check for abort signal periodically
1633
+ if (compaction_aborted_.load(std::memory_order_acquire) > 0) {
1634
+ status = Status::Incomplete(Status::SubCode::kCompactionAborted);
1635
+ break;
1636
+ }
1637
+
1516
1638
  UpdateSubcompactionJobStatsIncrementally(
1517
1639
  c_iter, &sub_compact->compaction_job_stats,
1518
1640
  db_options_.clock->CPUMicros(), prev_cpu_micros);
@@ -1719,6 +1841,7 @@ Status CompactionJob::FinalizeBlobFiles(SubcompactionState* sub_compact,
1719
1841
  }
1720
1842
 
1721
1843
  void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1844
+ TEST_SYNC_POINT("CompactionJob::ProcessKeyValueCompaction:Start");
1722
1845
  assert(sub_compact);
1723
1846
  assert(sub_compact->compaction);
1724
1847
 
@@ -1772,11 +1895,11 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1772
1895
  false /* internal key corruption is expected */,
1773
1896
  job_context_->GetLatestSnapshotSequence(), job_context_->snapshot_checker,
1774
1897
  compact_->compaction->level(), db_options_.stats);
1775
- BlobFileResources blob_resources;
1898
+ std::unique_ptr<BlobFileBuilder> blob_file_builder;
1776
1899
 
1777
1900
  auto c_iter =
1778
1901
  CreateCompactionIterator(sub_compact, cfd, input_iter, compaction_filter,
1779
- merge, blob_resources, write_options);
1902
+ merge, blob_file_builder, write_options);
1780
1903
  assert(c_iter);
1781
1904
  c_iter->SeekToFirst();
1782
1905
 
@@ -1794,9 +1917,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1794
1917
  status = FinalizeProcessKeyValueStatus(cfd, input_iter, c_iter.get(), status);
1795
1918
 
1796
1919
  FinalizeSubcompaction(sub_compact, status, open_file_func, close_file_func,
1797
- blob_resources.blob_file_builder.get(), c_iter.get(),
1798
- input_iter, start_cpu_micros, prev_cpu_micros,
1799
- io_stats);
1920
+ blob_file_builder.get(), c_iter.get(), input_iter,
1921
+ start_cpu_micros, prev_cpu_micros, io_stats);
1800
1922
 
1801
1923
  NotifyOnSubcompactionCompleted(sub_compact);
1802
1924
  }
@@ -2295,6 +2417,10 @@ Status CompactionJob::OpenCompactionOutputFile(SubcompactionState* sub_compact,
2295
2417
  Status s;
2296
2418
  IOStatus io_s = NewWritableFile(fs_.get(), fname, &writable_file, fo_copy);
2297
2419
  s = io_s;
2420
+ if (io_s.ok()) {
2421
+ // Track the SST file path for cleanup on abort.
2422
+ outputs.AddOutputFilePath(fname);
2423
+ }
2298
2424
  if (sub_compact->io_status.ok()) {
2299
2425
  sub_compact->io_status = io_s;
2300
2426
  // Since this error is really a copy of the io_s that is checked below as s,
@@ -2371,8 +2497,16 @@ Status CompactionJob::OpenCompactionOutputFile(SubcompactionState* sub_compact,
2371
2497
  return s;
2372
2498
  }
2373
2499
 
2500
+ // Enable hash computation if paranoid_file_checks is on or if
2501
+ // verify_output_flags includes kVerifyIteration, so that
2502
+ // VerifyOutputFiles() can compare the hash of the written data
2503
+ // against a re-read of the output file.
2504
+ bool enable_output_hash =
2505
+ paranoid_file_checks_ ||
2506
+ !!(sub_compact->compaction->mutable_cf_options().verify_output_flags &
2507
+ VerifyOutputFlags::kVerifyIteration);
2374
2508
  outputs.AddOutput(std::move(meta), cfd->internal_comparator(),
2375
- paranoid_file_checks_);
2509
+ enable_output_hash);
2376
2510
  }
2377
2511
 
2378
2512
  writable_file->SetIOPriority(GetRateLimiterPriority());
@@ -2413,7 +2547,7 @@ Status CompactionJob::OpenCompactionOutputFile(SubcompactionState* sub_compact,
2413
2547
 
2414
2548
  void CompactionJob::CleanupCompaction() {
2415
2549
  for (SubcompactionState& sub_compact : compact_->sub_compact_states) {
2416
- sub_compact.Cleanup(table_cache_.get());
2550
+ sub_compact.Cleanup(table_cache_.get(), compact_->status);
2417
2551
  }
2418
2552
  delete compact_;
2419
2553
  compact_ = nullptr;
@@ -2438,6 +2572,32 @@ bool CompactionJob::UpdateInternalStatsFromInputFiles(
2438
2572
  bool has_error = false;
2439
2573
  const ReadOptions read_options(Env::IOActivity::kCompaction);
2440
2574
  const auto& input_table_properties = compaction->GetInputTableProperties();
2575
+
2576
+ // Check all input files for old block-based SST format_version. Why? Old
2577
+ // block-based SST files from roughly version 5.0 to 5.18 could produce
2578
+ // inaccurate num_entries counts due to the evolution of its handling along
2579
+ // with num_range_deletions. We have to disable some paranoid checks when
2580
+ // compacting files from such an old release. However, we don't have great
2581
+ // information to identify those files, so we heuristically over-approximate
2582
+ // that set of files using
2583
+ // (a) format_version < 5, which will be true for any files from RocksDB <
2584
+ // 6.6.0 and should not be true for any recent production files
2585
+ // (b) to avoid including non-block-based SST files (which still use older
2586
+ // format_version markers, and do not support DeleteRange), we also require
2587
+ // the presence of the user property "rocksdb.block.based.table.index.type",
2588
+ // which was added in RocksDB 2.8 and is always present in block-based tables.
2589
+ for (const auto& tp_pair : input_table_properties) {
2590
+ if (tp_pair.second && tp_pair.second->format_version < 5) {
2591
+ // Check for block-based table by looking for its index type property
2592
+ const auto& user_props = tp_pair.second->user_collected_properties;
2593
+ if (user_props.find(BlockBasedTablePropertyNames::kIndexType) !=
2594
+ user_props.end()) {
2595
+ job_stats_->has_accurate_num_input_records = false;
2596
+ break;
2597
+ }
2598
+ }
2599
+ }
2600
+
2441
2601
  for (int input_level = 0;
2442
2602
  input_level < static_cast<int>(compaction->num_input_levels());
2443
2603
  ++input_level) {
@@ -2682,7 +2842,10 @@ Status CompactionJob::ReadTablePropertiesDirectly(
2682
2842
  std::shared_ptr<const TableProperties>* tp) {
2683
2843
  std::unique_ptr<FSRandomAccessFile> file;
2684
2844
  std::string file_name = GetTableFileName(file_meta->fd.GetNumber());
2685
- Status s = ioptions.fs->NewRandomAccessFile(file_name, file_options_, &file,
2845
+ FileOptions fopts = file_options_;
2846
+ fopts.file_checksum = file_meta->file_checksum;
2847
+ fopts.file_checksum_func_name = file_meta->file_checksum_func_name;
2848
+ Status s = ioptions.fs->NewRandomAccessFile(file_name, fopts, &file,
2686
2849
  nullptr /* dbg */);
2687
2850
  if (!s.ok()) {
2688
2851
  return s;
@@ -2776,12 +2939,17 @@ void CompactionJob::RestoreCompactionOutputs(
2776
2939
 
2777
2940
  const auto& output_files = subcompaction_progress_per_level.GetOutputFiles();
2778
2941
 
2942
+ const bool enable_output_hash =
2943
+ paranoid_file_checks_ ||
2944
+ !!(compact_->compaction->mutable_cf_options().verify_output_flags &
2945
+ VerifyOutputFlags::kVerifyIteration);
2946
+
2779
2947
  for (size_t i = 0; i < output_files.size(); i++) {
2780
2948
  FileMetaData file_copy = output_files[i];
2781
2949
 
2782
2950
  outputs_to_restore->AddOutput(std::move(file_copy),
2783
2951
  cfd->internal_comparator(),
2784
- paranoid_file_checks_, true /* finished */);
2952
+ enable_output_hash, true /* finished */);
2785
2953
 
2786
2954
  outputs_to_restore->UpdateTableProperties(
2787
2955
  *output_files_table_properties[i]);
@@ -2804,12 +2972,6 @@ void CompactionJob::RestoreCompactionOutputs(
2804
2972
  // - Status::NotFound(): No valid progress to resume from
2805
2973
  // - Status::Corruption(): Resume key is invalid, beyond input range, or output
2806
2974
  // restoration failed
2807
- // - Other non-OK status: Iterator errors or file system issues during
2808
- // restoration
2809
- //
2810
- // The caller must check for Status::IsIncomplete() to distinguish between
2811
- // "no resume needed" (proceed with `InternalIterator::SeekToFirst()`) vs
2812
- // "resume failed" scenarios.
2813
2975
  Status CompactionJob::MaybeResumeSubcompactionProgressOnInputIterator(
2814
2976
  SubcompactionState* sub_compact, InternalIterator* input_iter) {
2815
2977
  const ReadOptions read_options(Env::IOActivity::kCompaction);
@@ -142,6 +142,9 @@ class SubcompactionState;
142
142
 
143
143
  class CompactionJob {
144
144
  public:
145
+ // Constant false aborted flag, used for compaction service jobs
146
+ static const std::atomic<int> kCompactionAbortedFalse;
147
+
145
148
  CompactionJob(int job_id, Compaction* compaction,
146
149
  const ImmutableDBOptions& db_options,
147
150
  const MutableDBOptions& mutable_db_options,
@@ -157,6 +160,7 @@ class CompactionJob {
157
160
  Env::Priority thread_pri,
158
161
  const std::shared_ptr<IOTracer>& io_tracer,
159
162
  const std::atomic<bool>& manual_compaction_canceled,
163
+ const std::atomic<int>& compaction_aborted,
160
164
  const std::string& db_id = "",
161
165
  const std::string& db_session_id = "",
162
166
  std::string full_history_ts_low = "", std::string trim_ts = "",
@@ -250,6 +254,10 @@ class CompactionJob {
250
254
  // @param num_input_range_del if non-null, will be set to the number of range
251
255
  // deletion entries in this compaction input.
252
256
  //
257
+ // If any input file has potentially unreliable num_entries count (old SST
258
+ // files - details in implementation),
259
+ // job_stats_->has_accurate_num_input_records is set to false.
260
+ //
253
261
  // Returns true iff internal_stats_.output_level_stats.num_input_records and
254
262
  // num_input_range_del are calculated successfully.
255
263
  //
@@ -299,6 +307,7 @@ class CompactionJob {
299
307
  void RunSubcompactions();
300
308
  void UpdateTimingStats(uint64_t start_micros);
301
309
  void RemoveEmptyOutputs();
310
+ void CleanupAbortedSubcompactions();
302
311
  bool HasNewBlobFiles() const;
303
312
  Status CollectSubcompactionErrors();
304
313
  Status SyncOutputDirectories();
@@ -363,11 +372,6 @@ class CompactionJob {
363
372
  std::unique_ptr<InternalIterator> trim_history_iter;
364
373
  };
365
374
 
366
- struct BlobFileResources {
367
- std::vector<std::string> blob_file_paths;
368
- std::unique_ptr<BlobFileBuilder> blob_file_builder;
369
- };
370
-
371
375
  bool ShouldUseLocalCompaction(SubcompactionState* sub_compact);
372
376
  CompactionIOStatsSnapshot InitializeIOStats();
373
377
  Status SetupAndValidateCompactionFilter(
@@ -382,14 +386,14 @@ class CompactionJob {
382
386
  SubcompactionState* sub_compact, ColumnFamilyData* cfd,
383
387
  SubcompactionInternalIterators& iterators,
384
388
  SubcompactionKeyBoundaries& boundaries, ReadOptions& read_options);
385
- void CreateBlobFileBuilder(SubcompactionState* sub_compact,
386
- ColumnFamilyData* cfd,
387
- BlobFileResources& blob_resources,
388
- const WriteOptions& write_options);
389
+ void CreateBlobFileBuilder(
390
+ SubcompactionState* sub_compact, ColumnFamilyData* cfd,
391
+ std::unique_ptr<BlobFileBuilder>& blob_file_builder,
392
+ const WriteOptions& write_options);
389
393
  std::unique_ptr<CompactionIterator> CreateCompactionIterator(
390
394
  SubcompactionState* sub_compact, ColumnFamilyData* cfd,
391
395
  InternalIterator* input_iter, const CompactionFilter* compaction_filter,
392
- MergeHelper& merge, BlobFileResources& blob_resources,
396
+ MergeHelper& merge, std::unique_ptr<BlobFileBuilder>& blob_file_builder,
393
397
  const WriteOptions& write_options);
394
398
  std::pair<CompactionFileOpenFunc, CompactionFileCloseFunc> CreateFileHandlers(
395
399
  SubcompactionState* sub_compact, SubcompactionKeyBoundaries& boundaries);
@@ -461,6 +465,7 @@ class CompactionJob {
461
465
  VersionSet* versions_;
462
466
  const std::atomic<bool>* shutting_down_;
463
467
  const std::atomic<bool>& manual_compaction_canceled_;
468
+ const std::atomic<int>& compaction_aborted_;
464
469
  FSDirectory* db_directory_;
465
470
  FSDirectory* blob_output_directory_;
466
471
  InstrumentedMutex* db_mutex_;
@@ -82,7 +82,7 @@ class CompactionJobStatsTest : public testing::Test,
82
82
  std::string dbname_;
83
83
  std::string alternative_wal_dir_;
84
84
  Env* env_;
85
- DB* db_;
85
+ std::unique_ptr<DB> db_;
86
86
  std::vector<ColumnFamilyHandle*> handles_;
87
87
  uint32_t max_subcompactions_;
88
88
 
@@ -123,7 +123,7 @@ class CompactionJobStatsTest : public testing::Test,
123
123
  static void SetUpTestCase() {}
124
124
  static void TearDownTestCase() {}
125
125
 
126
- DBImpl* dbfull() { return static_cast_with_check<DBImpl>(db_); }
126
+ DBImpl* dbfull() { return static_cast_with_check<DBImpl>(db_.get()); }
127
127
 
128
128
  void CreateColumnFamilies(const std::vector<std::string>& cfs,
129
129
  const Options& options) {
@@ -162,7 +162,8 @@ class CompactionJobStatsTest : public testing::Test,
162
162
  column_families.emplace_back(cfs[i], options[i]);
163
163
  }
164
164
  DBOptions db_opts = DBOptions(options[0]);
165
- return DB::Open(db_opts, dbname_, column_families, &handles_, &db_);
165
+ auto s = DB::Open(db_opts, dbname_, column_families, &handles_, &db_);
166
+ return s;
166
167
  }
167
168
 
168
169
  Status TryReopenWithColumnFamilies(const std::vector<std::string>& cfs,
@@ -179,8 +180,7 @@ class CompactionJobStatsTest : public testing::Test,
179
180
  delete h;
180
181
  }
181
182
  handles_.clear();
182
- delete db_;
183
- db_ = nullptr;
183
+ db_.reset();
184
184
  }
185
185
 
186
186
  void DestroyAndReopen(const Options& options) {
@@ -743,7 +743,7 @@ TEST_P(CompactionJobStatsTest, CompactionJobStatsTest) {
743
743
  }
744
744
 
745
745
  ASSERT_OK(Flush(1));
746
- ASSERT_OK(static_cast_with_check<DBImpl>(db_)->TEST_WaitForCompact());
746
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
747
747
 
748
748
  stats_checker->set_verify_next_comp_io_stats(true);
749
749
  std::atomic<bool> first_prepare_write(true);
@@ -944,7 +944,7 @@ TEST_P(CompactionJobStatsTest, UniversalCompactionTest) {
944
944
  start_key += key_base) {
945
945
  MakeTableWithKeyValues(&rnd, start_key, start_key + key_base - 1, kKeySize,
946
946
  kValueSize, key_interval, compression_ratio, 1);
947
- ASSERT_OK(static_cast_with_check<DBImpl>(db_)->TEST_WaitForCompact());
947
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
948
948
  }
949
949
  ASSERT_EQ(stats_checker->NumberOfUnverifiedStats(), 0U);
950
950
  }