@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
@@ -17,11 +17,28 @@
17
17
  #pragma once
18
18
 
19
19
  #include <algorithm>
20
+ #include <atomic>
21
+ #include <chrono>
22
+ #include <cstdarg>
23
+ #include <functional>
20
24
  #include <map>
21
25
  #include <set>
22
26
  #include <string>
27
+ #include <thread>
28
+
29
+ #ifndef OS_WIN
30
+ #include <fcntl.h>
31
+ #include <limits.h>
32
+ #include <unistd.h>
33
+ #endif
34
+
35
+ // PATH_MAX may not be defined on all platforms
36
+ #ifndef PATH_MAX
37
+ #define PATH_MAX 4096
38
+ #endif
23
39
 
24
40
  #include "file/filename.h"
41
+ #include "port/lang.h"
25
42
  #include "rocksdb/file_system.h"
26
43
  #include "util/mutexlock.h"
27
44
  #include "util/random.h"
@@ -29,9 +46,240 @@
29
46
 
30
47
  namespace ROCKSDB_NAMESPACE {
31
48
 
49
+ // A fixed-size circular buffer that records recently injected errors.
50
+ // Thread-safe for concurrent writes. Designed to be safe to read from a
51
+ // signal handler (PrintAll uses only fprintf to stderr).
52
+ class InjectedErrorLog {
53
+ public:
54
+ static constexpr size_t kMaxEntries = 1000;
55
+ static constexpr size_t kMaxMessageLen = 256;
56
+
57
+ struct Entry {
58
+ uint64_t timestamp_us;
59
+ uint64_t thread_id;
60
+ char context[kMaxMessageLen];
61
+ };
62
+
63
+ InjectedErrorLog() : head_(0), entries_{} { log_path_[0] = '\0'; }
64
+
65
+ // Set the file path for PrintAll() output. Must be called before any
66
+ // signal handler invocation (not async-signal-safe itself due to string
67
+ // copy, but called once at setup time). If not set, PrintAll() falls
68
+ // back to writing to stderr.
69
+ void SetLogFilePath(const std::string& path) {
70
+ size_t len = std::min(path.size(), sizeof(log_path_) - 1);
71
+ memcpy(log_path_, path.data(), len);
72
+ log_path_[len] = '\0';
73
+ }
74
+
75
+ TSAN_SUPPRESSION void Record(const char* fmt, ...)
76
+ #if defined(__GNUC__) || defined(__clang__)
77
+ __attribute__((format(printf, 2, 3)))
78
+ #endif
79
+ {
80
+ size_t idx = head_.fetch_add(1, std::memory_order_relaxed) % kMaxEntries;
81
+ Entry& e = entries_[idx];
82
+ e.thread_id = std::hash<std::thread::id>{}(std::this_thread::get_id());
83
+ auto now = std::chrono::system_clock::now();
84
+ e.timestamp_us = std::chrono::duration_cast<std::chrono::microseconds>(
85
+ now.time_since_epoch())
86
+ .count();
87
+ // Format into a local buffer first, then copy into the shared entry.
88
+ // This avoids calling the TSAN-intercepted vsnprintf directly on shared
89
+ // memory. We use a byte-by-byte loop instead of memcpy because
90
+ // TSAN_SUPPRESSION (no_sanitize("thread")) only suppresses
91
+ // compiler-inserted instrumentation -- it does NOT suppress TSAN's
92
+ // runtime interceptors for libc functions like memcpy, vsnprintf, and
93
+ // snprintf. Plain store instructions are always suppressed regardless
94
+ // of optimization level. The volatile source pointer prevents the
95
+ // compiler from recognizing this as a memcpy idiom and replacing it
96
+ // with a memcpy call.
97
+ char local_buf[kMaxMessageLen];
98
+ va_list args;
99
+ va_start(args, fmt);
100
+ vsnprintf(local_buf, kMaxMessageLen, fmt, args);
101
+ va_end(args);
102
+ const volatile char* src = local_buf;
103
+ for (size_t i = 0; i < kMaxMessageLen; i++) {
104
+ e.context[i] = src[i];
105
+ }
106
+ }
107
+
108
+ // Format the first few bytes of a buffer as hex for logging.
109
+ // Returns a string like "ab cd ef 01 02 ..."
110
+ static std::string HexHead(const char* data, size_t size,
111
+ size_t max_bytes = 8) {
112
+ std::string result;
113
+ size_t n = std::min(size, max_bytes);
114
+ char buf[4];
115
+ for (size_t i = 0; i < n; i++) {
116
+ snprintf(buf, sizeof(buf), "%02x ", (unsigned char)data[i]);
117
+ result += buf;
118
+ }
119
+ if (size > max_bytes) result += "...";
120
+ if (!result.empty() && result.back() == ' ') result.pop_back();
121
+ return result;
122
+ }
123
+
124
+ // Print all recorded entries to a log file (or stderr as fallback).
125
+ // Async-signal-safe: uses only open/write/close/snprintf (no fprintf,
126
+ // no malloc). Safe to call from a signal handler.
127
+ //
128
+ // Note: entries may be read while being written by another thread.
129
+ // This is a benign race -- at worst, one entry may appear garbled.
130
+ // We accept this trade-off to keep PrintAll() free of locks and safe
131
+ // for use in signal handlers.
132
+ TSAN_SUPPRESSION void PrintAll() const {
133
+ #ifndef OS_WIN
134
+ int fd = -1;
135
+ if (log_path_[0] != '\0') {
136
+ fd = open(log_path_, O_WRONLY | O_CREAT | O_TRUNC, 0644);
137
+ }
138
+ // Fall back to stdout if open failed or no path was set.
139
+ // We avoid stderr because db_crashtest.py treats any stderr output
140
+ // as a test failure.
141
+ if (fd < 0) {
142
+ fd = STDOUT_FILENO;
143
+ }
144
+
145
+ auto write_str = [fd](const char* buf, int len) {
146
+ if (len > 0) {
147
+ // Ignore return value in signal handler -- nothing we can do
148
+ auto unused __attribute__((unused)) = write(fd, buf, len);
149
+ }
150
+ };
151
+
152
+ char buf[512];
153
+ int len = snprintf(buf, sizeof(buf),
154
+ "\n=== Recently Injected Fault Injection Errors "
155
+ "(most recent last) ===\n");
156
+ write_str(buf, len);
157
+
158
+ size_t total = head_.load(std::memory_order_relaxed);
159
+ if (total == 0) {
160
+ len = snprintf(buf, sizeof(buf), "(none)\n");
161
+ write_str(buf, len);
162
+ if (fd != STDOUT_FILENO) close(fd);
163
+ return;
164
+ }
165
+ size_t count = std::min(total, kMaxEntries);
166
+ size_t start = (total >= kMaxEntries) ? (total % kMaxEntries) : 0;
167
+ for (size_t i = 0; i < count; i++) {
168
+ size_t idx = (start + i) % kMaxEntries;
169
+ // Copy entry fields to locals to avoid passing shared memory through
170
+ // TSAN-intercepted snprintf. See comment in Record() for why we use a
171
+ // volatile pointer to prevent loop-to-memcpy optimization.
172
+ const Entry& e = entries_[idx];
173
+ uint64_t local_ts = e.timestamp_us;
174
+ uint64_t local_tid = e.thread_id;
175
+ char local_ctx[kMaxMessageLen];
176
+ const volatile char* ctx_src = e.context;
177
+ for (size_t j = 0; j < kMaxMessageLen; j++) {
178
+ local_ctx[j] = ctx_src[j];
179
+ }
180
+ if (local_ts == 0) continue;
181
+ uint64_t secs = local_ts / 1000000;
182
+ uint64_t usecs = local_ts % 1000000;
183
+ len = snprintf(buf, sizeof(buf), "[%llu.%06llu] thread=%llu: %s\n",
184
+ (unsigned long long)secs, (unsigned long long)usecs,
185
+ (unsigned long long)local_tid, local_ctx);
186
+ write_str(buf, len);
187
+ }
188
+ len = snprintf(buf, sizeof(buf),
189
+ "=== End of injected error log (%zu entries) ===\n", count);
190
+ write_str(buf, len);
191
+ if (fd != STDOUT_FILENO) close(fd);
192
+ #else
193
+ // On Windows, crash callbacks via signal handlers are not used,
194
+ // so PrintAll() is a no-op.
195
+ #endif
196
+ }
197
+
198
+ private:
199
+ std::atomic<size_t> head_;
200
+ Entry entries_[kMaxEntries];
201
+ char log_path_[PATH_MAX];
202
+ };
203
+
32
204
  class TestFSWritableFile;
33
205
  class FaultInjectionTestFS;
34
206
 
207
+ // Deferred detail builders for injected error logging.
208
+ // These return lambdas that are only evaluated when a fault is actually
209
+ // injected, avoiding string formatting overhead on the common (no-fault) path.
210
+ // Captured references are safe because the lambda is called synchronously
211
+ // within MaybeInjectThreadLocalError before the caller returns.
212
+ namespace fault_injection_detail {
213
+
214
+ inline std::function<std::string()> NoDetail() { return {}; }
215
+
216
+ inline std::function<std::string()> TwoFiles(const std::string& /*f1*/,
217
+ const std::string& f2) {
218
+ return [&f2]() -> std::string {
219
+ char buf[160];
220
+ snprintf(buf, sizeof(buf), "\"%.128s\"", f2.c_str());
221
+ return std::string(buf);
222
+ };
223
+ }
224
+
225
+ inline std::function<std::string()> SizeAndHead(const Slice& data) {
226
+ return [data]() -> std::string {
227
+ char buf[128];
228
+ snprintf(buf, sizeof(buf), "size=%zu, head=[%s]", data.size(),
229
+ InjectedErrorLog::HexHead(data.data(), data.size()).c_str());
230
+ return std::string(buf);
231
+ };
232
+ }
233
+
234
+ inline std::function<std::string()> OffsetSizeAndHead(uint64_t offset,
235
+ const Slice& data) {
236
+ return [offset, data]() -> std::string {
237
+ char buf[160];
238
+ snprintf(buf, sizeof(buf), "offset=%llu, size=%zu, head=[%s]",
239
+ (unsigned long long)offset, data.size(),
240
+ InjectedErrorLog::HexHead(data.data(), data.size()).c_str());
241
+ return std::string(buf);
242
+ };
243
+ }
244
+
245
+ inline std::function<std::string()> OffsetAndSize(uint64_t offset, size_t n) {
246
+ return [offset, n]() -> std::string {
247
+ char buf[64];
248
+ snprintf(buf, sizeof(buf), "offset=%llu, size=%zu",
249
+ (unsigned long long)offset, n);
250
+ return std::string(buf);
251
+ };
252
+ }
253
+
254
+ inline std::function<std::string()> Size(uint64_t size) {
255
+ return [size]() -> std::string {
256
+ char buf[32];
257
+ snprintf(buf, sizeof(buf), "size=%llu", (unsigned long long)size);
258
+ return std::string(buf);
259
+ };
260
+ }
261
+
262
+ inline std::function<std::string()> Count(size_t count) {
263
+ return [count]() -> std::string {
264
+ char buf[32];
265
+ snprintf(buf, sizeof(buf), "num_reqs=%zu", count);
266
+ return std::string(buf);
267
+ };
268
+ }
269
+
270
+ inline std::function<std::string()> ReqOffsetAndSize(size_t req_idx,
271
+ uint64_t offset,
272
+ size_t n) {
273
+ return [req_idx, offset, n]() -> std::string {
274
+ char buf[96];
275
+ snprintf(buf, sizeof(buf), "req[%zu], offset=%llu, size=%zu", req_idx,
276
+ (unsigned long long)offset, n);
277
+ return std::string(buf);
278
+ };
279
+ }
280
+
281
+ } // namespace fault_injection_detail
282
+
35
283
  enum class FaultInjectionIOType {
36
284
  kRead = 0,
37
285
  kWrite,
@@ -161,6 +409,7 @@ class TestFSRandomAccessFile : public FSRandomAccessFile {
161
409
  IOStatus GetFileSize(uint64_t* file_size) override;
162
410
 
163
411
  private:
412
+ std::string fname_;
164
413
  std::unique_ptr<FSRandomAccessFile> target_;
165
414
  FaultInjectionTestFS* fs_;
166
415
  const bool is_sst_;
@@ -332,7 +581,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
332
581
  *disk_free = 0;
333
582
  } else {
334
583
  io_s = MaybeInjectThreadLocalError(FaultInjectionIOType::kMetadataRead,
335
- options);
584
+ options, "GetFreeSpace", path);
336
585
  if (io_s.ok()) {
337
586
  io_s = target()->GetFreeSpace(path, options, disk_free, dbg);
338
587
  }
@@ -545,7 +794,8 @@ class FaultInjectionTestFS : public FileSystemWrapper {
545
794
 
546
795
  IOStatus MaybeInjectThreadLocalError(
547
796
  FaultInjectionIOType type, const IOOptions& io_options,
548
- const std::string& file_name = "", ErrorOperation op = kUnknown,
797
+ const char* op_name, const std::string& file_name,
798
+ std::function<std::string()> detail_fn = {}, ErrorOperation op = kUnknown,
549
799
  Slice* slice = nullptr, bool direct_io = false, char* scratch = nullptr,
550
800
  bool need_count_increase = false, bool* fault_injected = nullptr);
551
801
 
@@ -610,6 +860,22 @@ class FaultInjectionTestFS : public FileSystemWrapper {
610
860
  void ReadUnsynced(const std::string& fname, uint64_t offset, size_t n,
611
861
  Slice* result, char* scratch, int64_t* pos_at_last_sync);
612
862
 
863
+ // Access the injected error log for printing on crash or test failure.
864
+ InjectedErrorLog& GetInjectedErrorLog() { return injected_error_log_; }
865
+ const InjectedErrorLog& GetInjectedErrorLog() const {
866
+ return injected_error_log_;
867
+ }
868
+
869
+ // Print recently injected errors to stderr. Call this on test failure
870
+ // to see what errors were injected leading up to the failure.
871
+ void PrintRecentInjectedErrors() const { injected_error_log_.PrintAll(); }
872
+
873
+ // Set the file path where PrintAll() will write its output.
874
+ // Must be called before any signal handler invocation.
875
+ void SetInjectedErrorLogPath(const std::string& path) {
876
+ injected_error_log_.SetLogFilePath(path);
877
+ }
878
+
613
879
  inline static const std::string kInjected = "injected";
614
880
 
615
881
  private:
@@ -676,6 +942,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
676
942
  bool fail_get_file_unique_id_ = false;
677
943
  bool fail_random_access_get_file_size_sst_ = false;
678
944
  bool fail_fs_get_file_size_sst_ = false;
945
+ InjectedErrorLog injected_error_log_;
679
946
 
680
947
  // Inject an error. For a READ operation, a status of IOError(), a
681
948
  // corruption in the contents of scratch, or truncation of slice
@@ -683,11 +950,11 @@ class FaultInjectionTestFS : public FileSystemWrapper {
683
950
  // its always an IOError.
684
951
  // fault_injected returns whether a fault is injected. It is needed
685
952
  // because some fault is inected with IOStatus to be OK.
686
- IOStatus MaybeInjectThreadLocalReadError(const IOOptions& io_options,
687
- ErrorOperation op, Slice* slice,
688
- bool direct_io, char* scratch,
689
- bool need_count_increase,
690
- bool* fault_injected);
953
+ IOStatus MaybeInjectThreadLocalReadError(
954
+ const IOOptions& io_options, const char* op_name,
955
+ const std::string& file_name, std::function<std::string()> detail_fn,
956
+ ErrorOperation op, Slice* slice, bool direct_io, char* scratch,
957
+ bool need_count_increase, bool* fault_injected);
691
958
 
692
959
  bool ShouldExcludeFromWriteFaultInjection(const std::string& file_name) {
693
960
  MutexLock l(&mutex_);
@@ -0,0 +1,94 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
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 "utilities/fault_injection_fs.h"
7
+
8
+ #include <atomic>
9
+ #include <thread>
10
+ #include <vector>
11
+
12
+ #include "test_util/testharness.h"
13
+
14
+ namespace ROCKSDB_NAMESPACE {
15
+
16
+ class InjectedErrorLogTest : public testing::Test {};
17
+
18
+ // Test basic Record and PrintAll functionality.
19
+ TEST_F(InjectedErrorLogTest, BasicRecordAndPrint) {
20
+ InjectedErrorLog log;
21
+ log.SetLogFilePath("/dev/null");
22
+
23
+ // Record some entries.
24
+ log.Record("op=Get key=0x%08x status=%s", 0x12345678, "OK");
25
+ log.Record("op=Put key=0x%08x value_size=%d", 0xABCDEF00, 100);
26
+ log.Record("op=Delete key=0x%08x", 0x00000001);
27
+
28
+ // PrintAll should not crash.
29
+ log.PrintAll();
30
+ }
31
+
32
+ // Test that the circular buffer wraps correctly.
33
+ TEST_F(InjectedErrorLogTest, CircularBufferWrap) {
34
+ InjectedErrorLog log;
35
+ log.SetLogFilePath("/dev/null");
36
+
37
+ // Fill beyond kMaxEntries to trigger wraparound.
38
+ for (size_t i = 0; i < InjectedErrorLog::kMaxEntries + 100; i++) {
39
+ log.Record("entry=%zu", i);
40
+ }
41
+
42
+ // PrintAll should handle the wrapped buffer without crashing.
43
+ log.PrintAll();
44
+ }
45
+
46
+ // Test concurrent Record() from multiple threads.
47
+ // Keep total records (kNumThreads * kRecordsPerThread) under kMaxEntries
48
+ // to avoid write-write races from buffer wraparound, which are benign but
49
+ // would trigger TSAN warnings.
50
+ TEST_F(InjectedErrorLogTest, ConcurrentRecord) {
51
+ InjectedErrorLog log;
52
+ constexpr int kNumThreads = 4;
53
+ constexpr int kRecordsPerThread = 200;
54
+ static_assert(kNumThreads * kRecordsPerThread <
55
+ static_cast<int>(InjectedErrorLog::kMaxEntries),
56
+ "total records must stay within buffer to avoid TSAN-visible "
57
+ "write-write races on overlapping slots");
58
+
59
+ std::vector<std::thread> threads;
60
+ threads.reserve(kNumThreads);
61
+ for (int t = 0; t < kNumThreads; t++) {
62
+ threads.emplace_back([&log, t]() {
63
+ for (int i = 0; i < kRecordsPerThread; i++) {
64
+ log.Record("thread=%d iter=%d op=Get key=0x%08x", t, i, i * 17);
65
+ }
66
+ });
67
+ }
68
+
69
+ for (auto& t : threads) {
70
+ t.join();
71
+ }
72
+
73
+ // PrintAll after all threads are done -- no race.
74
+ log.SetLogFilePath("/dev/null");
75
+ log.PrintAll();
76
+ }
77
+
78
+ // Test HexHead utility.
79
+ TEST_F(InjectedErrorLogTest, HexHead) {
80
+ const char data[] = "\x01\x02\xAB\xCD";
81
+ std::string result = InjectedErrorLog::HexHead(data, 4);
82
+ ASSERT_EQ(result, "01 02 ab cd");
83
+
84
+ result = InjectedErrorLog::HexHead(data, 4, 2);
85
+ ASSERT_EQ(result, "01 02 ...");
86
+ }
87
+
88
+ } // namespace ROCKSDB_NAMESPACE
89
+
90
+ int main(int argc, char** argv) {
91
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
92
+ ::testing::InitGoogleTest(&argc, argv);
93
+ return RUN_ALL_TESTS();
94
+ }
@@ -24,7 +24,9 @@ class MemoryTest : public testing::Test {
24
24
 
25
25
  std::string GetDBName(int id) { return kDbDir + "db_" + std::to_string(id); }
26
26
 
27
- void UpdateUsagesHistory(const std::vector<DB*>& dbs) {
27
+ using DBVec = std::vector<std::unique_ptr<DB>>;
28
+
29
+ void UpdateUsagesHistory(const DBVec& dbs) {
28
30
  std::map<MemoryUtil::UsageType, uint64_t> usage_by_type;
29
31
  ASSERT_OK(GetApproximateMemoryUsageByType(dbs, &usage_by_type));
30
32
  for (int i = 0; i < MemoryUtil::kNumUsageTypes; ++i) {
@@ -33,16 +35,17 @@ class MemoryTest : public testing::Test {
33
35
  }
34
36
  }
35
37
 
36
- void GetCachePointers(const std::vector<DB*>& dbs,
38
+ void GetCachePointers(const DBVec& dbs,
37
39
  std::unordered_set<const Cache*>* cache_set) {
38
40
  cache_set->clear();
39
41
 
40
- for (auto* db : dbs) {
42
+ for (auto& db : dbs) {
41
43
  assert(db);
42
44
 
43
45
  // Cache from DBImpl
44
- StackableDB* sdb = dynamic_cast<StackableDB*>(db);
45
- DBImpl* db_impl = dynamic_cast<DBImpl*>(sdb ? sdb->GetBaseDB() : db);
46
+ StackableDB* sdb = dynamic_cast<StackableDB*>(db.get());
47
+ DBImpl* db_impl =
48
+ dynamic_cast<DBImpl*>(sdb ? sdb->GetBaseDB() : db.get());
46
49
  if (db_impl != nullptr) {
47
50
  cache_set->insert(db_impl->TEST_table_cache());
48
51
  }
@@ -58,7 +61,7 @@ class MemoryTest : public testing::Test {
58
61
  }
59
62
 
60
63
  Status GetApproximateMemoryUsageByType(
61
- const std::vector<DB*>& dbs,
64
+ const DBVec& dbs,
62
65
  std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type) {
63
66
  std::unordered_set<const Cache*> cache_set;
64
67
  GetCachePointers(dbs, &cache_set);
@@ -73,7 +76,7 @@ class MemoryTest : public testing::Test {
73
76
  };
74
77
 
75
78
  TEST_F(MemoryTest, SharedBlockCacheTotal) {
76
- std::vector<DB*> dbs;
79
+ std::vector<std::unique_ptr<DB>> dbs;
77
80
  std::vector<uint64_t> usage_by_type;
78
81
  const int kNumDBs = 10;
79
82
  const int kKeySize = 100;
@@ -88,9 +91,7 @@ TEST_F(MemoryTest, SharedBlockCacheTotal) {
88
91
  bbt_opts.block_cache = NewLRUCache(4096 * 1000 * 10);
89
92
  for (int i = 0; i < kNumDBs; ++i) {
90
93
  ASSERT_OK(DestroyDB(GetDBName(i), opt));
91
- DB* db = nullptr;
92
- ASSERT_OK(DB::Open(opt, GetDBName(i), &db));
93
- dbs.push_back(db);
94
+ ASSERT_OK(DB::Open(opt, GetDBName(i), &dbs.emplace_back()));
94
95
  }
95
96
 
96
97
  std::vector<std::string> keys_by_db[kNumDBs];
@@ -119,13 +120,10 @@ TEST_F(MemoryTest, SharedBlockCacheTotal) {
119
120
  ASSERT_EQ(usage_history_[MemoryUtil::kTableReadersTotal][i],
120
121
  usage_history_[MemoryUtil::kTableReadersTotal][i - 1]);
121
122
  }
122
- for (int i = 0; i < kNumDBs; ++i) {
123
- delete dbs[i];
124
- }
125
123
  }
126
124
 
127
125
  TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
128
- std::vector<DB*> dbs;
126
+ std::vector<std::unique_ptr<DB>> dbs;
129
127
  std::vector<uint64_t> usage_by_type;
130
128
  std::vector<std::vector<ColumnFamilyHandle*>> vec_handles;
131
129
  const int kNumDBs = 10;
@@ -150,10 +148,9 @@ TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
150
148
  for (int i = 0; i < kNumDBs; ++i) {
151
149
  ASSERT_OK(DestroyDB(GetDBName(i), opt));
152
150
  std::vector<ColumnFamilyHandle*> handles;
153
- dbs.emplace_back();
154
151
  vec_handles.emplace_back();
155
152
  ASSERT_OK(DB::Open(DBOptions(opt), GetDBName(i), cf_descs,
156
- &vec_handles.back(), &dbs.back()));
153
+ &vec_handles.back(), &dbs.emplace_back()));
157
154
  }
158
155
 
159
156
  // Fill one memtable per Put to make memtable use more memory.
@@ -237,7 +234,6 @@ TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
237
234
  for (auto* handle : vec_handles[i]) {
238
235
  delete handle;
239
236
  }
240
- delete dbs[i];
241
237
  }
242
238
  }
243
239
  } // namespace ROCKSDB_NAMESPACE
@@ -9,14 +9,15 @@
9
9
 
10
10
  namespace ROCKSDB_NAMESPACE {
11
11
 
12
+ template <typename DBPtr>
12
13
  Status MemoryUtil::GetApproximateMemoryUsageByType(
13
- const std::vector<DB*>& dbs,
14
+ const std::vector<DBPtr>& dbs,
14
15
  const std::unordered_set<const Cache*> cache_set,
15
16
  std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type) {
16
17
  usage_by_type->clear();
17
18
 
18
19
  // MemTable
19
- for (auto* db : dbs) {
20
+ for (auto& db : dbs) {
20
21
  uint64_t usage = 0;
21
22
  if (db->GetAggregatedIntProperty(DB::Properties::kSizeAllMemTables,
22
23
  &usage)) {
@@ -29,7 +30,7 @@ Status MemoryUtil::GetApproximateMemoryUsageByType(
29
30
  }
30
31
 
31
32
  // Table Readers
32
- for (auto* db : dbs) {
33
+ for (auto& db : dbs) {
33
34
  uint64_t usage = 0;
34
35
  if (db->GetAggregatedIntProperty(DB::Properties::kEstimateTableReadersMem,
35
36
  &usage)) {
@@ -46,4 +47,16 @@ Status MemoryUtil::GetApproximateMemoryUsageByType(
46
47
 
47
48
  return Status::OK();
48
49
  }
50
+
51
+ template Status MemoryUtil::GetApproximateMemoryUsageByType<DB*>(
52
+ const std::vector<DB*>& dbs,
53
+ const std::unordered_set<const Cache*> cache_set,
54
+ std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type);
55
+
56
+ template Status
57
+ MemoryUtil::GetApproximateMemoryUsageByType<std::unique_ptr<DB>>(
58
+ const std::vector<std::unique_ptr<DB>>& dbs,
59
+ const std::unordered_set<const Cache*> cache_set,
60
+ std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type);
61
+
49
62
  } // namespace ROCKSDB_NAMESPACE