@nxtedition/rocksdb 15.4.1 → 16.0.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 (401) hide show
  1. package/binding.cc +70 -23
  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/index.js +70 -10
  395. package/iterator.js +25 -3
  396. package/max_rev_operator.h +9 -5
  397. package/package.json +1 -1
  398. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  399. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
@@ -29,6 +29,7 @@
29
29
  #include "options/options_parser.h"
30
30
  #include "rocksdb/convenience.h"
31
31
  #include "rocksdb/filter_policy.h"
32
+ #include "rocksdb/io_dispatcher.h"
32
33
  #include "rocksdb/secondary_cache.h"
33
34
  #include "rocksdb/sst_file_manager.h"
34
35
  #include "rocksdb/table_properties.h"
@@ -41,6 +42,7 @@
41
42
  #include "utilities/backup/backup_engine_impl.h"
42
43
  #include "utilities/fault_injection_fs.h"
43
44
  #include "utilities/fault_injection_secondary_cache.h"
45
+ #include "utilities/trie_index/trie_index_factory.h"
44
46
 
45
47
  namespace ROCKSDB_NAMESPACE {
46
48
 
@@ -74,25 +76,9 @@ StressTest::StressTest()
74
76
  new_column_family_name_(1),
75
77
  num_times_reopened_(0),
76
78
  db_preload_finished_(false),
77
- secondary_db_(nullptr),
78
79
  is_db_stopped_(false) {
79
80
  if (FLAGS_destroy_db_initially) {
80
- std::vector<std::string> files;
81
- db_stress_env->GetChildren(FLAGS_db, &files);
82
- for (unsigned int i = 0; i < files.size(); i++) {
83
- if (Slice(files[i]).starts_with("heap-")) {
84
- db_stress_env->DeleteFile(FLAGS_db + "/" + files[i]);
85
- }
86
- }
87
-
88
- Options options;
89
- options.env = db_stress_env;
90
- // Remove files without preserving manfiest files
91
- const Status s = !FLAGS_use_blob_db
92
- ? DestroyDB(FLAGS_db, options)
93
- : blob_db::DestroyBlobDB(FLAGS_db, options,
94
- blob_db::BlobDBOptions());
95
-
81
+ const Status s = DbStressDestroyDb(FLAGS_db);
96
82
  if (!s.ok()) {
97
83
  fprintf(stderr, "Cannot destroy original db: %s\n", s.ToString().c_str());
98
84
  exit(1);
@@ -113,11 +99,10 @@ void StressTest::CleanUp() {
113
99
  if (db_) {
114
100
  db_->Close();
115
101
  }
116
- delete db_;
102
+ db_owner_.reset();
117
103
  db_ = nullptr;
118
104
 
119
- delete secondary_db_;
120
- secondary_db_ = nullptr;
105
+ secondary_db_.reset();
121
106
  }
122
107
 
123
108
  void StressTest::CleanUpColumnFamilies() {
@@ -167,7 +152,6 @@ std::shared_ptr<Cache> StressTest::NewCache(size_t capacity,
167
152
  }
168
153
  CompressedSecondaryCacheOptions opts;
169
154
  opts.capacity = FLAGS_compressed_secondary_cache_size;
170
- opts.compress_format_version = FLAGS_compress_format_version;
171
155
  if (FLAGS_enable_do_not_compress_roles) {
172
156
  opts.do_not_compress_roles = {CacheEntryRoleSet::All()};
173
157
  }
@@ -769,12 +753,11 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
769
753
  }
770
754
  if (s.ok()) {
771
755
  CleanUpColumnFamilies();
772
- delete db_;
756
+ db_owner_.reset();
773
757
  db_ = nullptr;
774
758
  txn_db_ = nullptr;
775
759
  optimistic_txn_db_ = nullptr;
776
- delete secondary_db_;
777
- secondary_db_ = nullptr;
760
+ secondary_db_.reset();
778
761
 
779
762
  db_preload_finished_.store(true);
780
763
  auto now = clock_->NowMicros();
@@ -948,6 +931,22 @@ Status StressTest::CommitTxn(Transaction& txn, ThreadState* thread) {
948
931
  return s;
949
932
  }
950
933
 
934
+ bool StressTest::IsExpectedTxnError(const Status& s) {
935
+ if ((s.IsDeadlock() || s.IsTimedOut()) &&
936
+ (FLAGS_use_multiget || FLAGS_use_multi_get_entity)) {
937
+ return true;
938
+ }
939
+ // Optimistic transaction may return TryAgain when memtable history is
940
+ // insufficient for conflict detection (controlled by
941
+ // max_write_buffer_size_to_maintain). ExecuteTransaction retries up to 10
942
+ // times, and if all retries fail, it returns TryAgain. This is an expected
943
+ // condition and should not crash the stress test.
944
+ if (s.IsTryAgain() && FLAGS_use_optimistic_txn) {
945
+ return true;
946
+ }
947
+ return false;
948
+ }
949
+
951
950
  Status StressTest::ExecuteTransaction(WriteOptions& write_opts,
952
951
  ThreadState* thread,
953
952
  std::function<Status(Transaction&)>&& ops,
@@ -1004,6 +1003,9 @@ void StressTest::OperateDb(ThreadState* thread) {
1004
1003
  read_opts.allow_unprepared_value = FLAGS_allow_unprepared_value;
1005
1004
  read_opts.auto_refresh_iterator_with_snapshot =
1006
1005
  FLAGS_auto_refresh_iterator_with_snapshot;
1006
+ if (FLAGS_use_trie_index && udi_factory_) {
1007
+ read_opts.table_index_factory = udi_factory_.get();
1008
+ }
1007
1009
 
1008
1010
  WriteOptions write_opts;
1009
1011
  if (FLAGS_rate_limit_auto_wal_flush) {
@@ -1053,6 +1055,9 @@ void StressTest::OperateDb(ThreadState* thread) {
1053
1055
  }
1054
1056
  // Commenting this out as we don't want to reset stats on each open.
1055
1057
  // thread->stats.Start();
1058
+ if (FLAGS_use_trie_index && udi_factory_) {
1059
+ read_opts.table_index_factory = udi_factory_.get();
1060
+ }
1056
1061
  }
1057
1062
 
1058
1063
  #ifndef NDEBUG
@@ -1286,6 +1291,11 @@ void StressTest::OperateDb(ThreadState* thread) {
1286
1291
  ProcessStatus(shared, "TestDisableManualCompaction", status);
1287
1292
  }
1288
1293
 
1294
+ if (thread->rand.OneInOpt(FLAGS_abort_and_resume_compactions_one_in)) {
1295
+ Status status = TestAbortAndResumeCompactions(thread);
1296
+ ProcessStatus(shared, "TestAbortAndResumeCompactions", status);
1297
+ }
1298
+
1289
1299
  if (thread->rand.OneInOpt(FLAGS_verify_checksum_one_in)) {
1290
1300
  ThreadStatusUtil::SetEnableTracking(FLAGS_enable_thread_tracking);
1291
1301
  ThreadStatusUtil::SetThreadOperation(
@@ -1706,6 +1716,14 @@ Status StressTest::TestMultiScan(ThreadState* thread,
1706
1716
  FLAGS_multiscan_use_async_io &&
1707
1717
  CheckFSFeatureSupport(options_.env->GetFileSystem().get(),
1708
1718
  FSSupportedOps::kAsyncIO);
1719
+ std::shared_ptr<IODispatcher> io_dispatcher;
1720
+ if (FLAGS_multiscan_max_prefetch_memory_bytes > 0) {
1721
+ IODispatcherOptions io_opts;
1722
+ io_opts.max_prefetch_memory_bytes =
1723
+ FLAGS_multiscan_max_prefetch_memory_bytes;
1724
+ io_dispatcher.reset(NewIODispatcher(io_opts));
1725
+ scan_opts.io_dispatcher = io_dispatcher;
1726
+ }
1709
1727
  start_key_strs.reserve(num_scans);
1710
1728
  end_key_strs.reserve(num_scans);
1711
1729
 
@@ -1990,7 +2008,19 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
1990
2008
 
1991
2009
  Slice key(key_str);
1992
2010
 
1993
- const bool support_seek_first_or_last = expect_total_order;
2011
+ // UserDefinedIndexIterator supports Seek(target), Next(), and
2012
+ // SeekToFirst(). However, SeekToLast, SeekForPrev, and Prev are not
2013
+ // supported. Check if UDI is being used either via ReadOptions or
2014
+ // CF-level configuration.
2015
+ const bool using_udi =
2016
+ (ro.table_index_factory != nullptr) || (udi_factory_ != nullptr);
2017
+ // SeekToFirst is supported by UDI, so only total_order is required.
2018
+ const bool support_seek_to_first =
2019
+ expect_total_order && (FLAGS_test_backward_scan || using_udi);
2020
+ // SeekToLast requires backward scan support which UDI does not provide.
2021
+ const bool support_seek_to_last =
2022
+ expect_total_order && FLAGS_test_backward_scan && !using_udi;
2023
+ const bool support_seek_for_prev = FLAGS_test_backward_scan && !using_udi;
1994
2024
 
1995
2025
  // Write-prepared and Write-unprepared and multi-cf-iterator do not support
1996
2026
  // Refresh() yet.
@@ -2005,17 +2035,17 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
2005
2035
  }
2006
2036
 
2007
2037
  LastIterateOp last_op;
2008
- if (support_seek_first_or_last && thread->rand.OneIn(100)) {
2038
+ if (support_seek_to_first && thread->rand.OneIn(100)) {
2009
2039
  iter->SeekToFirst();
2010
2040
  cmp_iter->SeekToFirst();
2011
2041
  last_op = kLastOpSeekToFirst;
2012
2042
  op_logs += "STF ";
2013
- } else if (support_seek_first_or_last && thread->rand.OneIn(100)) {
2043
+ } else if (support_seek_to_last && thread->rand.OneIn(100)) {
2014
2044
  iter->SeekToLast();
2015
2045
  cmp_iter->SeekToLast();
2016
2046
  last_op = kLastOpSeekToLast;
2017
2047
  op_logs += "STL ";
2018
- } else if (thread->rand.OneIn(8)) {
2048
+ } else if (support_seek_for_prev && thread->rand.OneIn(8)) {
2019
2049
  iter->SeekForPrev(key);
2020
2050
  cmp_iter->SeekForPrev(key);
2021
2051
  last_op = kLastOpSeekForPrev;
@@ -2047,7 +2077,8 @@ Status StressTest::TestIterateImpl(ThreadState* thread,
2047
2077
  key, op_logs, verify_func, &diverged);
2048
2078
 
2049
2079
  const bool no_reverse =
2050
- (FLAGS_memtablerep == "prefix_hash" && !expect_total_order);
2080
+ (FLAGS_memtablerep == "prefix_hash" && !expect_total_order) ||
2081
+ !FLAGS_test_backward_scan;
2051
2082
  for (uint64_t i = 0; i < FLAGS_num_iterations && iter->Valid(); ++i) {
2052
2083
  if (no_reverse || thread->rand.OneIn(2)) {
2053
2084
  iter->Next();
@@ -2517,7 +2548,7 @@ Status StressTest::TestBackupRestore(
2517
2548
  from = "BackupEngine::PurgeOldBackups";
2518
2549
  }
2519
2550
  }
2520
- DB* restored_db = nullptr;
2551
+ std::unique_ptr<DB> restored_db;
2521
2552
  std::vector<ColumnFamilyHandle*> restored_cf_handles;
2522
2553
 
2523
2554
  // Not yet implemented: opening restored BlobDB or TransactionDB
@@ -2605,8 +2636,7 @@ Status StressTest::TestBackupRestore(
2605
2636
  for (auto* cf_handle : restored_cf_handles) {
2606
2637
  restored_db->DestroyColumnFamilyHandle(cf_handle);
2607
2638
  }
2608
- delete restored_db;
2609
- restored_db = nullptr;
2639
+ restored_db.reset();
2610
2640
  }
2611
2641
  if (s.ok() && inplace_not_restore) {
2612
2642
  // Purge late if inplace open read-only
@@ -2841,7 +2871,7 @@ Status StressTest::TestCheckpoint(ThreadState* thread,
2841
2871
  delete checkpoint;
2842
2872
  checkpoint = nullptr;
2843
2873
  std::vector<ColumnFamilyHandle*> cf_handles;
2844
- DB* checkpoint_db = nullptr;
2874
+ std::unique_ptr<DB> checkpoint_db;
2845
2875
  if (s.ok()) {
2846
2876
  Options options(options_);
2847
2877
  options.best_efforts_recovery = false;
@@ -2905,8 +2935,7 @@ Status StressTest::TestCheckpoint(ThreadState* thread,
2905
2935
  delete cfh;
2906
2936
  }
2907
2937
  cf_handles.clear();
2908
- delete checkpoint_db;
2909
- checkpoint_db = nullptr;
2938
+ checkpoint_db.reset();
2910
2939
  }
2911
2940
 
2912
2941
  // Temporarily disable error injection for clean-up
@@ -3062,8 +3091,9 @@ void StressTest::TestCompactFiles(ThreadState* thread,
3062
3091
  // TOOD (hx235): allow an exact list of tolerable failures under stress
3063
3092
  // test
3064
3093
  bool non_ok_status_allowed =
3065
- s.IsManualCompactionPaused() || IsErrorInjectedAndRetryable(s) ||
3066
- s.IsAborted() || s.IsInvalidArgument() || s.IsNotSupported();
3094
+ s.IsManualCompactionPaused() || s.IsCompactionAborted() ||
3095
+ IsErrorInjectedAndRetryable(s) || s.IsAborted() ||
3096
+ s.IsInvalidArgument() || s.IsNotSupported();
3067
3097
  if (!non_ok_status_allowed) {
3068
3098
  fprintf(stderr,
3069
3099
  "Unable to perform CompactFiles(): %s under specified "
@@ -3156,6 +3186,20 @@ Status StressTest::TestDisableManualCompaction(ThreadState* thread) {
3156
3186
  return Status::OK();
3157
3187
  }
3158
3188
 
3189
+ Status StressTest::TestAbortAndResumeCompactions(ThreadState* thread) {
3190
+ // Abort all running compactions and prevent new ones from starting
3191
+ db_->AbortAllCompactions();
3192
+ // Sleep to allow other threads to attempt operations while aborted
3193
+ // Uses same sleep pattern as TestPauseBackground and
3194
+ // TestDisableManualCompaction
3195
+ int pwr2_micros =
3196
+ std::min(thread->rand.Uniform(25), thread->rand.Uniform(25));
3197
+ clock_->SleepForMicroseconds(1 << pwr2_micros);
3198
+ // Resume compactions
3199
+ db_->ResumeAllCompactions();
3200
+ return Status::OK();
3201
+ }
3202
+
3159
3203
  void StressTest::TestAcquireSnapshot(ThreadState* thread,
3160
3204
  int rand_column_family,
3161
3205
  const std::string& keystr, uint64_t i) {
@@ -3331,7 +3375,7 @@ void StressTest::TestCompactRange(ThreadState* thread, int64_t rand_key,
3331
3375
  if (!status.ok()) {
3332
3376
  // TOOD (hx235): allow an exact list of tolerable failures under stress test
3333
3377
  bool non_ok_status_allowed =
3334
- status.IsManualCompactionPaused() ||
3378
+ status.IsManualCompactionPaused() || status.IsCompactionAborted() ||
3335
3379
  IsErrorInjectedAndRetryable(status) || status.IsAborted() ||
3336
3380
  status.IsInvalidArgument() || status.IsNotSupported();
3337
3381
  if (!non_ok_status_allowed) {
@@ -3631,8 +3675,11 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3631
3675
  assert(db_ == nullptr);
3632
3676
  assert(txn_db_ == nullptr);
3633
3677
  assert(optimistic_txn_db_ == nullptr);
3678
+ if (FLAGS_use_trie_index) {
3679
+ udi_factory_ = std::make_shared<trie_index::TrieIndexFactory>();
3680
+ }
3634
3681
  if (!InitializeOptionsFromFile(options_)) {
3635
- InitializeOptionsFromFlags(cache_, filter_policy_, options_);
3682
+ InitializeOptionsFromFlags(cache_, filter_policy_, udi_factory_, options_);
3636
3683
  }
3637
3684
  InitializeOptionsGeneral(cache_, filter_policy_, sqfc_factory_, options_);
3638
3685
  DbStressCustomCompressionManager::Register();
@@ -3670,13 +3717,6 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3670
3717
 
3671
3718
  // Remote Compaction
3672
3719
  if (FLAGS_remote_compaction_worker_threads > 0) {
3673
- // TODO(jaykorean) Remove this after fix - remote worker shouldn't recover
3674
- // from WAL
3675
- if (!FLAGS_disable_wal) {
3676
- fprintf(stderr,
3677
- "WAL is not compatible with Remote Compaction in Stress Test\n");
3678
- exit(1);
3679
- }
3680
3720
  if ((options_.enable_blob_files ||
3681
3721
  options_.enable_blob_garbage_collection ||
3682
3722
  FLAGS_allow_setting_blob_options_dynamically)) {
@@ -3859,26 +3899,28 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3859
3899
  // StackableDB-based BlobDB
3860
3900
  if (FLAGS_use_blob_db) {
3861
3901
  blob_db::BlobDBOptions blob_db_options;
3862
- blob_db_options.min_blob_size = FLAGS_blob_db_min_blob_size;
3863
- blob_db_options.bytes_per_sync = FLAGS_blob_db_bytes_per_sync;
3864
3902
  blob_db_options.blob_file_size = FLAGS_blob_db_file_size;
3865
3903
  blob_db_options.enable_garbage_collection = FLAGS_blob_db_enable_gc;
3866
- blob_db_options.garbage_collection_cutoff = FLAGS_blob_db_gc_cutoff;
3867
3904
 
3868
3905
  blob_db::BlobDB* blob_db = nullptr;
3869
3906
  s = blob_db::BlobDB::Open(options_, blob_db_options, FLAGS_db,
3870
3907
  cf_descriptors, &column_families_,
3871
3908
  &blob_db);
3872
3909
  if (s.ok()) {
3910
+ db_owner_.reset(blob_db);
3873
3911
  db_ = blob_db;
3874
3912
  }
3875
3913
  } else {
3876
3914
  if (db_preload_finished_.load() && FLAGS_read_only) {
3877
3915
  s = DB::OpenForReadOnly(DBOptions(options_), FLAGS_db,
3878
- cf_descriptors, &column_families_, &db_);
3916
+ cf_descriptors, &column_families_,
3917
+ &db_owner_);
3879
3918
  } else {
3880
3919
  s = DB::Open(DBOptions(options_), FLAGS_db, cf_descriptors,
3881
- &column_families_, &db_);
3920
+ &column_families_, &db_owner_);
3921
+ }
3922
+ if (s.ok()) {
3923
+ db_ = db_owner_.get();
3882
3924
  }
3883
3925
  }
3884
3926
 
@@ -3894,10 +3936,9 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3894
3936
  s = db_->GetRootDB()->WaitForCompact(WaitForCompactOptions());
3895
3937
  if (!s.ok()) {
3896
3938
  CleanUpColumnFamilies();
3897
- delete db_;
3939
+ db_owner_.reset();
3898
3940
  db_ = nullptr;
3899
- delete secondary_db_;
3900
- secondary_db_ = nullptr;
3941
+ secondary_db_.reset();
3901
3942
  }
3902
3943
  }
3903
3944
  if (!s.ok()) {
@@ -3954,6 +3995,7 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3954
3995
  }
3955
3996
  assert(s.ok());
3956
3997
  {
3998
+ db_owner_.reset(optimistic_txn_db_);
3957
3999
  db_ = optimistic_txn_db_;
3958
4000
  db_aptr_.store(optimistic_txn_db_, std::memory_order_release);
3959
4001
  }
@@ -3989,6 +4031,7 @@ void StressTest::Open(SharedState* shared, bool reopen) {
3989
4031
 
3990
4032
  // Do not swap the order of the following.
3991
4033
  {
4034
+ db_owner_.reset(txn_db_);
3992
4035
  db_ = txn_db_;
3993
4036
  db_aptr_.store(txn_db_, std::memory_order_release);
3994
4037
  }
@@ -4027,6 +4070,7 @@ void StressTest::Open(SharedState* shared, bool reopen) {
4027
4070
  } else {
4028
4071
  DBWithTTL* db_with_ttl;
4029
4072
  s = DBWithTTL::Open(options_, FLAGS_db, &db_with_ttl, FLAGS_ttl);
4073
+ db_owner_.reset(db_with_ttl);
4030
4074
  db_ = db_with_ttl;
4031
4075
  }
4032
4076
 
@@ -4106,12 +4150,11 @@ void StressTest::Reopen(ThreadState* thread) {
4106
4150
  }
4107
4151
  assert((txn_db_ == nullptr && optimistic_txn_db_ == nullptr) ||
4108
4152
  (db_ == txn_db_ || db_ == optimistic_txn_db_));
4109
- delete db_;
4153
+ db_owner_.reset();
4110
4154
  db_ = nullptr;
4111
4155
  txn_db_ = nullptr;
4112
4156
  optimistic_txn_db_ = nullptr;
4113
- delete secondary_db_;
4114
- secondary_db_ = nullptr;
4157
+ secondary_db_.reset();
4115
4158
 
4116
4159
  num_times_reopened_++;
4117
4160
  auto now = clock_->NowMicros();
@@ -4269,6 +4312,7 @@ bool InitializeOptionsFromFile(Options& options) {
4269
4312
  void InitializeOptionsFromFlags(
4270
4313
  const std::shared_ptr<Cache>& cache,
4271
4314
  const std::shared_ptr<const FilterPolicy>& filter_policy,
4315
+ const std::shared_ptr<UserDefinedIndexFactory>& udi_factory,
4272
4316
  Options& options) {
4273
4317
  BlockBasedTableOptions block_based_options;
4274
4318
  block_based_options.decouple_partitioned_filters =
@@ -4311,6 +4355,8 @@ void InitializeOptionsFromFlags(
4311
4355
  : CacheEntryRoleOptions::Decision::kDisabled}});
4312
4356
  block_based_options.format_version =
4313
4357
  static_cast<uint32_t>(FLAGS_format_version);
4358
+ block_based_options.separate_key_value_in_data_block =
4359
+ FLAGS_separate_key_value_in_data_block;
4314
4360
  block_based_options.index_block_restart_interval =
4315
4361
  static_cast<int32_t>(FLAGS_index_block_restart_interval);
4316
4362
  block_based_options.filter_policy = filter_policy;
@@ -4324,6 +4370,10 @@ void InitializeOptionsFromFlags(
4324
4370
  block_based_options.data_block_index_type =
4325
4371
  static_cast<BlockBasedTableOptions::DataBlockIndexType>(
4326
4372
  FLAGS_data_block_index_type);
4373
+ block_based_options.index_block_search_type =
4374
+ static_cast<BlockBasedTableOptions::BlockSearchType>(
4375
+ FLAGS_index_block_search_type);
4376
+ block_based_options.uniform_cv_threshold = FLAGS_uniform_cv_threshold;
4327
4377
  block_based_options.prepopulate_block_cache =
4328
4378
  static_cast<BlockBasedTableOptions::PrepopulateBlockCache>(
4329
4379
  FLAGS_prepopulate_block_cache);
@@ -4346,6 +4396,9 @@ void InitializeOptionsFromFlags(
4346
4396
  fLU64::FLAGS_super_block_alignment_size;
4347
4397
  block_based_options.super_block_alignment_space_overhead_ratio =
4348
4398
  fLU64::FLAGS_super_block_alignment_space_overhead_ratio;
4399
+ if (udi_factory) {
4400
+ block_based_options.user_defined_index_factory = udi_factory;
4401
+ }
4349
4402
  options.table_factory.reset(NewBlockBasedTableFactory(block_based_options));
4350
4403
  options.db_write_buffer_size = FLAGS_db_write_buffer_size;
4351
4404
  options.write_buffer_size = FLAGS_write_buffer_size;
@@ -4374,6 +4427,12 @@ void InitializeOptionsFromFlags(
4374
4427
  ROCKSDB_NAMESPACE::CompactionStyle::kCompactionStyleFIFO) {
4375
4428
  options.compaction_options_fifo.allow_compaction =
4376
4429
  FLAGS_fifo_allow_compaction;
4430
+ if (FLAGS_fifo_compaction_max_data_files_size_mb > 0) {
4431
+ options.compaction_options_fifo.max_data_files_size =
4432
+ FLAGS_fifo_compaction_max_data_files_size_mb * 1024 * 1024;
4433
+ }
4434
+ options.compaction_options_fifo.use_kv_ratio_compaction =
4435
+ FLAGS_fifo_compaction_use_kv_ratio_compaction;
4377
4436
  }
4378
4437
  options.compaction_pri =
4379
4438
  static_cast<ROCKSDB_NAMESPACE::CompactionPri>(FLAGS_compaction_pri);
@@ -4386,6 +4445,13 @@ void InitializeOptionsFromFlags(
4386
4445
  }
4387
4446
  }
4388
4447
  options.max_open_files = FLAGS_open_files;
4448
+ options.open_files_async = FLAGS_open_files_async;
4449
+ if (FLAGS_open_files_async && !FLAGS_skip_stats_update_on_db_open) {
4450
+ FLAGS_skip_stats_update_on_db_open = true;
4451
+ fprintf(stderr,
4452
+ "open_files_async requires skip_stats_update_on_db_open, "
4453
+ "enabling it automatically\n");
4454
+ }
4389
4455
  if (FLAGS_statistics) {
4390
4456
  options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
4391
4457
  }
@@ -4431,6 +4497,8 @@ void InitializeOptionsFromFlags(
4431
4497
  }
4432
4498
  options.max_manifest_file_size = FLAGS_max_manifest_file_size;
4433
4499
  options.max_manifest_space_amp_pct = FLAGS_max_manifest_space_amp_pct;
4500
+ options.verify_manifest_content_on_close =
4501
+ FLAGS_verify_manifest_content_on_close;
4434
4502
  options.max_subcompactions = static_cast<uint32_t>(FLAGS_subcompactions);
4435
4503
  options.allow_concurrent_memtable_write =
4436
4504
  FLAGS_allow_concurrent_memtable_write;
@@ -4459,6 +4527,8 @@ void InitializeOptionsFromFlags(
4459
4527
  options.write_dbid_to_manifest = FLAGS_write_dbid_to_manifest;
4460
4528
  options.write_identity_file = FLAGS_write_identity_file;
4461
4529
  options.avoid_flush_during_recovery = FLAGS_avoid_flush_during_recovery;
4530
+ options.enforce_write_buffer_manager_during_recovery =
4531
+ FLAGS_enforce_write_buffer_manager_during_recovery;
4462
4532
  options.max_write_batch_group_size_bytes =
4463
4533
  FLAGS_max_write_batch_group_size_bytes;
4464
4534
  options.level_compaction_dynamic_level_bytes =
@@ -4470,9 +4540,13 @@ void InitializeOptionsFromFlags(
4470
4540
  options.memtable_protection_bytes_per_key =
4471
4541
  FLAGS_memtable_protection_bytes_per_key;
4472
4542
  options.block_protection_bytes_per_key = FLAGS_block_protection_bytes_per_key;
4543
+ options.verify_output_flags =
4544
+ static_cast<VerifyOutputFlags>(FLAGS_verify_output_flags);
4473
4545
  options.paranoid_memory_checks = FLAGS_paranoid_memory_checks;
4474
4546
  options.memtable_veirfy_per_key_checksum_on_seek =
4475
4547
  FLAGS_memtable_veirfy_per_key_checksum_on_seek;
4548
+ options.memtable_batch_lookup_optimization =
4549
+ FLAGS_memtable_batch_lookup_optimization;
4476
4550
 
4477
4551
  // Integrated BlobDB
4478
4552
  options.enable_blob_files = FLAGS_enable_blob_files;
@@ -4701,10 +4775,18 @@ void InitializeOptionsGeneral(
4701
4775
  "`preserve_unverified_changes` to keep all files\n");
4702
4776
  options.avoid_flush_during_recovery = true;
4703
4777
  }
4704
- // Together with `avoid_flush_during_recovery == true`, this will prevent
4705
- // live files from becoming obsolete and deleted between `DB::Open()` and
4706
- // `DisableFileDeletions()` due to flush or compaction. We do not need to
4707
- // warn the user since we will reenable compaction soon.
4778
+ if (options.enforce_write_buffer_manager_during_recovery) {
4779
+ fprintf(
4780
+ stderr,
4781
+ "WARNING: flipping `enforce_write_buffer_manager_during_recovery` "
4782
+ "to false for `preserve_unverified_changes` to keep all files\n");
4783
+ options.enforce_write_buffer_manager_during_recovery = false;
4784
+ }
4785
+ // Together with `avoid_flush_during_recovery == true` and
4786
+ // `enforce_write_buffer_manager_during_recovery == false`, this will
4787
+ // prevent live files from becoming obsolete and deleted between
4788
+ // `DB::Open()` and `DisableFileDeletions()` due to flush or compaction.
4789
+ // We do not need to warn the user since we will reenable compaction soon.
4708
4790
  options.disable_auto_compactions = true;
4709
4791
  }
4710
4792
 
@@ -14,6 +14,7 @@
14
14
  #include "db_stress_tool/db_stress_common.h"
15
15
  #include "db_stress_tool/db_stress_shared_state.h"
16
16
  #include "rocksdb/experimental.h"
17
+ #include "rocksdb/user_defined_index.h"
17
18
  #include "utilities/fault_injection_fs.h"
18
19
 
19
20
  namespace ROCKSDB_NAMESPACE {
@@ -33,6 +34,12 @@ class StressTest {
33
34
  !status_to_io_status(Status(error_s)).GetDataLoss();
34
35
  }
35
36
 
37
+ // Returns true if the status is an expected transactional error, including
38
+ // lock conflicts (deadlock or timeout) from MaybeAddKeyToTxnForRYW writing
39
+ // to the same key space without the stress-test-level mutex, and TryAgain
40
+ // from optimistic transactions when conflict detection retries are exhausted.
41
+ static bool IsExpectedTxnError(const Status& s);
42
+
36
43
  StressTest();
37
44
 
38
45
  virtual ~StressTest() {}
@@ -332,6 +339,8 @@ class StressTest {
332
339
 
333
340
  Status TestDisableManualCompaction(ThreadState* thread);
334
341
 
342
+ Status TestAbortAndResumeCompactions(ThreadState* thread);
343
+
335
344
  void TestAcquireSnapshot(ThreadState* thread, int rand_column_family,
336
345
  const std::string& keystr, uint64_t i);
337
346
 
@@ -402,6 +411,7 @@ class StressTest {
402
411
  std::shared_ptr<Cache> cache_;
403
412
  std::shared_ptr<Cache> compressed_cache_;
404
413
  std::shared_ptr<const FilterPolicy> filter_policy_;
414
+ std::unique_ptr<DB> db_owner_;
405
415
  DB* db_;
406
416
  TransactionDB* txn_db_;
407
417
  OptimisticTransactionDB* optimistic_txn_db_;
@@ -419,8 +429,9 @@ class StressTest {
419
429
  std::vector<std::string> options_index_;
420
430
  std::atomic<bool> db_preload_finished_;
421
431
  std::shared_ptr<SstQueryFilterConfigsManager::Factory> sqfc_factory_;
432
+ std::shared_ptr<UserDefinedIndexFactory> udi_factory_;
422
433
 
423
- DB* secondary_db_;
434
+ std::unique_ptr<DB> secondary_db_;
424
435
  std::vector<ColumnFamilyHandle*> secondary_cfhs_;
425
436
  bool is_db_stopped_;
426
437
  };
@@ -434,7 +445,9 @@ bool InitializeOptionsFromFile(Options& options);
434
445
  // input arguments.
435
446
  void InitializeOptionsFromFlags(
436
447
  const std::shared_ptr<Cache>& cache,
437
- const std::shared_ptr<const FilterPolicy>& filter_policy, Options& options);
448
+ const std::shared_ptr<const FilterPolicy>& filter_policy,
449
+ const std::shared_ptr<UserDefinedIndexFactory>& udi_factory,
450
+ Options& options);
438
451
 
439
452
  // Initialize `options` on which `InitializeOptionsFromFile()` and
440
453
  // `InitializeOptionsFromFlags()` have both been called already.
@@ -24,6 +24,7 @@
24
24
  #include "db_stress_tool/db_stress_common.h"
25
25
  #include "db_stress_tool/db_stress_driver.h"
26
26
  #include "db_stress_tool/db_stress_shared_state.h"
27
+ #include "port/stack_trace.h"
27
28
  #include "rocksdb/convenience.h"
28
29
  #include "utilities/fault_injection_fs.h"
29
30
 
@@ -92,12 +93,50 @@ int db_stress_tool(int argc, char** argv) {
92
93
  fault_env_guard =
93
94
  std::make_shared<CompositeEnvWrapper>(raw_env, fault_fs_guard);
94
95
  raw_env = fault_env_guard.get();
96
+
97
+ // Register a crash callback so that recently injected errors are
98
+ // printed to stderr when the process crashes (SIGABRT, SIGSEGV, etc.).
99
+ // This helps diagnose stress test failures caused by fault injection.
100
+ port::RegisterCrashCallback([]() {
101
+ if (fault_fs_guard) {
102
+ fault_fs_guard->PrintRecentInjectedErrors();
103
+ }
104
+ });
95
105
  }
96
106
 
97
- env_wrapper_guard = std::make_shared<CompositeEnvWrapper>(
98
- raw_env, std::make_shared<DbStressFSWrapper>(raw_env->GetFileSystem()));
107
+ auto db_stress_fs =
108
+ std::make_shared<DbStressFSWrapper>(raw_env->GetFileSystem());
109
+ env_wrapper_guard =
110
+ std::make_shared<CompositeEnvWrapper>(raw_env, db_stress_fs);
99
111
  db_stress_env = env_wrapper_guard.get();
100
112
 
113
+ // Handle --destroy_db_and_exit early, before other option validation
114
+ if (FLAGS_destroy_db_and_exit) {
115
+ s = DbStressDestroyDb(FLAGS_db);
116
+ if (s.ok()) {
117
+ fprintf(stdout, "Successfully destroyed db at %s\n", FLAGS_db.c_str());
118
+ return 0;
119
+ } else {
120
+ fprintf(stderr, "Failed to destroy db at %s: %s\n", FLAGS_db.c_str(),
121
+ s.ToString().c_str());
122
+ return 1;
123
+ }
124
+ }
125
+
126
+ // Handle --delete_dir_and_exit early, before other option validation
127
+ if (!FLAGS_delete_dir_and_exit.empty()) {
128
+ s = DestroyDir(raw_env, FLAGS_delete_dir_and_exit);
129
+ if (s.ok()) {
130
+ fprintf(stdout, "Successfully deleted directory %s\n",
131
+ FLAGS_delete_dir_and_exit.c_str());
132
+ return 0;
133
+ } else {
134
+ fprintf(stderr, "Failed to delete directory %s: %s\n",
135
+ FLAGS_delete_dir_and_exit.c_str(), s.ToString().c_str());
136
+ return 1;
137
+ }
138
+ }
139
+
101
140
  FLAGS_rep_factory = StringToRepFactory(FLAGS_memtablerep.c_str());
102
141
 
103
142
  // The number of background threads should be at least as much the
@@ -190,6 +229,22 @@ int db_stress_tool(int argc, char** argv) {
190
229
  FLAGS_atomic_flush = true;
191
230
  }
192
231
 
232
+ // Trie UDI supports Seek, Next, and SeekToFirst, but not SeekToLast,
233
+ // SeekForPrev, or Prev. Disable backward scan testing.
234
+ if (FLAGS_use_trie_index) {
235
+ FLAGS_test_backward_scan = false;
236
+ }
237
+
238
+ // Trie UDI uses zero-copy pointers into block data, which is
239
+ // incompatible with mmap_read.
240
+ if (FLAGS_use_trie_index && FLAGS_mmap_read) {
241
+ fprintf(stderr,
242
+ "Error: use_trie_index is incompatible with mmap_read. "
243
+ "The trie index uses zero-copy pointers into block data "
244
+ "which is unsafe with mmap'd reads.\n");
245
+ exit(1);
246
+ }
247
+
193
248
  if (FLAGS_read_only) {
194
249
  if (FLAGS_writepercent != 0 || FLAGS_delpercent != 0 ||
195
250
  FLAGS_delrangepercent != 0) {
@@ -211,6 +266,25 @@ int db_stress_tool(int argc, char** argv) {
211
266
  FLAGS_db = default_db_path;
212
267
  }
213
268
 
269
+ // Now that FLAGS_db is resolved, set the fault injection log file path
270
+ // so that PrintAll() writes to a file instead of stderr (signal-safe).
271
+ // Store the log in TEST_TMPDIR (outside the DB directory) so it survives
272
+ // DB reopen (which cleans untracked files) and gets included in the
273
+ // sandcastle db.tar.gz artifact for post-failure analysis.
274
+ if (fault_fs_guard) {
275
+ std::string log_dir;
276
+ const char* test_tmpdir = getenv("TEST_TMPDIR");
277
+ if (test_tmpdir && test_tmpdir[0] != '\0') {
278
+ log_dir = test_tmpdir;
279
+ } else {
280
+ log_dir = "/tmp";
281
+ }
282
+ std::string log_path = log_dir + "/fault_injection_" +
283
+ std::to_string(getpid()) + "_" +
284
+ std::to_string(time(nullptr)) + ".log";
285
+ fault_fs_guard->SetInjectedErrorLogPath(log_path);
286
+ }
287
+
214
288
  if ((FLAGS_test_secondary || FLAGS_continuous_verification_interval > 0) &&
215
289
  FLAGS_secondaries_base.empty()) {
216
290
  std::string default_secondaries_path;