@nxtedition/rocksdb 15.4.1 → 15.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/binding.cc +24 -15
  2. package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
  3. package/deps/rocksdb/rocksdb/BUCK +42 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
  5. package/deps/rocksdb/rocksdb/Makefile +59 -32
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
  8. package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
  11. package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
  17. package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
  24. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
  26. package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
  27. package/deps/rocksdb/rocksdb/db/builder.h +7 -0
  28. package/deps/rocksdb/rocksdb/db/c.cc +373 -57
  29. package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
  51. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
  52. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
  54. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
  55. package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
  57. package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
  58. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
  59. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
  60. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
  61. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
  62. package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
  63. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
  64. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
  65. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
  66. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
  79. package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
  80. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
  81. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
  82. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
  83. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
  84. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
  85. package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
  86. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
  87. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
  89. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
  90. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
  91. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
  92. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
  93. package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
  94. package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
  95. package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
  96. package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
  97. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
  98. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
  99. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
  100. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
  101. package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
  102. package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
  103. package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
  104. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
  105. package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
  108. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
  109. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
  111. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
  112. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
  113. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
  114. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
  115. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  116. package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
  117. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
  118. package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
  119. package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
  120. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
  121. package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
  122. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
  123. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  124. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
  125. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
  126. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
  127. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
  128. package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
  129. package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
  130. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
  131. package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
  132. package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
  133. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
  134. package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
  135. package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
  136. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
  137. package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
  138. package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
  139. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
  140. package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
  141. package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
  142. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
  143. package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
  144. package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
  145. package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
  146. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
  147. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
  148. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
  149. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
  150. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
  151. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
  159. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
  160. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
  161. package/deps/rocksdb/rocksdb/env/env.cc +1 -0
  162. package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
  163. package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
  164. package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
  165. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  166. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
  167. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
  168. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
  169. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
  170. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
  171. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  172. package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
  173. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
  174. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
  175. package/deps/rocksdb/rocksdb/folly.mk +22 -5
  176. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
  177. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
  178. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
  179. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
  180. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
  181. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
  182. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
  183. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
  186. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
  187. package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
  188. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
  192. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
  193. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
  194. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
  198. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
  200. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
  202. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
  203. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
  204. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
  205. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
  206. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
  207. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
  208. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
  209. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
  210. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  211. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
  212. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
  213. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
  214. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
  215. package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
  216. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
  217. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
  218. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
  219. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
  220. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
  221. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
  222. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
  223. package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
  224. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  225. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
  226. package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
  227. package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
  228. package/deps/rocksdb/rocksdb/options/options.cc +5 -1
  229. package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
  230. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
  231. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
  232. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
  233. package/deps/rocksdb/rocksdb/port/lang.h +4 -0
  234. package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
  235. package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
  236. package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
  237. package/deps/rocksdb/rocksdb/src.mk +12 -0
  238. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
  239. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  240. package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
  241. package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
  247. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
  248. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
  249. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
  250. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
  251. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
  252. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
  253. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
  254. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
  255. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
  256. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
  258. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  259. package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
  260. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
  261. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
  262. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
  263. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
  264. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
  265. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
  266. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
  267. package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
  268. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
  269. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
  271. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
  272. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
  273. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
  274. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
  275. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
  276. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
  277. package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
  278. package/deps/rocksdb/rocksdb/table/format.cc +27 -15
  279. package/deps/rocksdb/rocksdb/table/format.h +41 -15
  280. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
  281. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
  282. package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
  283. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
  284. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  285. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
  286. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
  287. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
  288. package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
  289. package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
  290. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
  291. package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
  292. package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
  293. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
  294. package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
  295. package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
  296. package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
  297. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
  298. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
  299. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
  300. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
  301. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
  302. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
  303. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
  304. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
  305. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
  306. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
  307. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
  308. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
  309. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
  310. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
  311. package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
  312. package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
  313. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
  314. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
  315. package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
  316. package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
  317. package/deps/rocksdb/rocksdb/util/coding.h +14 -27
  318. package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
  319. package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
  320. package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
  321. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
  323. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
  324. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
  325. package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
  326. package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
  327. package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
  328. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
  329. package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
  330. package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
  331. package/deps/rocksdb/rocksdb/util/math.h +3 -1
  332. package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
  333. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
  334. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
  335. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
  336. package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
  337. package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
  338. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
  339. package/deps/rocksdb/rocksdb/util/status.cc +3 -1
  340. package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
  341. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
  342. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
  343. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
  344. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
  345. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
  346. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
  347. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
  348. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
  349. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
  350. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
  351. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
  352. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
  353. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
  354. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
  355. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
  356. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
  357. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
  358. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  359. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
  360. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
  361. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
  362. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
  363. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
  364. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
  365. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
  366. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
  367. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
  368. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
  369. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
  370. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
  372. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
  374. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
  375. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
  376. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  377. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
  378. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
  379. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
  380. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
  381. package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
  382. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
  383. package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
  384. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
  385. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
  386. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
  387. package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
  388. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
  389. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  390. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  391. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
  392. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
  393. package/deps/rocksdb/rocksdb.gyp +7 -0
  394. package/iterator.js +2 -2
  395. package/package.json +1 -1
  396. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  397. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -56,7 +56,8 @@ class GenerateLevelFilesBriefTest : public testing::Test {
56
56
  kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
57
57
  kUnknownFileCreationTime, kUnknownEpochNumber, kUnknownFileChecksum,
58
58
  kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0, 0,
59
- /* user_defined_timestamps_persisted */ true);
59
+ /* user_defined_timestamps_persisted */ true, /* min timestamp */ "",
60
+ /* max timestamp */ "");
60
61
  files_.push_back(f);
61
62
  }
62
63
 
@@ -172,7 +173,8 @@ class VersionStorageInfoTestBase : public testing::Test {
172
173
  kUnknownOldestAncesterTime, kUnknownFileCreationTime,
173
174
  kUnknownEpochNumber, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
174
175
  kNullUniqueId64x2, compensated_range_deletion_size, 0,
175
- /* user_defined_timestamps_persisted */ true);
176
+ /* user_defined_timestamps_persisted */ true, /* min timestamp */ "",
177
+ /* max timestamp */ "");
176
178
  vstorage_.AddFile(level, f);
177
179
  }
178
180
 
@@ -391,7 +393,8 @@ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_1) {
391
393
  ASSERT_EQ(51450U, vstorage_.MaxBytesForLevel(3));
392
394
  ASSERT_EQ(257250U, vstorage_.MaxBytesForLevel(4));
393
395
 
394
- vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_);
396
+ vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_,
397
+ /*full_history_ts_low=*/"");
395
398
  // Only L0 hits compaction.
396
399
  ASSERT_EQ(vstorage_.CompactionScoreLevel(0), 0);
397
400
  }
@@ -421,7 +424,8 @@ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_2) {
421
424
  ASSERT_EQ(51450U, vstorage_.MaxBytesForLevel(3));
422
425
  ASSERT_EQ(257250U, vstorage_.MaxBytesForLevel(4));
423
426
 
424
- vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_);
427
+ vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_,
428
+ /*full_history_ts_low=*/"");
425
429
  // Although L2 and l3 have higher unadjusted compaction score, considering
426
430
  // a relatively large L0 being compacted down soon, L4 is picked up for
427
431
  // compaction.
@@ -453,7 +457,8 @@ TEST_F(VersionStorageInfoTest, MaxBytesForLevelDynamicWithLargeL0_3) {
453
457
  ASSERT_EQ(2, vstorage_.base_level());
454
458
  ASSERT_EQ(20000U, vstorage_.MaxBytesForLevel(2));
455
459
 
456
- vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_);
460
+ vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_,
461
+ /*full_history_ts_low=*/"");
457
462
  // Although L2 has higher unadjusted compaction score, considering
458
463
  // a relatively large L0 being compacted down soon, L3 is picked up for
459
464
  // compaction.
@@ -483,7 +488,8 @@ TEST_F(VersionStorageInfoTest, DrainUnnecessaryLevel) {
483
488
  ASSERT_EQ(1, vstorage_.base_level());
484
489
  ASSERT_EQ(1000, vstorage_.MaxBytesForLevel(1));
485
490
  ASSERT_EQ(10100, vstorage_.MaxBytesForLevel(3));
486
- vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_);
491
+ vstorage_.ComputeCompactionScore(ioptions_, mutable_cf_options_,
492
+ /*full_history_ts_low=*/"");
487
493
 
488
494
  // Tests that levels 1 and 3 are eligible for compaction.
489
495
  // Levels 1 and 3 are much smaller than target size,
@@ -1222,11 +1228,12 @@ class VersionSetTestBase {
1222
1228
  SetIdentityFile(WriteOptions(), env_, dbname_, Temperature::kUnknown));
1223
1229
  VersionEdit new_db;
1224
1230
  if (imm_db_options_.write_dbid_to_manifest) {
1225
- DBOptions tmp_db_options;
1226
- tmp_db_options.env = env_;
1227
- std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
1228
1231
  std::string db_id;
1229
- ASSERT_OK(impl->GetDbIdentityFromIdentityFile(IOOptions(), &db_id));
1232
+ ASSERT_OK(ReadFileToString(env_, IdentityFileName(dbname_), &db_id));
1233
+ // Strip trailing newline if present (old GenerateUniqueId format)
1234
+ if (!db_id.empty() && db_id.back() == '\n') {
1235
+ db_id.pop_back();
1236
+ }
1230
1237
  new_db.SetDBId(db_id);
1231
1238
  }
1232
1239
  new_db.SetLogNumber(0);
@@ -1346,7 +1353,8 @@ class VersionSetTestBase {
1346
1353
  Temperature::kUnknown, info.oldest_blob_file_number, 0, 0,
1347
1354
  info.epoch_number, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
1348
1355
  kNullUniqueId64x2, 0, 0,
1349
- /* user_defined_timestamps_persisted */ true);
1356
+ /* user_defined_timestamps_persisted */ true, /* min timestamp */ "",
1357
+ /* max timestamp */ "");
1350
1358
  if (info.file_missing) {
1351
1359
  ASSERT_OK(fs_->DeleteFile(fname, IOOptions(), nullptr));
1352
1360
  }
@@ -2400,6 +2408,267 @@ TEST_F(VersionSetTest, ManifestTruncateAfterClose) {
2400
2408
  ReopenDB();
2401
2409
  }
2402
2410
 
2411
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseClean) {
2412
+ // Enable content validation, perform normal operations, close.
2413
+ // Verify no manifest rotation (file number unchanged).
2414
+ NewDB();
2415
+ mutable_db_options_.verify_manifest_content_on_close = true;
2416
+ mutex_.Lock();
2417
+ versions_->UpdatedMutableDbOptions(mutable_db_options_, &mutex_);
2418
+ mutex_.Unlock();
2419
+
2420
+ VersionEdit edit;
2421
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2422
+
2423
+ std::string manifest_path_before;
2424
+ GetManifestPath(&manifest_path_before);
2425
+
2426
+ bool content_validation_ran = false;
2427
+ SyncPoint::GetInstance()->DisableProcessing();
2428
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2429
+ SyncPoint::GetInstance()->SetCallBack(
2430
+ "VersionSet::Close:BeforeContentValidation",
2431
+ [&](void*) { content_validation_ran = true; });
2432
+ SyncPoint::GetInstance()->EnableProcessing();
2433
+ CloseDB();
2434
+ SyncPoint::GetInstance()->DisableProcessing();
2435
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2436
+
2437
+ // Verify content validation actually ran
2438
+ ASSERT_TRUE(content_validation_ran);
2439
+
2440
+ // Manifest path should be unchanged (no rotation)
2441
+ std::string manifest_path_after;
2442
+ uint64_t manifest_file_number = 0;
2443
+ ASSERT_OK(GetCurrentManifestPath(dbname_, fs_.get(), /*is_retry=*/false,
2444
+ &manifest_path_after,
2445
+ &manifest_file_number));
2446
+ ASSERT_EQ(manifest_path_before, manifest_path_after);
2447
+
2448
+ ReopenDB();
2449
+ }
2450
+
2451
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseCorruptRecord) {
2452
+ // Enable content validation, corrupt the manifest after closing the writer,
2453
+ // verify manifest rotation occurs and DB reopens cleanly.
2454
+ NewDB();
2455
+ mutable_db_options_.verify_manifest_content_on_close = true;
2456
+ mutex_.Lock();
2457
+ versions_->UpdatedMutableDbOptions(mutable_db_options_, &mutex_);
2458
+ mutex_.Unlock();
2459
+
2460
+ VersionEdit edit;
2461
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2462
+
2463
+ std::string manifest_path_before;
2464
+ GetManifestPath(&manifest_path_before);
2465
+
2466
+ SyncPoint::GetInstance()->DisableProcessing();
2467
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2468
+ SyncPoint::GetInstance()->SetCallBack(
2469
+ "VersionSet::Close:BeforeContentValidation", [&](void*) {
2470
+ // Corrupt bytes in the middle of the manifest
2471
+ std::string manifest_path;
2472
+ GetManifestPath(&manifest_path);
2473
+ std::string content;
2474
+ Status s = ReadFileToString(env_, manifest_path, &content);
2475
+ EXPECT_OK(s);
2476
+ if (!s.ok()) {
2477
+ return;
2478
+ }
2479
+ ASSERT_GT(content.size(), 20u);
2480
+ // Corrupt several bytes in the middle to break CRC
2481
+ for (size_t i = content.size() / 2; i < content.size() / 2 + 8; i++) {
2482
+ content[i] ^= 0xFF;
2483
+ }
2484
+ s = WriteStringToFile(env_, content, manifest_path);
2485
+ EXPECT_OK(s);
2486
+ });
2487
+ SyncPoint::GetInstance()->EnableProcessing();
2488
+ CloseDB();
2489
+ SyncPoint::GetInstance()->DisableProcessing();
2490
+
2491
+ // Manifest should have been rotated (new file number)
2492
+ std::string manifest_path_after;
2493
+ uint64_t manifest_file_number = 0;
2494
+ ASSERT_OK(GetCurrentManifestPath(dbname_, fs_.get(), /*is_retry=*/false,
2495
+ &manifest_path_after,
2496
+ &manifest_file_number));
2497
+ ASSERT_NE(manifest_path_before, manifest_path_after);
2498
+
2499
+ // DB should reopen cleanly with the fresh manifest
2500
+ ReopenDB();
2501
+ }
2502
+
2503
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseDisabled) {
2504
+ // Default (option disabled), corrupt manifest after writer close,
2505
+ // verify no rotation occurred — corrupt manifest persists.
2506
+ NewDB();
2507
+ // verify_manifest_content_on_close defaults to false
2508
+
2509
+ VersionEdit edit;
2510
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2511
+
2512
+ std::string manifest_path_before;
2513
+ GetManifestPath(&manifest_path_before);
2514
+
2515
+ bool content_validation_ran = false;
2516
+ SyncPoint::GetInstance()->DisableProcessing();
2517
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2518
+ SyncPoint::GetInstance()->SetCallBack(
2519
+ "VersionSet::Close:BeforeContentValidation",
2520
+ [&](void*) { content_validation_ran = true; });
2521
+ SyncPoint::GetInstance()->EnableProcessing();
2522
+ CloseDB();
2523
+ SyncPoint::GetInstance()->DisableProcessing();
2524
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2525
+
2526
+ ASSERT_FALSE(content_validation_ran);
2527
+
2528
+ // Manifest path should be unchanged (no rotation since validation is off)
2529
+ std::string manifest_path_after;
2530
+ uint64_t manifest_file_number = 0;
2531
+ ASSERT_OK(GetCurrentManifestPath(dbname_, fs_.get(), /*is_retry=*/false,
2532
+ &manifest_path_after,
2533
+ &manifest_file_number));
2534
+ ASSERT_EQ(manifest_path_before, manifest_path_after);
2535
+ }
2536
+
2537
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseSizeCheckFails) {
2538
+ // Truncate manifest so size check fails first.
2539
+ // Verify recovery happens via size-check path. Content validation still
2540
+ // runs afterward on the freshly rewritten manifest.
2541
+ NewDB();
2542
+ mutable_db_options_.verify_manifest_content_on_close = true;
2543
+ mutex_.Lock();
2544
+ versions_->UpdatedMutableDbOptions(mutable_db_options_, &mutex_);
2545
+ mutex_.Unlock();
2546
+
2547
+ VersionEdit edit;
2548
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2549
+
2550
+ std::string manifest_path_before;
2551
+ GetManifestPath(&manifest_path_before);
2552
+
2553
+ SyncPoint::GetInstance()->DisableProcessing();
2554
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2555
+ SyncPoint::GetInstance()->SetCallBack(
2556
+ "VersionSet::Close:AfterClose", [&](void*) {
2557
+ std::string manifest_path;
2558
+ GetManifestPath(&manifest_path);
2559
+ std::unique_ptr<WritableFile> manifest_file;
2560
+ ASSERT_OK(env_->ReopenWritableFile(manifest_path, &manifest_file,
2561
+ EnvOptions()));
2562
+ ASSERT_OK(manifest_file->Truncate(0));
2563
+ ASSERT_OK(manifest_file->Close());
2564
+ });
2565
+ SyncPoint::GetInstance()->EnableProcessing();
2566
+ ASSERT_NO_FATAL_FAILURE(CloseDB());
2567
+ SyncPoint::GetInstance()->DisableProcessing();
2568
+
2569
+ // Size check should have triggered rotation
2570
+ std::string manifest_path_after;
2571
+ uint64_t manifest_file_number = 0;
2572
+ ASSERT_OK(GetCurrentManifestPath(dbname_, fs_.get(), /*is_retry=*/false,
2573
+ &manifest_path_after,
2574
+ &manifest_file_number));
2575
+ ASSERT_NE(manifest_path_before, manifest_path_after);
2576
+
2577
+ // DB should reopen cleanly
2578
+ ReopenDB();
2579
+ }
2580
+
2581
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseCorruptAfterRewrite) {
2582
+ // Corrupt the manifest before content validation AND after the rewrite.
2583
+ // The loop should detect corruption twice: once triggering a rewrite, and
2584
+ // once reporting that the rewritten manifest is also corrupt.
2585
+ NewDB();
2586
+ mutable_db_options_.verify_manifest_content_on_close = true;
2587
+ mutex_.Lock();
2588
+ versions_->UpdatedMutableDbOptions(mutable_db_options_, &mutex_);
2589
+ mutex_.Unlock();
2590
+
2591
+ VersionEdit edit;
2592
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2593
+
2594
+ int io_error_count = 0;
2595
+ class IOErrorCountListener : public EventListener {
2596
+ public:
2597
+ int* count;
2598
+ explicit IOErrorCountListener(int* c) : count(c) {}
2599
+ void OnIOError(const IOErrorInfo& /*info*/) override { ++(*count); }
2600
+ };
2601
+ imm_db_options_.listeners.push_back(
2602
+ std::make_shared<IOErrorCountListener>(&io_error_count));
2603
+
2604
+ auto corrupt_current_manifest = [&]() {
2605
+ std::string manifest_path;
2606
+ GetManifestPath(&manifest_path);
2607
+ std::string content;
2608
+ ASSERT_OK(ReadFileToString(env_, manifest_path, &content));
2609
+ ASSERT_GT(content.size(), 20u);
2610
+ for (size_t i = content.size() / 2; i < content.size() / 2 + 8; i++) {
2611
+ content[i] ^= 0xFF;
2612
+ }
2613
+ ASSERT_OK(WriteStringToFile(env_, content, manifest_path));
2614
+ };
2615
+
2616
+ SyncPoint::GetInstance()->DisableProcessing();
2617
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2618
+ // Corrupt before the first content check
2619
+ SyncPoint::GetInstance()->SetCallBack(
2620
+ "VersionSet::Close:BeforeContentValidation",
2621
+ [&](void*) { corrupt_current_manifest(); });
2622
+ // Corrupt again after the rewrite completes
2623
+ SyncPoint::GetInstance()->SetCallBack(
2624
+ "VersionSet::LogAndApply:WriteManifestDone",
2625
+ [&](void*) { corrupt_current_manifest(); });
2626
+ SyncPoint::GetInstance()->EnableProcessing();
2627
+ mutex_.Lock();
2628
+ Status close_s = versions_->Close(nullptr, &mutex_);
2629
+ versions_.reset();
2630
+ mutex_.Unlock();
2631
+ SyncPoint::GetInstance()->DisableProcessing();
2632
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2633
+
2634
+ // Close should report the persistent corruption
2635
+ ASSERT_TRUE(close_s.IsCorruption()) << close_s.ToString();
2636
+
2637
+ // OnIOError should have fired twice (once per corrupt detection)
2638
+ ASSERT_EQ(io_error_count, 2);
2639
+ }
2640
+
2641
+ TEST_F(VersionSetTest, ManifestContentValidationOnCloseOpenFails) {
2642
+ // Delete the manifest before content validation so it can't be opened.
2643
+ // Close() should surface the I/O error to the caller.
2644
+ NewDB();
2645
+ mutable_db_options_.verify_manifest_content_on_close = true;
2646
+ mutex_.Lock();
2647
+ versions_->UpdatedMutableDbOptions(mutable_db_options_, &mutex_);
2648
+ mutex_.Unlock();
2649
+
2650
+ VersionEdit edit;
2651
+ ASSERT_OK(LogAndApplyToDefaultCF(edit));
2652
+
2653
+ SyncPoint::GetInstance()->DisableProcessing();
2654
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2655
+ SyncPoint::GetInstance()->SetCallBack(
2656
+ "VersionSet::Close:BeforeContentValidation", [&](void*) {
2657
+ std::string manifest_path;
2658
+ GetManifestPath(&manifest_path);
2659
+ ASSERT_OK(env_->DeleteFile(manifest_path));
2660
+ });
2661
+ SyncPoint::GetInstance()->EnableProcessing();
2662
+ mutex_.Lock();
2663
+ Status close_s = versions_->Close(nullptr, &mutex_);
2664
+ versions_.reset();
2665
+ mutex_.Unlock();
2666
+ SyncPoint::GetInstance()->DisableProcessing();
2667
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2668
+
2669
+ ASSERT_TRUE(close_s.IsIOError()) << close_s.ToString();
2670
+ }
2671
+
2403
2672
  TEST_F(VersionStorageInfoTest, AddRangeDeletionCompensatedFileSize) {
2404
2673
  // Tests that compensated range deletion size is added to compensated file
2405
2674
  // size.
@@ -3505,11 +3774,12 @@ class VersionSetTestEmptyDb
3505
3774
  if (imm_db_options_.write_dbid_to_manifest) {
3506
3775
  ASSERT_OK(SetIdentityFile(WriteOptions(), env_, dbname_,
3507
3776
  Temperature::kUnknown));
3508
- DBOptions tmp_db_options;
3509
- tmp_db_options.env = env_;
3510
- std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
3511
3777
  std::string db_id;
3512
- ASSERT_OK(impl->GetDbIdentityFromIdentityFile(IOOptions(), &db_id));
3778
+ ASSERT_OK(ReadFileToString(env_, IdentityFileName(dbname_), &db_id));
3779
+ // Strip trailing newline if present (old GenerateUniqueId format)
3780
+ if (!db_id.empty() && db_id.back() == '\n') {
3781
+ db_id.pop_back();
3782
+ }
3513
3783
  new_db.SetDBId(db_id);
3514
3784
  }
3515
3785
  const std::string manifest_path = DescriptorFileName(dbname_, 1);
@@ -3831,11 +4101,12 @@ class VersionSetTestMissingFiles : public VersionSetTestBase,
3831
4101
  log_writer->reset(new log::Writer(std::move(file_writer), 0, false));
3832
4102
  VersionEdit new_db;
3833
4103
  if (imm_db_options_.write_dbid_to_manifest) {
3834
- DBOptions tmp_db_options;
3835
- tmp_db_options.env = env_;
3836
- std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
3837
4104
  std::string db_id;
3838
- ASSERT_OK(impl->GetDbIdentityFromIdentityFile(IOOptions(), &db_id));
4105
+ ASSERT_OK(ReadFileToString(env_, IdentityFileName(dbname_), &db_id));
4106
+ // Strip trailing newline if present (old GenerateUniqueId format)
4107
+ if (!db_id.empty() && db_id.back() == '\n') {
4108
+ db_id.pop_back();
4109
+ }
3839
4110
  new_db.SetDBId(db_id);
3840
4111
  }
3841
4112
  {
@@ -3940,7 +4211,8 @@ TEST_F(VersionSetTestMissingFiles, ManifestFarBehindSst) {
3940
4211
  largest_ikey, 0, 0, false, Temperature::kUnknown, 0, 0, 0,
3941
4212
  file_num /* epoch_number */, kUnknownFileChecksum,
3942
4213
  kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0, 0,
3943
- /* user_defined_timestamps_persisted */ true);
4214
+ /* user_defined_timestamps_persisted */ true, /* min timestamp */ "",
4215
+ /* max timestamp */ "");
3944
4216
  added_files.emplace_back(0, meta);
3945
4217
  }
3946
4218
  WriteFileAdditionAndDeletionToManifest(
@@ -4001,7 +4273,8 @@ TEST_F(VersionSetTestMissingFiles, ManifestAheadofSst) {
4001
4273
  largest_ikey, 0, 0, false, Temperature::kUnknown, 0, 0, 0,
4002
4274
  file_num /* epoch_number */, kUnknownFileChecksum,
4003
4275
  kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0, 0,
4004
- /* user_defined_timestamps_persisted */ true);
4276
+ /* user_defined_timestamps_persisted */ true, /* min timestamp */ "",
4277
+ /* max timestamp */ "");
4005
4278
  added_files.emplace_back(0, meta);
4006
4279
  }
4007
4280
  WriteFileAdditionAndDeletionToManifest(
@@ -0,0 +1,96 @@
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 "db/version_util.h"
7
+
8
+ #include <atomic>
9
+ #include <functional>
10
+ #include <thread>
11
+ #include <utility>
12
+ #include <vector>
13
+
14
+ #include "db/internal_stats.h"
15
+ #include "db/table_cache.h"
16
+ #include "port/port.h"
17
+ #include "test_util/sync_point.h"
18
+
19
+ namespace ROCKSDB_NAMESPACE {
20
+
21
+ Status LoadTableHandlersHelper(
22
+ const std::vector<std::pair<FileMetaData*, int>>& files_meta,
23
+ TableCache* table_cache, const FileOptions& file_options,
24
+ const InternalKeyComparator& internal_comparator,
25
+ InternalStats* internal_stats, int max_threads,
26
+ bool prefetch_index_and_filter_in_cache,
27
+ const MutableCFOptions& mutable_cf_options,
28
+ size_t max_file_size_for_l0_meta_pin, const ReadOptions& read_options,
29
+ std::atomic<bool>* stop) {
30
+ assert(table_cache != nullptr);
31
+
32
+ std::atomic<size_t> next_file_meta_idx(0);
33
+ std::atomic<bool> has_error(false);
34
+ Status ret;
35
+ std::function<void()> load_handlers_func([&]() {
36
+ while (true) {
37
+ size_t file_idx = next_file_meta_idx.fetch_add(1);
38
+
39
+ if (has_error.load(std::memory_order_relaxed)) {
40
+ break;
41
+ }
42
+
43
+ if (file_idx >= files_meta.size()) {
44
+ break;
45
+ }
46
+
47
+ if (stop != nullptr && stop->load()) {
48
+ break;
49
+ }
50
+
51
+ auto* cache = table_cache->get_cache().get();
52
+ if (cache->GetCapacity() < TableCache::kInfiniteCapacity &&
53
+ cache->GetUsage() >= cache->GetCapacity()) {
54
+ break;
55
+ }
56
+
57
+ auto* file_meta = files_meta[file_idx].first;
58
+ int level = files_meta[file_idx].second;
59
+
60
+ TEST_SYNC_POINT_CALLBACK(
61
+ "VersionBuilder::Rep::LoadTableHandlers::BeforeFindTable", file_meta);
62
+
63
+ TableCache::TypedHandle* handle = nullptr;
64
+ TableReader* table_reader = nullptr;
65
+ auto status = table_cache->FindTable(
66
+ read_options, file_options, internal_comparator, *file_meta, &handle,
67
+ mutable_cf_options, &table_reader, false /* no_io */,
68
+ internal_stats->GetFileReadHist(level), false /* skip_filters */,
69
+ level, prefetch_index_and_filter_in_cache,
70
+ max_file_size_for_l0_meta_pin, file_meta->temperature,
71
+ true /* pin_table_handle */);
72
+
73
+ TEST_SYNC_POINT_CALLBACK(
74
+ "VersionBuilder::Rep::LoadTableHandlers::AfterFindTable", &status);
75
+
76
+ if (!status.ok()) {
77
+ bool expected = false;
78
+ if (has_error.compare_exchange_strong(expected, true)) {
79
+ ret = status;
80
+ }
81
+ }
82
+ }
83
+ });
84
+
85
+ std::vector<port::Thread> threads;
86
+ for (int i = 1; i < max_threads; i++) {
87
+ threads.emplace_back(load_handlers_func);
88
+ }
89
+ load_handlers_func();
90
+ for (auto& t : threads) {
91
+ t.join();
92
+ }
93
+ return ret;
94
+ }
95
+
96
+ } // namespace ROCKSDB_NAMESPACE
@@ -5,10 +5,34 @@
5
5
 
6
6
  #pragma once
7
7
 
8
+ #include <atomic>
9
+ #include <utility>
10
+ #include <vector>
11
+
8
12
  #include "db/version_set.h"
13
+ #include "rocksdb/file_system.h"
14
+ #include "rocksdb/options.h"
15
+ #include "rocksdb/status.h"
9
16
 
10
17
  namespace ROCKSDB_NAMESPACE {
11
18
 
19
+ class TableCache;
20
+ struct FileMetaData;
21
+ class InternalKeyComparator;
22
+ class InternalStats;
23
+
24
+ // Load table handlers (i.e., open SST files and populate the table cache) for
25
+ // the given set of files. Used during DB open to eagerly warm the table cache.
26
+ Status LoadTableHandlersHelper(
27
+ const std::vector<std::pair<FileMetaData*, int>>& files_meta,
28
+ TableCache* table_cache, const FileOptions& file_options,
29
+ const InternalKeyComparator& internal_comparator,
30
+ InternalStats* internal_stats, int max_threads,
31
+ bool prefetch_index_and_filter_in_cache,
32
+ const MutableCFOptions& mutable_cf_options,
33
+ size_t max_file_size_for_l0_meta_pin, const ReadOptions& read_options,
34
+ std::atomic<bool>* stop = nullptr);
35
+
12
36
  // Instead of opening a `DB` to perform certain manifest updates, this
13
37
  // uses the underlying `VersionSet` API to read and modify the MANIFEST. This
14
38
  // allows us to use the user's real options, while not having to worry about
@@ -714,7 +714,7 @@ TEST_F(DBWideBasicTest, MergePlainKeyValue) {
714
714
  // snapshot in between to make sure they do not get reconciled during the
715
715
  // subsequent flush)
716
716
  write_base();
717
- ManagedSnapshot snapshot(db_);
717
+ ManagedSnapshot snapshot(db_.get());
718
718
  write_merge();
719
719
  verify();
720
720
 
@@ -958,7 +958,7 @@ TEST_F(DBWideBasicTest, MergeEntity) {
958
958
  // between to make sure they do not get reconciled during the subsequent
959
959
  // flush)
960
960
  write_base();
961
- ManagedSnapshot snapshot(db_);
961
+ ManagedSnapshot snapshot(db_.get());
962
962
  write_merge();
963
963
  verify_basic();
964
964
  verify_merge_ops_pre_compaction();
@@ -1033,7 +1033,7 @@ class DBWideMergeV3Test : public DBWideBasicTest {
1033
1033
  third_key,
1034
1034
  third_columns)); // wide-column base value
1035
1035
 
1036
- snapshots_.emplace_back(db_);
1036
+ snapshots_.emplace_back(db_.get());
1037
1037
 
1038
1038
  // First round of merge operands
1039
1039
  ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), first_key,
@@ -1043,7 +1043,7 @@ class DBWideMergeV3Test : public DBWideBasicTest {
1043
1043
  ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), third_key,
1044
1044
  third_merge_op1));
1045
1045
 
1046
- snapshots_.emplace_back(db_);
1046
+ snapshots_.emplace_back(db_.get());
1047
1047
 
1048
1048
  // Second round of merge operands
1049
1049
  ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), first_key,
@@ -1053,7 +1053,7 @@ class DBWideMergeV3Test : public DBWideBasicTest {
1053
1053
  ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), third_key,
1054
1054
  third_merge_op2));
1055
1055
 
1056
- snapshots_.emplace_back(db_);
1056
+ snapshots_.emplace_back(db_.get());
1057
1057
  }
1058
1058
 
1059
1059
  void VerifyKeyValues(const WideColumns& first_expected,