@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
@@ -91,17 +91,15 @@ class DBBasicTest : public DBTestBase {
91
91
  TEST_F(DBBasicTest, OpenWhenOpen) {
92
92
  Options options = CurrentOptions();
93
93
  options.env = env_;
94
- DB* db2 = nullptr;
94
+ std::unique_ptr<DB> db2;
95
95
  Status s = DB::Open(options, dbname_, &db2);
96
- ASSERT_NOK(s) << [db2]() {
97
- delete db2;
96
+ ASSERT_NOK(s) << [&db2]() {
97
+ db2.reset();
98
98
  return "db2 open: ok";
99
99
  }();
100
100
  ASSERT_EQ(Status::Code::kIOError, s.code());
101
101
  ASSERT_EQ(Status::SubCode::kNone, s.subcode());
102
102
  ASSERT_TRUE(strstr(s.getState(), "lock ") != nullptr);
103
-
104
- delete db2;
105
103
  }
106
104
 
107
105
  TEST_F(DBBasicTest, EnableDirectIOWithZeroBuf) {
@@ -242,6 +240,43 @@ TEST_F(DBBasicTest, ReadOnlyDB) {
242
240
  Status::Code::kNotSupported);
243
241
  }
244
242
 
243
+ TEST_F(DBBasicTest, ReadOnlyDBFlushWAL) {
244
+ // Test that FlushWAL returns NotSupported on read-only DB, and that
245
+ // GetLiveFilesStorageInfo works correctly even with manual_wal_flush=true.
246
+ // This is a regression test for a bug where GetLiveFilesStorageInfo would
247
+ // crash on read-only DBs with manual_wal_flush=true because FlushWAL
248
+ // accessed logs_.back() on an empty deque.
249
+ auto options = CurrentOptions();
250
+ options.manual_wal_flush = true;
251
+ DestroyAndReopen(options);
252
+ ASSERT_OK(Put("foo", "v1"));
253
+ ASSERT_OK(Put("bar", "v2"));
254
+ ASSERT_OK(Flush());
255
+ ASSERT_OK(Put("baz", "v3")); // Unflushed data in WAL
256
+ Close();
257
+
258
+ // Reopen as read-only
259
+ ASSERT_OK(ReadOnlyReopen(options));
260
+ ASSERT_EQ("v1", Get("foo"));
261
+ ASSERT_EQ("v2", Get("bar"));
262
+ ASSERT_EQ("v3", Get("baz"));
263
+
264
+ // FlushWAL should return NotSupported (not crash)
265
+ ASSERT_EQ(db_->FlushWAL(/*sync=*/false).code(), Status::Code::kNotSupported);
266
+ ASSERT_EQ(db_->FlushWAL(/*sync=*/true).code(), Status::Code::kNotSupported);
267
+
268
+ // GetLiveFilesStorageInfo should succeed (previously crashed with
269
+ // manual_wal_flush=true because it called FlushWAL which accessed
270
+ // logs_.back() on empty deque)
271
+ LiveFilesStorageInfoOptions lfsi_opts;
272
+ lfsi_opts.wal_size_for_flush = 0;
273
+ std::vector<LiveFileStorageInfo> files;
274
+ ASSERT_OK(db_->GetLiveFilesStorageInfo(lfsi_opts, &files));
275
+ ASSERT_GT(files.size(), 0);
276
+
277
+ Close();
278
+ }
279
+
245
280
  TEST_F(DBBasicTest, ReadOnlyDBWithWriteDBIdToManifestSet) {
246
281
  auto options = CurrentOptions();
247
282
  options.write_dbid_to_manifest = false;
@@ -549,14 +584,14 @@ TEST_F(DBBasicTest, GetSnapshot) {
549
584
 
550
585
  TEST_F(DBBasicTest, CheckLock) {
551
586
  do {
552
- DB* localdb = nullptr;
587
+ std::unique_ptr<DB> localdb;
553
588
  Options options = CurrentOptions();
554
589
  ASSERT_OK(TryReopen(options));
555
590
 
556
591
  // second open should fail
557
592
  Status s = DB::Open(options, dbname_, &localdb);
558
- ASSERT_NOK(s) << [localdb]() {
559
- delete localdb;
593
+ ASSERT_NOK(s) << [&localdb]() {
594
+ localdb.reset();
560
595
  return "localdb open: ok";
561
596
  }();
562
597
  #ifdef OS_LINUX
@@ -825,7 +860,7 @@ TEST_F(DBBasicTest, Snapshot) {
825
860
  ASSERT_OK(Put(1, "foo", "1v3"));
826
861
 
827
862
  {
828
- ManagedSnapshot s3(db_);
863
+ ManagedSnapshot s3(db_.get());
829
864
  ASSERT_EQ(3U, GetNumSnapshots());
830
865
  ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
831
866
  ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
@@ -948,7 +983,7 @@ TEST_F(DBBasicTest, DBOpen_Options) {
948
983
  Destroy(options);
949
984
 
950
985
  // Does not exist, and create_if_missing == false: error
951
- DB* db = nullptr;
986
+ std::unique_ptr<DB> db;
952
987
  options.create_if_missing = false;
953
988
  Status s = DB::Open(options, dbname_, &db);
954
989
  ASSERT_TRUE(strstr(s.ToString().c_str(), "does not exist") != nullptr);
@@ -960,8 +995,7 @@ TEST_F(DBBasicTest, DBOpen_Options) {
960
995
  ASSERT_OK(s);
961
996
  ASSERT_TRUE(db != nullptr);
962
997
 
963
- delete db;
964
- db = nullptr;
998
+ db.reset();
965
999
 
966
1000
  // Does exist, and error_if_exists == true: error
967
1001
  options.create_if_missing = false;
@@ -977,8 +1011,7 @@ TEST_F(DBBasicTest, DBOpen_Options) {
977
1011
  ASSERT_OK(s);
978
1012
  ASSERT_TRUE(db != nullptr);
979
1013
 
980
- delete db;
981
- db = nullptr;
1014
+ db.reset();
982
1015
  }
983
1016
 
984
1017
  TEST_F(DBBasicTest, CompactOnFlush) {
@@ -1283,7 +1316,7 @@ TEST_F(DBBasicTest, DBClose) {
1283
1316
  std::string dbname = test::PerThreadDBPath("db_close_test");
1284
1317
  ASSERT_OK(DestroyDB(dbname, options));
1285
1318
 
1286
- DB* db = nullptr;
1319
+ std::unique_ptr<DB> db;
1287
1320
  TestEnv* env = new TestEnv(env_);
1288
1321
  std::unique_ptr<TestEnv> local_env_guard(env);
1289
1322
  options.create_if_missing = true;
@@ -1296,14 +1329,14 @@ TEST_F(DBBasicTest, DBClose) {
1296
1329
  ASSERT_EQ(env->GetCloseCount(), 1);
1297
1330
  ASSERT_EQ(s, Status::IOError());
1298
1331
 
1299
- delete db;
1332
+ db.reset();
1300
1333
  ASSERT_EQ(env->GetCloseCount(), 1);
1301
1334
 
1302
1335
  // Do not call DB::Close() and ensure our logger Close() still gets called
1303
1336
  s = DB::Open(options, dbname, &db);
1304
1337
  ASSERT_OK(s);
1305
1338
  ASSERT_TRUE(db != nullptr);
1306
- delete db;
1339
+ db.reset();
1307
1340
  ASSERT_EQ(env->GetCloseCount(), 2);
1308
1341
 
1309
1342
  // close by WaitForCompact() with close_db option
@@ -1318,7 +1351,7 @@ TEST_F(DBBasicTest, DBClose) {
1318
1351
  // see TestLogger::CloseHelper()
1319
1352
  ASSERT_EQ(s, Status::IOError());
1320
1353
 
1321
- delete db;
1354
+ db.reset();
1322
1355
  ASSERT_EQ(env->GetCloseCount(), 3);
1323
1356
 
1324
1357
  // Provide our own logger and ensure DB::Close() does not close it
@@ -1329,7 +1362,7 @@ TEST_F(DBBasicTest, DBClose) {
1329
1362
 
1330
1363
  s = db->Close();
1331
1364
  ASSERT_EQ(s, Status::OK());
1332
- delete db;
1365
+ db.reset();
1333
1366
  ASSERT_EQ(env->GetCloseCount(), 3);
1334
1367
  options.info_log.reset();
1335
1368
  ASSERT_EQ(env->GetCloseCount(), 4);
@@ -1347,7 +1380,7 @@ TEST_F(DBBasicTest, DBCloseAllDirectoryFDs) {
1347
1380
 
1348
1381
  ASSERT_OK(DestroyDB(dbname, options));
1349
1382
 
1350
- DB* db = nullptr;
1383
+ std::unique_ptr<DB> db;
1351
1384
  std::unique_ptr<Env> env = NewCompositeEnv(
1352
1385
  std::make_shared<CountedFileSystem>(FileSystem::Default()));
1353
1386
  options.create_if_missing = true;
@@ -1365,7 +1398,7 @@ TEST_F(DBBasicTest, DBCloseAllDirectoryFDs) {
1365
1398
  ASSERT_EQ(counted_fs->counters()->dir_opens,
1366
1399
  counted_fs->counters()->dir_closes);
1367
1400
  ASSERT_OK(s);
1368
- delete db;
1401
+ db.reset();
1369
1402
  }
1370
1403
 
1371
1404
  TEST_F(DBBasicTest, DBCloseFlushError) {
@@ -1427,7 +1460,7 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1427
1460
  }
1428
1461
 
1429
1462
  int get_sv_count = 0;
1430
- ROCKSDB_NAMESPACE::DBImpl* db = static_cast_with_check<DBImpl>(db_);
1463
+ ROCKSDB_NAMESPACE::DBImpl* db = dbfull();
1431
1464
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1432
1465
  "DBImpl::MultiCFSnapshot::AfterRefSV", [&](void* /*arg*/) {
1433
1466
  if (++get_sv_count == 2) {
@@ -1499,10 +1532,9 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1499
1532
  ASSERT_EQ(values[2], std::get<2>(cf_kv_vec[1]) + "_2");
1500
1533
 
1501
1534
  for (int cf = 0; cf < 8; ++cf) {
1502
- auto* cfd =
1503
- static_cast_with_check<ColumnFamilyHandleImpl>(
1504
- static_cast_with_check<DBImpl>(db_)->GetColumnFamilyHandle(cf))
1505
- ->cfd();
1535
+ auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(
1536
+ dbfull()->GetColumnFamilyHandle(cf))
1537
+ ->cfd();
1506
1538
  ASSERT_NE(cfd->TEST_GetLocalSV()->Get(), SuperVersion::kSVInUse);
1507
1539
  ASSERT_NE(cfd->TEST_GetLocalSV()->Get(), SuperVersion::kSVObsolete);
1508
1540
  }
@@ -1588,10 +1620,9 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFMutex) {
1588
1620
  "cf" + std::to_string(j) + "_val" + std::to_string(retries));
1589
1621
  }
1590
1622
  for (int i = 0; i < 8; ++i) {
1591
- auto* cfd =
1592
- static_cast_with_check<ColumnFamilyHandleImpl>(
1593
- static_cast_with_check<DBImpl>(db_)->GetColumnFamilyHandle(i))
1594
- ->cfd();
1623
+ auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(
1624
+ dbfull()->GetColumnFamilyHandle(i))
1625
+ ->cfd();
1595
1626
  ASSERT_NE(cfd->TEST_GetLocalSV()->Get(), SuperVersion::kSVInUse);
1596
1627
  }
1597
1628
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
@@ -1615,7 +1646,7 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFSnapshot) {
1615
1646
  }
1616
1647
 
1617
1648
  int get_sv_count = 0;
1618
- ROCKSDB_NAMESPACE::DBImpl* db = static_cast_with_check<DBImpl>(db_);
1649
+ ROCKSDB_NAMESPACE::DBImpl* db = dbfull();
1619
1650
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1620
1651
  "DBImpl::MultiCFSnapshot::AfterRefSV", [&](void* /*arg*/) {
1621
1652
  if (++get_sv_count == 2) {
@@ -1656,10 +1687,9 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFSnapshot) {
1656
1687
  ASSERT_EQ(values[j], "cf" + std::to_string(j) + "_val");
1657
1688
  }
1658
1689
  for (int i = 0; i < 8; ++i) {
1659
- auto* cfd =
1660
- static_cast_with_check<ColumnFamilyHandleImpl>(
1661
- static_cast_with_check<DBImpl>(db_)->GetColumnFamilyHandle(i))
1662
- ->cfd();
1690
+ auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(
1691
+ dbfull()->GetColumnFamilyHandle(i))
1692
+ ->cfd();
1663
1693
  ASSERT_NE(cfd->TEST_GetLocalSV()->Get(), SuperVersion::kSVInUse);
1664
1694
  }
1665
1695
  }
@@ -2505,6 +2535,319 @@ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedValueSizeMultiLevelMerge) {
2505
2535
  }
2506
2536
  }
2507
2537
 
2538
+ TEST_P(DBMultiGetTestWithParam, MultiGetMemtableBatchLookup) {
2539
+ #ifndef USE_COROUTINES
2540
+ if (std::get<1>(GetParam())) {
2541
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2542
+ return;
2543
+ }
2544
+ #endif // USE_COROUTINES
2545
+ // Skip for unbatched MultiGet
2546
+ if (!std::get<0>(GetParam())) {
2547
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2548
+ return;
2549
+ }
2550
+ Options options = CurrentOptions();
2551
+ options.memtable_batch_lookup_optimization = true;
2552
+ CreateAndReopenWithCF({"pikachu"}, options);
2553
+
2554
+ // Insert sorted keys into memtable
2555
+ for (int i = 0; i < 100; i++) {
2556
+ ASSERT_OK(Put(1, Key(i), "val" + std::to_string(i)));
2557
+ }
2558
+ // Delete some keys
2559
+ ASSERT_OK(Delete(1, Key(25)));
2560
+ ASSERT_OK(Delete(1, Key(75)));
2561
+
2562
+ // MultiGet a batch of keys - mix of existing, deleted, and missing
2563
+ // Store key strings to keep Slice data alive
2564
+ std::vector<std::string> key_strs = {Key(0), Key(10), Key(25), Key(50),
2565
+ Key(75), Key(99), Key(200)};
2566
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2567
+
2568
+ std::vector<PinnableSlice> values(keys.size());
2569
+ std::vector<Status> statuses(keys.size());
2570
+
2571
+ ReadOptions ro;
2572
+ ro.async_io = std::get<1>(GetParam());
2573
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2574
+ statuses.data(), true);
2575
+
2576
+ ASSERT_OK(statuses[0]);
2577
+ ASSERT_EQ(values[0].ToString(), "val0");
2578
+ ASSERT_OK(statuses[1]);
2579
+ ASSERT_EQ(values[1].ToString(), "val10");
2580
+ ASSERT_TRUE(statuses[2].IsNotFound()); // deleted
2581
+ ASSERT_OK(statuses[3]);
2582
+ ASSERT_EQ(values[3].ToString(), "val50");
2583
+ ASSERT_TRUE(statuses[4].IsNotFound()); // deleted
2584
+ ASSERT_OK(statuses[5]);
2585
+ ASSERT_EQ(values[5].ToString(), "val99");
2586
+ ASSERT_TRUE(statuses[6].IsNotFound()); // never inserted
2587
+ }
2588
+
2589
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchLookupOverwrite) {
2590
+ #ifndef USE_COROUTINES
2591
+ if (std::get<1>(GetParam())) {
2592
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2593
+ return;
2594
+ }
2595
+ #endif // USE_COROUTINES
2596
+ if (!std::get<0>(GetParam())) {
2597
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2598
+ return;
2599
+ }
2600
+ Options options = CurrentOptions();
2601
+ options.memtable_batch_lookup_optimization = true;
2602
+ CreateAndReopenWithCF({"pikachu"}, options);
2603
+
2604
+ // Insert, then overwrite some keys
2605
+ for (int i = 0; i < 50; i++) {
2606
+ ASSERT_OK(Put(1, Key(i), "old" + std::to_string(i)));
2607
+ }
2608
+ for (int i = 0; i < 50; i += 5) {
2609
+ ASSERT_OK(Put(1, Key(i), "new" + std::to_string(i)));
2610
+ }
2611
+
2612
+ std::vector<std::string> key_strs;
2613
+ for (int i = 0; i < 50; i += 5) {
2614
+ key_strs.push_back(Key(i));
2615
+ }
2616
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2617
+ std::vector<PinnableSlice> values(keys.size());
2618
+ std::vector<Status> statuses(keys.size());
2619
+
2620
+ ReadOptions ro;
2621
+ ro.async_io = std::get<1>(GetParam());
2622
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2623
+ statuses.data(), true);
2624
+
2625
+ for (size_t i = 0; i < keys.size(); i++) {
2626
+ ASSERT_OK(statuses[i]);
2627
+ ASSERT_EQ(values[i].ToString(), "new" + std::to_string(i * 5));
2628
+ }
2629
+ }
2630
+
2631
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchLookupWithFlush) {
2632
+ #ifndef USE_COROUTINES
2633
+ if (std::get<1>(GetParam())) {
2634
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2635
+ return;
2636
+ }
2637
+ #endif // USE_COROUTINES
2638
+ if (!std::get<0>(GetParam())) {
2639
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2640
+ return;
2641
+ }
2642
+ Options options = CurrentOptions();
2643
+ options.memtable_batch_lookup_optimization = true;
2644
+ CreateAndReopenWithCF({"pikachu"}, options);
2645
+
2646
+ // Put data into SST
2647
+ for (int i = 0; i < 50; i++) {
2648
+ ASSERT_OK(Put(1, Key(i), "sst" + std::to_string(i)));
2649
+ }
2650
+ ASSERT_OK(Flush(1));
2651
+
2652
+ // Put different data into memtable (overlapping some keys)
2653
+ for (int i = 25; i < 75; i++) {
2654
+ ASSERT_OK(Put(1, Key(i), "mem" + std::to_string(i)));
2655
+ }
2656
+
2657
+ // MultiGet keys spanning both SST and memtable
2658
+ std::vector<std::string> key_strs = {Key(10), Key(30), Key(60), Key(80)};
2659
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2660
+
2661
+ std::vector<PinnableSlice> values(keys.size());
2662
+ std::vector<Status> statuses(keys.size());
2663
+
2664
+ ReadOptions ro;
2665
+ ro.async_io = std::get<1>(GetParam());
2666
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2667
+ statuses.data(), true);
2668
+
2669
+ ASSERT_OK(statuses[0]);
2670
+ ASSERT_EQ(values[0].ToString(), "sst10");
2671
+ ASSERT_OK(statuses[1]);
2672
+ ASSERT_EQ(values[1].ToString(), "mem30");
2673
+ ASSERT_OK(statuses[2]);
2674
+ ASSERT_EQ(values[2].ToString(), "mem60");
2675
+ ASSERT_TRUE(statuses[3].IsNotFound());
2676
+ }
2677
+
2678
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchLookupWithMerge) {
2679
+ #ifndef USE_COROUTINES
2680
+ if (std::get<1>(GetParam())) {
2681
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2682
+ return;
2683
+ }
2684
+ #endif // USE_COROUTINES
2685
+ if (!std::get<0>(GetParam())) {
2686
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2687
+ return;
2688
+ }
2689
+ Options options = CurrentOptions();
2690
+ options.memtable_batch_lookup_optimization = true;
2691
+ options.merge_operator = MergeOperators::CreateStringAppendOperator();
2692
+ CreateAndReopenWithCF({"pikachu"}, options);
2693
+
2694
+ // Put base values
2695
+ ASSERT_OK(Put(1, Key(1), "a"));
2696
+ ASSERT_OK(Put(1, Key(2), "x"));
2697
+ // Merge on top
2698
+ ASSERT_OK(Merge(1, Key(1), "b"));
2699
+ ASSERT_OK(Merge(1, Key(1), "c"));
2700
+ ASSERT_OK(Merge(1, Key(2), "y"));
2701
+
2702
+ std::vector<std::string> key_strs = {Key(1), Key(2), Key(3)};
2703
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2704
+
2705
+ std::vector<PinnableSlice> values(keys.size());
2706
+ std::vector<Status> statuses(keys.size());
2707
+
2708
+ ReadOptions ro;
2709
+ ro.async_io = std::get<1>(GetParam());
2710
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2711
+ statuses.data(), true);
2712
+
2713
+ ASSERT_OK(statuses[0]);
2714
+ ASSERT_EQ(values[0].ToString(), "a,b,c");
2715
+ ASSERT_OK(statuses[1]);
2716
+ ASSERT_EQ(values[1].ToString(), "x,y");
2717
+ ASSERT_TRUE(statuses[2].IsNotFound());
2718
+ }
2719
+
2720
+ TEST_F(DBBasicTest, MultiGetBatchLookupDisabledByDefault) {
2721
+ // Verify that finger search is off by default and MultiGet still works
2722
+ Options options = CurrentOptions();
2723
+ ASSERT_FALSE(options.memtable_batch_lookup_optimization);
2724
+ CreateAndReopenWithCF({"pikachu"}, options);
2725
+
2726
+ ASSERT_OK(Put(1, "k1", "v1"));
2727
+ ASSERT_OK(Put(1, "k2", "v2"));
2728
+
2729
+ std::vector<Slice> keys = {"k1", "k2", "k3"};
2730
+ std::vector<PinnableSlice> values(3);
2731
+ std::vector<Status> statuses(3);
2732
+
2733
+ db_->MultiGet(ReadOptions(), handles_[1], 3, keys.data(), values.data(),
2734
+ statuses.data(), true);
2735
+
2736
+ ASSERT_OK(statuses[0]);
2737
+ ASSERT_EQ(values[0].ToString(), "v1");
2738
+ ASSERT_OK(statuses[1]);
2739
+ ASSERT_EQ(values[1].ToString(), "v2");
2740
+ ASSERT_TRUE(statuses[2].IsNotFound());
2741
+ }
2742
+
2743
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchLookupWithParanoid) {
2744
+ #ifndef USE_COROUTINES
2745
+ if (std::get<1>(GetParam())) {
2746
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2747
+ return;
2748
+ }
2749
+ #endif // USE_COROUTINES
2750
+ if (!std::get<0>(GetParam())) {
2751
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2752
+ return;
2753
+ }
2754
+ Options options = CurrentOptions();
2755
+ options.memtable_batch_lookup_optimization = true;
2756
+ options.paranoid_memory_checks = true;
2757
+ CreateAndReopenWithCF({"pikachu"}, options);
2758
+
2759
+ // Insert sorted keys into memtable
2760
+ for (int i = 0; i < 100; i++) {
2761
+ ASSERT_OK(Put(1, Key(i), "val" + std::to_string(i)));
2762
+ }
2763
+ ASSERT_OK(Delete(1, Key(25)));
2764
+
2765
+ // MultiGet with both batch optimization and paranoid checks enabled
2766
+ std::vector<std::string> key_strs = {Key(0), Key(10), Key(25),
2767
+ Key(50), Key(99), Key(200)};
2768
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2769
+
2770
+ std::vector<PinnableSlice> values(keys.size());
2771
+ std::vector<Status> statuses(keys.size());
2772
+
2773
+ ReadOptions ro;
2774
+ ro.async_io = std::get<1>(GetParam());
2775
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2776
+ statuses.data(), true);
2777
+
2778
+ ASSERT_OK(statuses[0]);
2779
+ ASSERT_EQ(values[0].ToString(), "val0");
2780
+ ASSERT_OK(statuses[1]);
2781
+ ASSERT_EQ(values[1].ToString(), "val10");
2782
+ ASSERT_TRUE(statuses[2].IsNotFound()); // deleted
2783
+ ASSERT_OK(statuses[3]);
2784
+ ASSERT_EQ(values[3].ToString(), "val50");
2785
+ ASSERT_OK(statuses[4]);
2786
+ ASSERT_EQ(values[4].ToString(), "val99");
2787
+ ASSERT_TRUE(statuses[5].IsNotFound()); // never inserted
2788
+ }
2789
+
2790
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchLookupSnapshot) {
2791
+ #ifndef USE_COROUTINES
2792
+ if (std::get<1>(GetParam())) {
2793
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
2794
+ return;
2795
+ }
2796
+ #endif // USE_COROUTINES
2797
+ if (!std::get<0>(GetParam())) {
2798
+ ROCKSDB_GTEST_BYPASS("This test is only for batched MultiGet");
2799
+ return;
2800
+ }
2801
+ Options options = CurrentOptions();
2802
+ options.memtable_batch_lookup_optimization = true;
2803
+ CreateAndReopenWithCF({"pikachu"}, options);
2804
+
2805
+ ASSERT_OK(Put(1, Key(1), "v1_old"));
2806
+ ASSERT_OK(Put(1, Key(2), "v2_old"));
2807
+
2808
+ const Snapshot* snap = db_->GetSnapshot();
2809
+
2810
+ // Write new values after snapshot
2811
+ ASSERT_OK(Put(1, Key(1), "v1_new"));
2812
+ ASSERT_OK(Put(1, Key(2), "v2_new"));
2813
+ ASSERT_OK(Put(1, Key(3), "v3_new"));
2814
+
2815
+ // MultiGet with snapshot should see old values
2816
+ std::vector<std::string> key_strs = {Key(1), Key(2), Key(3)};
2817
+ std::vector<Slice> keys(key_strs.begin(), key_strs.end());
2818
+
2819
+ std::vector<PinnableSlice> values(keys.size());
2820
+ std::vector<Status> statuses(keys.size());
2821
+
2822
+ ReadOptions ro;
2823
+ ro.snapshot = snap;
2824
+ ro.async_io = std::get<1>(GetParam());
2825
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
2826
+ statuses.data(), true);
2827
+
2828
+ ASSERT_OK(statuses[0]);
2829
+ ASSERT_EQ(values[0].ToString(), "v1_old");
2830
+ ASSERT_OK(statuses[1]);
2831
+ ASSERT_EQ(values[1].ToString(), "v2_old");
2832
+ ASSERT_TRUE(statuses[2].IsNotFound()); // didn't exist at snapshot
2833
+
2834
+ db_->ReleaseSnapshot(snap);
2835
+
2836
+ // MultiGet without snapshot should see new values
2837
+ for (auto& v : values) {
2838
+ v.Reset();
2839
+ }
2840
+ db_->MultiGet(ReadOptions(), handles_[1], keys.size(), keys.data(),
2841
+ values.data(), statuses.data(), true);
2842
+
2843
+ ASSERT_OK(statuses[0]);
2844
+ ASSERT_EQ(values[0].ToString(), "v1_new");
2845
+ ASSERT_OK(statuses[1]);
2846
+ ASSERT_EQ(values[1].ToString(), "v2_new");
2847
+ ASSERT_OK(statuses[2]);
2848
+ ASSERT_EQ(values[2].ToString(), "v3_new");
2849
+ }
2850
+
2508
2851
  INSTANTIATE_TEST_CASE_P(DBMultiGetTestWithParam, DBMultiGetTestWithParam,
2509
2852
  testing::Combine(testing::Bool(), testing::Bool()));
2510
2853
 
@@ -3264,8 +3607,8 @@ TEST_F(DBBasicTest, GetAllKeyVersions) {
3264
3607
  ASSERT_OK(Delete(std::to_string(i)));
3265
3608
  }
3266
3609
  std::vector<KeyVersion> key_versions;
3267
- ASSERT_OK(GetAllKeyVersions(db_, {}, {}, std::numeric_limits<size_t>::max(),
3268
- &key_versions));
3610
+ ASSERT_OK(GetAllKeyVersions(
3611
+ db_.get(), {}, {}, std::numeric_limits<size_t>::max(), &key_versions));
3269
3612
  ASSERT_EQ(kNumInserts + kNumDeletes + kNumUpdates, key_versions.size());
3270
3613
  for (size_t i = 0; i < kNumInserts + kNumDeletes + kNumUpdates; i++) {
3271
3614
  if (i % 3 == 0) {
@@ -3274,7 +3617,7 @@ TEST_F(DBBasicTest, GetAllKeyVersions) {
3274
3617
  ASSERT_EQ(key_versions[i].GetTypeName(), "TypeValue");
3275
3618
  }
3276
3619
  }
3277
- ASSERT_OK(GetAllKeyVersions(db_, handles_[0], {}, {},
3620
+ ASSERT_OK(GetAllKeyVersions(db_.get(), handles_[0], {}, {},
3278
3621
  std::numeric_limits<size_t>::max(),
3279
3622
  &key_versions));
3280
3623
  ASSERT_EQ(kNumInserts + kNumDeletes + kNumUpdates, key_versions.size());
@@ -3289,14 +3632,14 @@ TEST_F(DBBasicTest, GetAllKeyVersions) {
3289
3632
  for (size_t i = 0; i + 1 != kNumDeletes; ++i) {
3290
3633
  ASSERT_OK(Delete(1, std::to_string(i)));
3291
3634
  }
3292
- ASSERT_OK(GetAllKeyVersions(db_, handles_[1], {}, {},
3635
+ ASSERT_OK(GetAllKeyVersions(db_.get(), handles_[1], {}, {},
3293
3636
  std::numeric_limits<size_t>::max(),
3294
3637
  &key_versions));
3295
3638
  ASSERT_EQ(kNumInserts + kNumDeletes + kNumUpdates - 3, key_versions.size());
3296
3639
 
3297
3640
  // Change from historical behavior: empty key is now interpreted literally as
3298
3641
  // a legal key (rather than as a "not present" key)
3299
- ASSERT_OK(GetAllKeyVersions(db_, handles_[1], Slice(), Slice(),
3642
+ ASSERT_OK(GetAllKeyVersions(db_.get(), handles_[1], Slice(), Slice(),
3300
3643
  std::numeric_limits<size_t>::max(),
3301
3644
  &key_versions));
3302
3645
  ASSERT_EQ(key_versions.size(), 0);
@@ -5437,6 +5780,94 @@ INSTANTIATE_TEST_CASE_P(DBBasicTestDeadline, DBBasicTestDeadline,
5437
5780
  ::testing::Values(std::make_tuple(true, false),
5438
5781
  std::make_tuple(false, true),
5439
5782
  std::make_tuple(true, true)));
5783
+
5784
+ // FileSystemWrapper that captures FileOptions passed to NewRandomAccessFile
5785
+ // for .sst files, so we can verify file_checksum fields are populated.
5786
+ class ChecksumCapturingFS : public FileSystemWrapper {
5787
+ public:
5788
+ explicit ChecksumCapturingFS(const std::shared_ptr<FileSystem>& base)
5789
+ : FileSystemWrapper(base) {}
5790
+
5791
+ static const char* kClassName() { return "ChecksumCapturingFS"; }
5792
+ const char* Name() const override { return kClassName(); }
5793
+
5794
+ IOStatus NewRandomAccessFile(const std::string& fname,
5795
+ const FileOptions& opts,
5796
+ std::unique_ptr<FSRandomAccessFile>* result,
5797
+ IODebugContext* dbg) override {
5798
+ if (fname.find(".sst") != std::string::npos) {
5799
+ std::lock_guard<std::mutex> lock(mu_);
5800
+ captured_file_checksum_ = opts.file_checksum;
5801
+ captured_file_checksum_func_name_ = opts.file_checksum_func_name;
5802
+ capture_count_++;
5803
+ }
5804
+ return target()->NewRandomAccessFile(fname, opts, result, dbg);
5805
+ }
5806
+
5807
+ std::string GetCapturedFileChecksum() {
5808
+ std::lock_guard<std::mutex> lock(mu_);
5809
+ return captured_file_checksum_;
5810
+ }
5811
+
5812
+ std::string GetCapturedFileChecksumFuncName() {
5813
+ std::lock_guard<std::mutex> lock(mu_);
5814
+ return captured_file_checksum_func_name_;
5815
+ }
5816
+
5817
+ int GetCaptureCount() {
5818
+ std::lock_guard<std::mutex> lock(mu_);
5819
+ return capture_count_;
5820
+ }
5821
+
5822
+ void Reset() {
5823
+ std::lock_guard<std::mutex> lock(mu_);
5824
+ captured_file_checksum_.clear();
5825
+ captured_file_checksum_func_name_.clear();
5826
+ capture_count_ = 0;
5827
+ }
5828
+
5829
+ private:
5830
+ std::mutex mu_;
5831
+ std::string captured_file_checksum_;
5832
+ std::string captured_file_checksum_func_name_;
5833
+ int capture_count_ = 0;
5834
+ };
5835
+
5836
+ TEST_F(DBBasicTest, FileChecksumInFileOptions) {
5837
+ // Verify that file_checksum and file_checksum_func_name from FileMetaData
5838
+ // are propagated through FileOptions when opening SST files.
5839
+ auto capturing_fs =
5840
+ std::make_shared<ChecksumCapturingFS>(env_->GetFileSystem());
5841
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, capturing_fs));
5842
+
5843
+ Options options = GetDefaultOptions();
5844
+ options.create_if_missing = true;
5845
+ options.env = env.get();
5846
+ options.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
5847
+ DestroyAndReopen(options);
5848
+
5849
+ // Write data and flush to create an SST with a file checksum.
5850
+ ASSERT_OK(Put("key1", "value1"));
5851
+ ASSERT_OK(Flush());
5852
+
5853
+ // Reset captures, then reopen to trigger TableCache SST open.
5854
+ capturing_fs->Reset();
5855
+ Reopen(options);
5856
+
5857
+ // Read to trigger SST open through TableCache::GetTableReader.
5858
+ ASSERT_EQ("value1", Get("key1"));
5859
+
5860
+ // Verify that checksum fields were populated.
5861
+ ASSERT_GT(capturing_fs->GetCaptureCount(), 0);
5862
+ ASSERT_FALSE(capturing_fs->GetCapturedFileChecksum().empty());
5863
+ ASSERT_NE(capturing_fs->GetCapturedFileChecksumFuncName(),
5864
+ capturing_fs->GetCapturedFileChecksum());
5865
+ ASSERT_EQ(capturing_fs->GetCapturedFileChecksumFuncName(),
5866
+ "FileChecksumCrc32c");
5867
+
5868
+ Close();
5869
+ }
5870
+
5440
5871
  } // namespace ROCKSDB_NAMESPACE
5441
5872
 
5442
5873
  int main(int argc, char** argv) {