@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
@@ -17,6 +17,7 @@
17
17
  #include "port/port.h"
18
18
  #include "port/stack_trace.h"
19
19
  #include "rocksdb/utilities/transaction_db.h"
20
+ #include "table/block_based/block_based_table_builder.h"
20
21
  #include "test_util/sync_point.h"
21
22
  #include "test_util/testutil.h"
22
23
  #include "util/cast_util.h"
@@ -33,6 +34,17 @@ static std::string NEW_VALUE = "NewValue";
33
34
  class DBFlushTest : public DBTestBase {
34
35
  public:
35
36
  DBFlushTest() : DBTestBase("db_flush_test", /*env_do_fsync=*/true) {}
37
+
38
+ // Wait for all background flush callbacks to complete before Close().
39
+ // Close() calls db_.reset() which nulls the unique_ptr before the destructor
40
+ // runs, so a concurrent OnFlushCompleted reading test_->db_ would race.
41
+ // WaitForCompact() waits for bg_flush_scheduled_==0 (which is decremented
42
+ // after listener callbacks return) without setting shutting_down_ (so
43
+ // callbacks are not skipped) and without requiring NumNotFlushed()==0 (which
44
+ // would hang when mempurge leaves a memtable in imm()).
45
+ Status WaitForFlushCallbacks() {
46
+ return db_->WaitForCompact(WaitForCompactOptions());
47
+ }
36
48
  };
37
49
 
38
50
  class DBFlushDirectIOTest : public DBFlushTest,
@@ -101,7 +113,7 @@ TEST_F(DBFlushTest, SyncFail) {
101
113
  TEST_SYNC_POINT("DBFlushTest::SyncFail:2");
102
114
  fault_injection_env->SetFilesystemActive(true);
103
115
  // Now the background job will do the flush; wait for it.
104
- // Returns the IO error happend during flush.
116
+ // Returns the IO error happened during flush.
105
117
  ASSERT_NOK(dbfull()->TEST_WaitForFlushMemTable());
106
118
  ASSERT_EQ("", FilesPerLevel()); // flush failed.
107
119
  Destroy(options);
@@ -518,11 +530,11 @@ TEST_F(DBFlushTest, StatisticsGarbageInsertAndDeletes) {
518
530
  // Note : one set of delete for KEY1, KEY2, KEY3 is written to
519
531
  // SSTable to propagate the delete operations to K-V pairs
520
532
  // that could have been inserted into the database during past Flush
521
- // opeartions.
533
+ // operations.
522
534
  EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
523
535
  KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
524
536
 
525
- // Additional useful paylaod.
537
+ // Additional useful payload.
526
538
  ASSERT_OK(Delete(KEY4));
527
539
  ASSERT_OK(Delete(KEY5));
528
540
  ASSERT_OK(Delete(KEY6));
@@ -614,7 +626,7 @@ TEST_F(DBFlushTest, StatisticsGarbageRangeDeletes) {
614
626
 
615
627
  // Note : one set of deleteRange for (KEY1, KEY2) and (KEY2, KEY3) is written
616
628
  // to SSTable to propagate the deleteRange operations to K-V pairs that could
617
- // have been inserted into the database during past Flush opeartions.
629
+ // have been inserted into the database during past Flush operations.
618
630
  EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
619
631
  (KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
620
632
  (KEY2.size() + KEY3.size() + sizeof(uint64_t));
@@ -709,7 +721,7 @@ class TestFlushListener : public EventListener {
709
721
  // that assumption does not hold (see the test case MultiDBMultiListeners
710
722
  // below).
711
723
  ASSERT_TRUE(test_);
712
- if (db == test_->db_) {
724
+ if (db == test_->db_.get()) {
713
725
  std::vector<std::vector<FileMetaData>> files_by_level;
714
726
  test_->dbfull()->TEST_GetFilesMetaData(db->DefaultColumnFamily(),
715
727
  &files_by_level);
@@ -842,7 +854,7 @@ TEST_F(DBFlushTest, FixFlushReasonRaceFromConcurrentFlushes) {
842
854
  ASSERT_OK(Put(1, Key(idx), std::string(1, 'v')));
843
855
  }
844
856
 
845
- // To coerce a manual flush happenning in the middle of GetLiveFiles's flush,
857
+ // To coerce a manual flush happening in the middle of GetLiveFiles's flush,
846
858
  // we need to pause background flush thread and enable it later.
847
859
  std::shared_ptr<test::SleepingBackgroundTask> sleeping_task =
848
860
  std::make_shared<test::SleepingBackgroundTask>();
@@ -851,7 +863,7 @@ TEST_F(DBFlushTest, FixFlushReasonRaceFromConcurrentFlushes) {
851
863
  sleeping_task.get(), Env::Priority::HIGH);
852
864
  sleeping_task->WaitUntilSleeping();
853
865
 
854
- // Coerce a manual flush happenning in the middle of GetLiveFiles's flush
866
+ // Coerce a manual flush happening in the middle of GetLiveFiles's flush
855
867
  bool get_live_files_paused_at_sync_point = false;
856
868
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
857
869
  "DBImpl::AtomicFlushMemTables:AfterScheduleFlush", [&](void* /* arg */) {
@@ -1055,6 +1067,7 @@ TEST_F(DBFlushTest, MemPurgeBasic) {
1055
1067
  ASSERT_EQ(Get(RNDKEY2), p_rv2);
1056
1068
  ASSERT_EQ(Get(RNDKEY3), p_rv3);
1057
1069
 
1070
+ ASSERT_OK(WaitForFlushCallbacks());
1058
1071
  Close();
1059
1072
  }
1060
1073
 
@@ -1169,6 +1182,7 @@ TEST_F(DBFlushTest, MemPurgeBasicToggle) {
1169
1182
  // We expect no mempurge at all.
1170
1183
  EXPECT_EQ(mempurge_count.exchange(0), ZERO);
1171
1184
 
1185
+ ASSERT_OK(WaitForFlushCallbacks());
1172
1186
  Close();
1173
1187
  }
1174
1188
  // End of MemPurgeBasicToggle, which is not
@@ -1425,10 +1439,11 @@ TEST_F(DBFlushTest, MemPurgeDeleteAndDeleteRange) {
1425
1439
  delete iter;
1426
1440
  }
1427
1441
 
1442
+ ASSERT_OK(WaitForFlushCallbacks());
1428
1443
  Close();
1429
1444
  }
1430
1445
 
1431
- // Create a Compaction Fitler that will be invoked
1446
+ // Create a Compaction Filter that will be invoked
1432
1447
  // at flush time and will update the value of a KV pair
1433
1448
  // if the key string is "lower" than the filter_key_ string.
1434
1449
  class ConditionalUpdateFilter : public CompactionFilter {
@@ -1879,6 +1894,85 @@ TEST_F(DBFlushTest, MemPurgeCorrectLogNumberAndSSTFileCreation) {
1879
1894
  Close();
1880
1895
  }
1881
1896
 
1897
+ // Reproduction for MemPurge memtable ID ordering bug.
1898
+ // When MemPurge runs, it releases db_mutex_. During that window, new
1899
+ // memtables can be switched to the immutable list with higher IDs. When
1900
+ // MemPurge re-acquires the mutex and adds its output memtable using the
1901
+ // stale ID from mems_.back(), the ordering assertion fires.
1902
+ TEST_F(DBFlushTest, MemPurgeIdOrdering) {
1903
+ Options options = CurrentOptions();
1904
+ options.create_if_missing = true;
1905
+ options.compression = kNoCompression;
1906
+ options.inplace_update_support = false;
1907
+ options.allow_concurrent_memtable_write = true;
1908
+ options.write_buffer_size = 1 << 20; // 1MB
1909
+ // Allow enough immutable memtables so writes don't stall while the
1910
+ // flush thread is paused in the sync point.
1911
+ options.max_write_buffer_number = 8;
1912
+ // Always attempt MemPurge on flush.
1913
+ options.experimental_mempurge_threshold = 1.0;
1914
+ ASSERT_OK(TryReopen(options));
1915
+
1916
+ // Coordinate via LoadDependency:
1917
+ // 1. Flush thread hits BeforeReacquireMutex -> foreground unblocks
1918
+ // 2. Foreground writes data, triggers memtable switch
1919
+ // 3. Foreground hits SwitchDone -> flush thread unblocks at
1920
+ // AfterWaitForTest
1921
+ // 4. Flush thread re-acquires mutex, tries AddMemTable with stale ID
1922
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1923
+ {{"FlushJob::MemPurge:BeforeReacquireMutex",
1924
+ "DBFlushTest::MemPurgeIdOrdering:StartWriting"},
1925
+ {"DBFlushTest::MemPurgeIdOrdering:SwitchDone",
1926
+ "FlushJob::MemPurge:AfterWaitForTest"}});
1927
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1928
+
1929
+ const int kValueSize = 10240; // 10KB values like MemPurgeBasic
1930
+ const int kNumKeys = 30;
1931
+ Random rnd(301);
1932
+
1933
+ // Fill the memtable with overwrites of the same keys so MemPurge
1934
+ // can compact them down (high garbage ratio). Each round is ~300KB,
1935
+ // need ~3 rounds to approach the 1MB write_buffer_size.
1936
+ for (int round = 0; round < 3; round++) {
1937
+ for (int i = 0; i < kNumKeys; i++) {
1938
+ ASSERT_OK(Put("key" + std::to_string(i), rnd.RandomString(kValueSize)));
1939
+ }
1940
+ }
1941
+
1942
+ // One more round should trigger a flush with MemPurge in the background.
1943
+ for (int i = 0; i < kNumKeys; i++) {
1944
+ ASSERT_OK(Put("key" + std::to_string(i), rnd.RandomString(kValueSize)));
1945
+ }
1946
+
1947
+ // Block until MemPurge reaches the sync point (db_mutex_ released).
1948
+ TEST_SYNC_POINT("DBFlushTest::MemPurgeIdOrdering:StartWriting");
1949
+
1950
+ // Now MemPurge is paused with db_mutex_ released. Write enough data
1951
+ // to fill another memtable and trigger a switch. This creates an
1952
+ // immutable memtable with a higher ID than the one being mempurged.
1953
+ for (int i = 0; i < kNumKeys * 4; i++) {
1954
+ ASSERT_OK(Put("newkey" + std::to_string(i), rnd.RandomString(kValueSize)));
1955
+ }
1956
+
1957
+ // Let MemPurge continue -- it will re-acquire the mutex and try to
1958
+ // add the output memtable with the stale ID.
1959
+ TEST_SYNC_POINT("DBFlushTest::MemPurgeIdOrdering:SwitchDone");
1960
+
1961
+ // Allow background work to finish.
1962
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
1963
+
1964
+ // If the bug is present, the assertion in AddMemTable fires before
1965
+ // we reach here.
1966
+ for (int i = 0; i < kNumKeys; i++) {
1967
+ ASSERT_NE(Get("key" + std::to_string(i)), "NOT_FOUND");
1968
+ }
1969
+
1970
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1971
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1972
+
1973
+ Close();
1974
+ }
1975
+
1882
1976
  TEST_P(DBFlushDirectIOTest, DirectIO) {
1883
1977
  Options options;
1884
1978
  options.create_if_missing = true;
@@ -2533,7 +2627,7 @@ TEST_F(DBFlushTest, TombstoneVisibleInSnapshot) {
2533
2627
 
2534
2628
  ASSERT_OK(db_->Put(WriteOptions(), "foo", "value0"));
2535
2629
 
2536
- ManagedSnapshot snapshot_guard(db_);
2630
+ ManagedSnapshot snapshot_guard(db_.get());
2537
2631
 
2538
2632
  ColumnFamilyHandle* default_cf = db_->DefaultColumnFamily();
2539
2633
  ASSERT_OK(db_->Flush(FlushOptions(), default_cf));
@@ -2574,7 +2668,7 @@ TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
2574
2668
  txn_db_opts.write_policy = TxnDBWritePolicy::WRITE_COMMITTED;
2575
2669
  ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, &txn_db));
2576
2670
  ASSERT_NE(txn_db, nullptr);
2577
- db_ = txn_db;
2671
+ db_.reset(txn_db);
2578
2672
 
2579
2673
  // Create two more columns other than default CF.
2580
2674
  std::vector<std::string> cfs = {"puppy", "kitty"};
@@ -2638,9 +2732,8 @@ TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
2638
2732
  // it means atomic flush didn't write the min_log_number_to_keep to MANIFEST.
2639
2733
  cfs.push_back(kDefaultColumnFamilyName);
2640
2734
  ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
2641
- DBImpl* db_impl = static_cast<DBImpl*>(db_);
2642
- ASSERT_TRUE(db_impl->allow_2pc());
2643
- ASSERT_NE(db_impl->MinLogNumberToKeep(), 0);
2735
+ ASSERT_TRUE(dbfull()->allow_2pc());
2736
+ ASSERT_NE(dbfull()->MinLogNumberToKeep(), 0);
2644
2737
  }
2645
2738
 
2646
2739
  TEST_P(DBAtomicFlushTest, ManualAtomicFlush) {
@@ -3707,6 +3800,55 @@ INSTANTIATE_TEST_CASE_P(
3707
3800
  // larger than the max allowed padding size
3708
3801
  testing::Values(4, kLowSpaceOverheadRatio)));
3709
3802
 
3803
+ // Test that when the table builder's io_status becomes bad during flush
3804
+ // (simulating write fault injection), BuildTable properly propagates the
3805
+ // builder's IO error instead of producing a misleading Corruption from the
3806
+ // num_entries mismatch check.
3807
+ TEST_F(DBFlushTest, BuilderWriteFaultPropagationDuringFlush) {
3808
+ Options options = CurrentOptions();
3809
+ options.flush_verify_memtable_count = true;
3810
+ options.table_factory.reset(
3811
+ NewBlockBasedTableFactory(BlockBasedTableOptions()));
3812
+
3813
+ DestroyAndReopen(options);
3814
+
3815
+ for (int i = 0; i < 100; i++) {
3816
+ ASSERT_OK(Put("key" + std::to_string(i),
3817
+ std::string(100, 'v') + std::to_string(i)));
3818
+ }
3819
+
3820
+ // Skip all Add() calls to simulate entries not being committed (builder
3821
+ // stays empty), as happens when fault injection causes early returns.
3822
+ SyncPoint::GetInstance()->SetCallBack(
3823
+ "BlockBasedTableBuilder::Add::skip",
3824
+ [&](void* skip) { *(bool*)skip = true; });
3825
+
3826
+ // Inject an IOError into the builder's status before the empty check.
3827
+ // This simulates the scenario where write fault injection puts the builder
3828
+ // in an error state, causing all Add() calls to return early (ok() is false)
3829
+ // and leaving the builder empty.
3830
+ SyncPoint::GetInstance()->SetCallBack(
3831
+ "BuildTable:BeforeCheckEmpty", [&](void* arg) {
3832
+ auto* builder = static_cast<BlockBasedTableBuilder*>(
3833
+ static_cast<TableBuilder*>(arg));
3834
+ builder->TEST_InjectIOError();
3835
+ });
3836
+ SyncPoint::GetInstance()->EnableProcessing();
3837
+
3838
+ Status s = Flush();
3839
+
3840
+ SyncPoint::GetInstance()->DisableProcessing();
3841
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3842
+
3843
+ // With the fix, the builder's IOError is propagated instead of the
3844
+ // misleading Corruption from the key count mismatch check.
3845
+ ASSERT_NOK(s);
3846
+ ASSERT_TRUE(s.IsIOError())
3847
+ << "Expected IOError from builder error propagation, got: "
3848
+ << s.ToString();
3849
+
3850
+ Close();
3851
+ }
3710
3852
  } // namespace ROCKSDB_NAMESPACE
3711
3853
 
3712
3854
  int main(int argc, char** argv) {
@@ -91,8 +91,21 @@ Status CompactedDBImpl::Get(const ReadOptions& _read_options,
91
91
  /*b_has_ts=*/false) < 0) {
92
92
  return Status::NotFound();
93
93
  }
94
- Status s = f.fd.table_reader->Get(read_options, lkey.internal_key(),
95
- &get_context, nullptr);
94
+ TableReader* t = nullptr;
95
+ TableCache::TypedHandle* handle = nullptr;
96
+ Status s = cfd_->table_cache()->FindTable(
97
+ read_options, cfd_->table_cache()->file_options(),
98
+ cfd_->internal_comparator(), *f.file_metadata, &handle,
99
+ version_->GetMutableCFOptions(), &t, false /* no_io */,
100
+ nullptr /* file_read_hist */, false /* skip_filters */, files_level_,
101
+ true /* prefetch_index_and_filter_in_cache */,
102
+ 0 /* max_file_size_for_l0_meta_pin */, f.file_metadata->temperature,
103
+ true /* pin_table_handle */);
104
+ if (s.ok()) {
105
+ assert(handle == nullptr);
106
+ // Use TableReader directly to avoid extra table_cache->Get() overheads
107
+ s = t->Get(read_options, lkey.internal_key(), &get_context, nullptr);
108
+ }
96
109
  if (!s.ok() && !s.IsNotFound()) {
97
110
  return s;
98
111
  }
@@ -152,7 +165,6 @@ void CompactedDBImpl::MultiGet(const ReadOptions& _read_options,
152
165
  }
153
166
 
154
167
  GetWithTimestampReadCallback read_cb(kMaxSequenceNumber);
155
- autovector<TableReader*, 16> reader_list;
156
168
  for (size_t i = 0; i < num_keys; ++i) {
157
169
  const Slice& key = keys[i];
158
170
  LookupKey lkey(key, kMaxSequenceNumber, read_options.timestamp);
@@ -162,38 +174,40 @@ void CompactedDBImpl::MultiGet(const ReadOptions& _read_options,
162
174
  ExtractUserKeyAndStripTimestamp(f.smallest_key,
163
175
  user_comparator_->timestamp_size()),
164
176
  /*b_has_ts=*/false) < 0) {
165
- reader_list.push_back(nullptr);
166
- } else {
167
- f.fd.table_reader->Prepare(lkey.internal_key());
168
- reader_list.push_back(f.fd.table_reader);
177
+ statuses[i] = Status::NotFound();
178
+ continue;
169
179
  }
170
- }
171
- for (size_t i = 0; i < num_keys; ++i) {
172
- statuses[i] = Status::NotFound();
173
- }
174
- int idx = 0;
175
- for (auto* r : reader_list) {
176
- if (r != nullptr) {
177
- PinnableSlice& pinnable_val = values[idx];
178
- LookupKey lkey(keys[idx], kMaxSequenceNumber, read_options.timestamp);
179
- std::string* timestamp = timestamps ? &timestamps[idx] : nullptr;
180
- GetContext get_context(
181
- user_comparator_, nullptr, nullptr, nullptr, GetContext::kNotFound,
182
- lkey.user_key(), &pinnable_val, /*columns=*/nullptr,
183
- user_comparator_->timestamp_size() > 0 ? timestamp : nullptr, nullptr,
184
- nullptr, true, nullptr, nullptr, nullptr, nullptr, &read_cb);
185
- Status status =
186
- r->Get(read_options, lkey.internal_key(), &get_context, nullptr);
187
- assert(static_cast<size_t>(idx) < num_keys);
188
- if (!status.ok() && !status.IsNotFound()) {
189
- statuses[idx] = status;
180
+ PinnableSlice& pinnable_val = values[i];
181
+ std::string* timestamp = timestamps ? &timestamps[i] : nullptr;
182
+ GetContext get_context(
183
+ user_comparator_, nullptr, nullptr, nullptr, GetContext::kNotFound,
184
+ lkey.user_key(), &pinnable_val, /*columns=*/nullptr,
185
+ user_comparator_->timestamp_size() > 0 ? timestamp : nullptr, nullptr,
186
+ nullptr, true, nullptr, nullptr, nullptr, nullptr, &read_cb);
187
+ TableReader* t = nullptr;
188
+ TableCache::TypedHandle* handle = nullptr;
189
+ Status status = cfd_->table_cache()->FindTable(
190
+ read_options, cfd_->table_cache()->file_options(),
191
+ cfd_->internal_comparator(), *f.file_metadata, &handle,
192
+ version_->GetMutableCFOptions(), &t, false /* no_io */,
193
+ nullptr /* file_read_hist */, false /* skip_filters */, files_level_,
194
+ true /* prefetch_index_and_filter_in_cache */,
195
+ 0 /* max_file_size_for_l0_meta_pin */, f.file_metadata->temperature,
196
+ true /* pin_table_handle */);
197
+ if (status.ok()) {
198
+ assert(handle == nullptr);
199
+ // Use TableReader directly to avoid extra table_cache->Get() overheads
200
+ status = t->Get(read_options, lkey.internal_key(), &get_context, nullptr);
201
+ }
202
+ if (!status.ok() && !status.IsNotFound()) {
203
+ statuses[i] = status;
204
+ } else {
205
+ if (get_context.State() == GetContext::kFound) {
206
+ statuses[i] = Status::OK();
190
207
  } else {
191
- if (get_context.State() == GetContext::kFound) {
192
- statuses[idx] = Status::OK();
193
- }
208
+ statuses[i] = Status::NotFound();
194
209
  }
195
210
  }
196
- ++idx;
197
211
  }
198
212
  }
199
213
 
@@ -230,6 +244,7 @@ Status CompactedDBImpl::Init(const Options& options) {
230
244
  return Status::NotSupported("Both L0 and other level contain files");
231
245
  }
232
246
  files_ = l0;
247
+ files_level_ = 0;
233
248
  return Status::OK();
234
249
  }
235
250
 
@@ -242,6 +257,7 @@ Status CompactedDBImpl::Init(const Options& options) {
242
257
  int level = vstorage->num_non_empty_levels() - 1;
243
258
  if (vstorage->LevelFilesBrief(level).num_files > 0) {
244
259
  files_ = vstorage->LevelFilesBrief(level);
260
+ files_level_ = level;
245
261
  return Status::OK();
246
262
  }
247
263
  return Status::NotSupported("no file exists");
@@ -261,6 +277,13 @@ Status CompactedDBImpl::Open(const Options& options, const std::string& dbname,
261
277
  std::unique_ptr<CompactedDBImpl> db(new CompactedDBImpl(db_options, dbname));
262
278
  Status s = db->Init(options);
263
279
  if (s.ok()) {
280
+ {
281
+ InstrumentedMutexLock l(&db->mutex_);
282
+ db->opened_successfully_ = true;
283
+ if (db->immutable_db_options_.open_files_async) {
284
+ db->ScheduleAsyncFileOpening();
285
+ }
286
+ }
264
287
  s = db->StartPeriodicTaskScheduler();
265
288
  }
266
289
  if (s.ok()) {
@@ -143,5 +143,6 @@ class CompactedDBImpl : public DBImpl {
143
143
  Version* version_;
144
144
  const Comparator* user_comparator_;
145
145
  LevelFilesBrief files_;
146
+ int files_level_{0};
146
147
  };
147
148
  } // namespace ROCKSDB_NAMESPACE