@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
@@ -37,6 +37,7 @@
37
37
  #include "db/write_batch_internal.h"
38
38
  #include "env/mock_env.h"
39
39
  #include "file/filename.h"
40
+ #include "monitoring/file_read_sample.h"
40
41
  #include "monitoring/thread_status_util.h"
41
42
  #include "port/port.h"
42
43
  #include "port/stack_trace.h"
@@ -104,7 +105,7 @@ TEST_F(DBTest, MockEnvTest) {
104
105
  Options options;
105
106
  options.create_if_missing = true;
106
107
  options.env = env.get();
107
- DB* db;
108
+ std::unique_ptr<DB> db;
108
109
 
109
110
  const Slice keys[] = {Slice("aaa"), Slice("bbb"), Slice("ccc")};
110
111
  const Slice vals[] = {Slice("foo"), Slice("bar"), Slice("baz")};
@@ -132,7 +133,7 @@ TEST_F(DBTest, MockEnvTest) {
132
133
  ASSERT_OK(iterator->status());
133
134
  delete iterator;
134
135
 
135
- DBImpl* dbi = static_cast_with_check<DBImpl>(db);
136
+ DBImpl* dbi = static_cast_with_check<DBImpl>(db.get());
136
137
  ASSERT_OK(dbi->TEST_FlushMemTable());
137
138
 
138
139
  for (size_t i = 0; i < 3; ++i) {
@@ -141,7 +142,7 @@ TEST_F(DBTest, MockEnvTest) {
141
142
  ASSERT_TRUE(res == vals[i]);
142
143
  }
143
144
 
144
- delete db;
145
+ db.reset();
145
146
  }
146
147
 
147
148
  TEST_F(DBTest, RequestIdPlumbingTest) {
@@ -264,7 +265,7 @@ TEST_F(DBTest, MemEnvTest) {
264
265
  Options options;
265
266
  options.create_if_missing = true;
266
267
  options.env = env.get();
267
- DB* db;
268
+ std::unique_ptr<DB> db;
268
269
 
269
270
  const Slice keys[] = {Slice("aaa"), Slice("bbb"), Slice("ccc")};
270
271
  const Slice vals[] = {Slice("foo"), Slice("bar"), Slice("baz")};
@@ -292,7 +293,7 @@ TEST_F(DBTest, MemEnvTest) {
292
293
  ASSERT_OK(iterator->status());
293
294
  delete iterator;
294
295
 
295
- DBImpl* dbi = static_cast_with_check<DBImpl>(db);
296
+ DBImpl* dbi = static_cast_with_check<DBImpl>(db.get());
296
297
  ASSERT_OK(dbi->TEST_FlushMemTable());
297
298
 
298
299
  for (size_t i = 0; i < 3; ++i) {
@@ -301,7 +302,7 @@ TEST_F(DBTest, MemEnvTest) {
301
302
  ASSERT_TRUE(res == vals[i]);
302
303
  }
303
304
 
304
- delete db;
305
+ db.reset();
305
306
 
306
307
  options.create_if_missing = false;
307
308
  ASSERT_OK(DB::Open(options, "/dir/db", &db));
@@ -310,7 +311,7 @@ TEST_F(DBTest, MemEnvTest) {
310
311
  ASSERT_OK(db->Get(ReadOptions(), keys[i], &res));
311
312
  ASSERT_TRUE(res == vals[i]);
312
313
  }
313
- delete db;
314
+ db.reset();
314
315
  }
315
316
 
316
317
  TEST_F(DBTest, WriteEmptyBatch) {
@@ -1078,7 +1079,9 @@ TEST_F(DBTest, WrongLevel0Config) {
1078
1079
  options.level0_stop_writes_trigger = 1;
1079
1080
  options.level0_slowdown_writes_trigger = 2;
1080
1081
  options.level0_file_num_compaction_trigger = 3;
1081
- ASSERT_OK(DB::Open(options, dbname_, &db_));
1082
+ {
1083
+ ASSERT_OK(DB::Open(options, dbname_, &db_));
1084
+ }
1082
1085
  }
1083
1086
 
1084
1087
  TEST_F(DBTest, GetOrderedByLevels) {
@@ -1207,8 +1210,10 @@ TEST_F(DBTest, FlushSchedule) {
1207
1210
  t.join();
1208
1211
  }
1209
1212
 
1210
- auto default_tables = GetNumberOfSstFilesForColumnFamily(db_, "default");
1211
- auto pikachu_tables = GetNumberOfSstFilesForColumnFamily(db_, "pikachu");
1213
+ auto default_tables =
1214
+ GetNumberOfSstFilesForColumnFamily(db_.get(), "default");
1215
+ auto pikachu_tables =
1216
+ GetNumberOfSstFilesForColumnFamily(db_.get(), "pikachu");
1212
1217
  ASSERT_LE(default_tables, static_cast<uint64_t>(10));
1213
1218
  ASSERT_GT(default_tables, static_cast<uint64_t>(0));
1214
1219
  ASSERT_LE(pikachu_tables, static_cast<uint64_t>(10));
@@ -2368,7 +2373,7 @@ TEST_F(DBTest, Snapshot) {
2368
2373
  ASSERT_OK(Put(1, "foo", "1v3"));
2369
2374
 
2370
2375
  {
2371
- ManagedSnapshot s3(db_);
2376
+ ManagedSnapshot s3(db_.get());
2372
2377
  ASSERT_EQ(3U, GetNumSnapshots());
2373
2378
  ASSERT_EQ(time_snap1, GetTimeOldestSnapshots());
2374
2379
  ASSERT_EQ(GetSequenceOldestSnapshots(), s1->GetSequenceNumber());
@@ -2725,37 +2730,43 @@ TEST_F(DBTest, DBOpen_Options) {
2725
2730
  ASSERT_OK(DestroyDB(dbname, options));
2726
2731
 
2727
2732
  // Does not exist, and create_if_missing == false: error
2728
- DB* db = nullptr;
2733
+ std::unique_ptr<DB> db;
2729
2734
  options.create_if_missing = false;
2730
- Status s = DB::Open(options, dbname, &db);
2731
- ASSERT_TRUE(strstr(s.ToString().c_str(), "does not exist") != nullptr);
2735
+ {
2736
+ Status s = DB::Open(options, dbname, &db);
2737
+ ASSERT_TRUE(strstr(s.ToString().c_str(), "does not exist") != nullptr);
2738
+ }
2732
2739
  ASSERT_TRUE(db == nullptr);
2733
2740
 
2734
2741
  // Does not exist, and create_if_missing == true: OK
2735
2742
  options.create_if_missing = true;
2736
- s = DB::Open(options, dbname, &db);
2737
- ASSERT_OK(s);
2743
+ {
2744
+ Status s = DB::Open(options, dbname, &db);
2745
+ ASSERT_OK(s);
2746
+ }
2738
2747
  ASSERT_TRUE(db != nullptr);
2739
2748
 
2740
- delete db;
2741
- db = nullptr;
2749
+ db.reset();
2742
2750
 
2743
2751
  // Does exist, and error_if_exists == true: error
2744
2752
  options.create_if_missing = false;
2745
2753
  options.error_if_exists = true;
2746
- s = DB::Open(options, dbname, &db);
2747
- ASSERT_TRUE(strstr(s.ToString().c_str(), "exists") != nullptr);
2754
+ {
2755
+ Status s = DB::Open(options, dbname, &db);
2756
+ ASSERT_TRUE(strstr(s.ToString().c_str(), "exists") != nullptr);
2757
+ }
2748
2758
  ASSERT_TRUE(db == nullptr);
2749
2759
 
2750
2760
  // Does exist, and error_if_exists == false: OK
2751
2761
  options.create_if_missing = true;
2752
2762
  options.error_if_exists = false;
2753
- s = DB::Open(options, dbname, &db);
2754
- ASSERT_OK(s);
2763
+ {
2764
+ Status s = DB::Open(options, dbname, &db);
2765
+ ASSERT_OK(s);
2766
+ }
2755
2767
  ASSERT_TRUE(db != nullptr);
2756
2768
 
2757
- delete db;
2758
- db = nullptr;
2769
+ db.reset();
2759
2770
  }
2760
2771
 
2761
2772
  TEST_F(DBTest, DBOpen_Change_NumLevels) {
@@ -2793,25 +2804,36 @@ TEST_F(DBTest, DestroyDBMetaDatabase) {
2793
2804
  ASSERT_OK(DestroyDB(dbname, options));
2794
2805
 
2795
2806
  // Setup databases
2796
- DB* db = nullptr;
2797
- ASSERT_OK(DB::Open(options, dbname, &db));
2798
- delete db;
2799
- db = nullptr;
2800
- ASSERT_OK(DB::Open(options, metadbname, &db));
2801
- delete db;
2802
- db = nullptr;
2803
- ASSERT_OK(DB::Open(options, metametadbname, &db));
2804
- delete db;
2805
- db = nullptr;
2807
+ {
2808
+ std::unique_ptr<DB> db;
2809
+ ASSERT_OK(DB::Open(options, dbname, &db));
2810
+ }
2811
+ {
2812
+ std::unique_ptr<DB> db;
2813
+ ASSERT_OK(DB::Open(options, metadbname, &db));
2814
+ }
2815
+ {
2816
+ std::unique_ptr<DB> db;
2817
+ ASSERT_OK(DB::Open(options, metametadbname, &db));
2818
+ }
2806
2819
 
2807
2820
  // Delete databases
2808
2821
  ASSERT_OK(DestroyDB(dbname, options));
2809
2822
 
2810
2823
  // Check if deletion worked.
2811
2824
  options.create_if_missing = false;
2812
- ASSERT_TRUE(!(DB::Open(options, dbname, &db)).ok());
2813
- ASSERT_TRUE(!(DB::Open(options, metadbname, &db)).ok());
2814
- ASSERT_TRUE(!(DB::Open(options, metametadbname, &db)).ok());
2825
+ {
2826
+ std::unique_ptr<DB> dbptr;
2827
+ ASSERT_TRUE(!(DB::Open(options, dbname, &dbptr)).ok());
2828
+ }
2829
+ {
2830
+ std::unique_ptr<DB> dbptr;
2831
+ ASSERT_TRUE(!(DB::Open(options, metadbname, &dbptr)).ok());
2832
+ }
2833
+ {
2834
+ std::unique_ptr<DB> dbptr;
2835
+ ASSERT_TRUE(!(DB::Open(options, metametadbname, &dbptr)).ok());
2836
+ }
2815
2837
  }
2816
2838
 
2817
2839
  TEST_F(DBTest, SnapshotFiles) {
@@ -2890,13 +2912,11 @@ TEST_F(DBTest, SnapshotFiles) {
2890
2912
  column_families.emplace_back("default", ColumnFamilyOptions());
2891
2913
  column_families.emplace_back("pikachu", ColumnFamilyOptions());
2892
2914
  std::vector<ColumnFamilyHandle*> cf_handles;
2893
- DB* snapdb;
2915
+ std::unique_ptr<DB> snapdb;
2894
2916
  DBOptions opts;
2895
2917
  opts.env = env_;
2896
2918
  opts.create_if_missing = false;
2897
- Status stat =
2898
- DB::Open(opts, snapdir, column_families, &cf_handles, &snapdb);
2899
- ASSERT_OK(stat);
2919
+ ASSERT_OK(DB::Open(opts, snapdir, column_families, &cf_handles, &snapdb));
2900
2920
 
2901
2921
  ReadOptions roptions;
2902
2922
  std::string val;
@@ -2907,7 +2927,7 @@ TEST_F(DBTest, SnapshotFiles) {
2907
2927
  for (auto cfh : cf_handles) {
2908
2928
  delete cfh;
2909
2929
  }
2910
- delete snapdb;
2930
+ snapdb.reset();
2911
2931
 
2912
2932
  // look at the new live files after we added an 'extra' key
2913
2933
  // and after we took the first snapshot.
@@ -3109,7 +3129,7 @@ struct MTThread {
3109
3129
  static void MTThreadBody(void* arg) {
3110
3130
  MTThread* t = static_cast<MTThread*>(arg);
3111
3131
  int id = t->id;
3112
- DB* db = t->state->test->db_;
3132
+ DB* db = t->state->test->db_.get();
3113
3133
  int counter = 0;
3114
3134
  std::shared_ptr<SystemClock> clock = SystemClock::Default();
3115
3135
  auto end_micros = clock->NowMicros() + kTestSeconds * 1000000U;
@@ -3324,7 +3344,7 @@ TEST_F(DBTest, GroupCommitTest) {
3324
3344
  GCThread thread[kGCNumThreads];
3325
3345
  for (int id = 0; id < kGCNumThreads; id++) {
3326
3346
  thread[id].id = id;
3327
- thread[id].db = db_;
3347
+ thread[id].db = db_.get();
3328
3348
  thread[id].done = false;
3329
3349
  env_->StartThread(GCThreadBody, &thread[id]);
3330
3350
  }
@@ -3691,6 +3711,8 @@ class ModelDB : public DB {
3691
3711
  void EnableManualCompaction() override {}
3692
3712
 
3693
3713
  void DisableManualCompaction() override {}
3714
+ void AbortAllCompactions() override {}
3715
+ void ResumeAllCompactions() override {}
3694
3716
 
3695
3717
  Status WaitForCompact(
3696
3718
  const WaitForCompactOptions& /* wait_for_compact_options */) override {
@@ -3994,8 +4016,10 @@ TEST_P(DBTestRandomized, Randomized) {
3994
4016
  // than return a key that is close to it.
3995
4017
  if (option_config_ != kBlockBasedTableWithWholeKeyHashIndex &&
3996
4018
  option_config_ != kBlockBasedTableWithPrefixHashIndex) {
3997
- ASSERT_TRUE(CompareIterators(step, &model, db_, nullptr, nullptr));
3998
- ASSERT_TRUE(CompareIterators(step, &model, db_, model_snap, db_snap));
4019
+ ASSERT_TRUE(
4020
+ CompareIterators(step, &model, db_.get(), nullptr, nullptr));
4021
+ ASSERT_TRUE(
4022
+ CompareIterators(step, &model, db_.get(), model_snap, db_snap));
3999
4023
  }
4000
4024
 
4001
4025
  // Save a snapshot from each DB this time that we'll use next
@@ -4009,7 +4033,7 @@ TEST_P(DBTestRandomized, Randomized) {
4009
4033
  }
4010
4034
 
4011
4035
  Reopen(options);
4012
- ASSERT_TRUE(CompareIterators(step, &model, db_, nullptr, nullptr));
4036
+ ASSERT_TRUE(CompareIterators(step, &model, db_.get(), nullptr, nullptr));
4013
4037
 
4014
4038
  model_snap = model.GetSnapshot();
4015
4039
  db_snap = db_->GetSnapshot();
@@ -5435,7 +5459,7 @@ TEST_P(DBTestWithParam, PreShutdownManualCompaction) {
5435
5459
  // Compact all
5436
5460
  MakeTables(1, "a", "z", 1);
5437
5461
  ASSERT_EQ("1,0,2", FilesPerLevel(1));
5438
- CancelAllBackgroundWork(db_);
5462
+ CancelAllBackgroundWork(db_.get());
5439
5463
  ASSERT_TRUE(
5440
5464
  db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr, nullptr)
5441
5465
  .IsShutdownInProgress());
@@ -5455,7 +5479,7 @@ TEST_F(DBTest, PreShutdownFlush) {
5455
5479
  Options options = CurrentOptions();
5456
5480
  CreateAndReopenWithCF({"pikachu"}, options);
5457
5481
  ASSERT_OK(Put(1, "key", "value"));
5458
- CancelAllBackgroundWork(db_);
5482
+ CancelAllBackgroundWork(db_.get());
5459
5483
  Status s =
5460
5484
  db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr, nullptr);
5461
5485
  ASSERT_TRUE(s.IsShutdownInProgress());
@@ -5536,7 +5560,7 @@ TEST_P(DBTestWithParam, PreShutdownMultipleCompaction) {
5536
5560
 
5537
5561
  TEST_SYNC_POINT("DBTest::PreShutdownMultipleCompaction:Preshutdown");
5538
5562
  ASSERT_GE(operation_count[ThreadStatus::OP_COMPACTION], 1);
5539
- CancelAllBackgroundWork(db_);
5563
+ CancelAllBackgroundWork(db_.get());
5540
5564
  TEST_SYNC_POINT("DBTest::PreShutdownMultipleCompaction:VerifyPreshutdown");
5541
5565
  ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
5542
5566
  // Record the number of compactions at a time.
@@ -5622,7 +5646,7 @@ TEST_P(DBTestWithParam, PreShutdownCompactionMiddle) {
5622
5646
  }
5623
5647
 
5624
5648
  ASSERT_GE(operation_count[ThreadStatus::OP_COMPACTION], 1);
5625
- CancelAllBackgroundWork(db_);
5649
+ CancelAllBackgroundWork(db_.get());
5626
5650
  TEST_SYNC_POINT("DBTest::PreShutdownCompactionMiddle:Preshutdown");
5627
5651
  TEST_SYNC_POINT("DBTest::PreShutdownCompactionMiddle:VerifyPreshutdown");
5628
5652
  ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
@@ -5643,7 +5667,7 @@ TEST_F(DBTest, FlushOnDestroy) {
5643
5667
  WriteOptions wo;
5644
5668
  wo.disableWAL = true;
5645
5669
  ASSERT_OK(Put("foo", "v1", wo));
5646
- CancelAllBackgroundWork(db_);
5670
+ CancelAllBackgroundWork(db_.get());
5647
5671
  }
5648
5672
 
5649
5673
  TEST_F(DBTest, DynamicCompactionOptions) {
@@ -6182,72 +6206,6 @@ TEST_F(DBTest, L0L1L2AndUpHitCounter) {
6182
6206
  TestGetTickerCount(options, GET_HIT_L2_AND_UP));
6183
6207
  }
6184
6208
 
6185
- TEST_F(DBTest, EncodeDecompressedBlockSizeTest) {
6186
- // Allow testing format_version=1
6187
- bool& allow_unsupported_fv = TEST_AllowUnsupportedFormatVersion();
6188
- SaveAndRestore guard(&allow_unsupported_fv);
6189
- ASSERT_FALSE(allow_unsupported_fv);
6190
-
6191
- // iter 0 -- zlib
6192
- // iter 1 -- bzip2
6193
- // iter 2 -- lz4
6194
- // iter 3 -- lz4HC
6195
- // iter 4 -- xpress
6196
- CompressionType compressions[] = {kZlibCompression, kBZip2Compression,
6197
- kLZ4Compression, kLZ4HCCompression,
6198
- kXpressCompression};
6199
- for (auto comp : compressions) {
6200
- if (!CompressionTypeSupported(comp)) {
6201
- continue;
6202
- }
6203
- // first_table_version 1 -- generate with table_version == 1, read with
6204
- // table_version == 2
6205
- // first_table_version 2 -- generate with table_version == 2, read with
6206
- // table_version == 1
6207
- for (int first_table_version = 1; first_table_version <= 2;
6208
- ++first_table_version) {
6209
- BlockBasedTableOptions table_options;
6210
- table_options.format_version = first_table_version;
6211
- table_options.filter_policy.reset(NewBloomFilterPolicy(10));
6212
- Options options = CurrentOptions();
6213
-
6214
- // Hack to generate old files (checked in factory construction)
6215
- allow_unsupported_fv = true;
6216
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
6217
- ASSERT_EQ(options.table_factory->GetOptions<BlockBasedTableOptions>()
6218
- ->format_version,
6219
- first_table_version);
6220
- // Able to read old files without the hack
6221
- allow_unsupported_fv = false;
6222
-
6223
- options.create_if_missing = true;
6224
- options.compression = comp;
6225
- DestroyAndReopen(options);
6226
-
6227
- int kNumKeysWritten = 1000;
6228
-
6229
- Random rnd(301);
6230
- for (int i = 0; i < kNumKeysWritten; ++i) {
6231
- // compressible string
6232
- ASSERT_OK(Put(Key(i), rnd.RandomString(128) + std::string(128, 'a')));
6233
- }
6234
- ASSERT_OK(Flush());
6235
-
6236
- table_options.format_version = first_table_version == 1 ? 2 : 1;
6237
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
6238
- // format_version (for writing) is sanitized to minimum supported
6239
- ASSERT_EQ(options.table_factory->GetOptions<BlockBasedTableOptions>()
6240
- ->format_version,
6241
- BlockBasedTableFactory::kMinSupportedFormatVersion);
6242
- Reopen(options);
6243
- for (int i = 0; i < kNumKeysWritten; ++i) {
6244
- auto r = Get(Key(i));
6245
- ASSERT_EQ(r.substr(128), std::string(128, 'a'));
6246
- }
6247
- }
6248
- }
6249
- }
6250
-
6251
6209
  TEST_F(DBTest, CloseSpeedup) {
6252
6210
  Options options = CurrentOptions();
6253
6211
  options.compaction_style = kCompactionStyleLevel;
@@ -6484,7 +6442,8 @@ TEST_P(DBTestWithParam, CompactionTotalTimeTest) {
6484
6442
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
6485
6443
 
6486
6444
  // Hard-coded number in CompactionJob::ProcessKeyValueCompaction().
6487
- const int kRecordStatsEvery = 1000;
6445
+ // Uses 1024 (power of 2) for efficient bitwise check.
6446
+ const int kRecordStatsEvery = 1024;
6488
6447
  // The stat COMPACTION_CPU_TOTAL_TIME should be recorded
6489
6448
  // during compaction and once more after compaction.
6490
6449
  ASSERT_EQ(n / kRecordStatsEvery + 1, record_count);
@@ -6576,7 +6535,7 @@ TEST_F(DBTest, SuggestCompactRangeTest) {
6576
6535
 
6577
6536
  // compact it three times
6578
6537
  for (int i = 0; i < 3; ++i) {
6579
- ASSERT_OK(experimental::SuggestCompactRange(db_, nullptr, nullptr));
6538
+ ASSERT_OK(experimental::SuggestCompactRange(db_.get(), nullptr, nullptr));
6580
6539
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
6581
6540
  }
6582
6541
 
@@ -6589,7 +6548,7 @@ TEST_F(DBTest, SuggestCompactRangeTest) {
6589
6548
 
6590
6549
  // nonoverlapping with the file on level 0
6591
6550
  Slice start("a"), end("b");
6592
- ASSERT_OK(experimental::SuggestCompactRange(db_, &start, &end));
6551
+ ASSERT_OK(experimental::SuggestCompactRange(db_.get(), &start, &end));
6593
6552
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
6594
6553
 
6595
6554
  // should not compact the level 0 file
@@ -6597,7 +6556,7 @@ TEST_F(DBTest, SuggestCompactRangeTest) {
6597
6556
 
6598
6557
  start = Slice("j");
6599
6558
  end = Slice("m");
6600
- ASSERT_OK(experimental::SuggestCompactRange(db_, &start, &end));
6559
+ ASSERT_OK(experimental::SuggestCompactRange(db_.get(), &start, &end));
6601
6560
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
6602
6561
  // SuggestCompactRange() is not going to be reported as manual compaction
6603
6562
  ASSERT_TRUE(!CompactionFilterFactoryGetContext::IsManual(
@@ -6648,7 +6607,7 @@ TEST_F(DBTest, SuggestCompactRangeUniversal) {
6648
6607
 
6649
6608
  // nonoverlapping with the file on level 0
6650
6609
  Slice start("a"), end("b");
6651
- ASSERT_OK(experimental::SuggestCompactRange(db_, &start, &end));
6610
+ ASSERT_OK(experimental::SuggestCompactRange(db_.get(), &start, &end));
6652
6611
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
6653
6612
 
6654
6613
  // should not compact the level 0 file
@@ -6656,7 +6615,7 @@ TEST_F(DBTest, SuggestCompactRangeUniversal) {
6656
6615
 
6657
6616
  start = Slice("j");
6658
6617
  end = Slice("m");
6659
- ASSERT_OK(experimental::SuggestCompactRange(db_, &start, &end));
6618
+ ASSERT_OK(experimental::SuggestCompactRange(db_.get(), &start, &end));
6660
6619
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
6661
6620
 
6662
6621
  // now it should compact the level 0 file to the last level
@@ -6693,7 +6652,7 @@ TEST_F(DBTest, PromoteL0) {
6693
6652
  ASSERT_EQ(NumTableFilesAtLevel(1, 0), 0); // No files in L1
6694
6653
 
6695
6654
  // Promote L0 level to L2.
6696
- ASSERT_OK(experimental::PromoteL0(db_, db_->DefaultColumnFamily(), 2));
6655
+ ASSERT_OK(experimental::PromoteL0(db_.get(), db_->DefaultColumnFamily(), 2));
6697
6656
  // We expect that all the files were trivially moved from L0 to L2
6698
6657
  ASSERT_EQ(NumTableFilesAtLevel(0, 0), 0);
6699
6658
  ASSERT_EQ(NumTableFilesAtLevel(2, 0), level0_files);
@@ -6718,7 +6677,7 @@ TEST_F(DBTest, PromoteL0Failure) {
6718
6677
 
6719
6678
  Status status;
6720
6679
  // Fails because L0 has overlapping files.
6721
- status = experimental::PromoteL0(db_, db_->DefaultColumnFamily());
6680
+ status = experimental::PromoteL0(db_.get(), db_->DefaultColumnFamily());
6722
6681
  ASSERT_TRUE(status.IsInvalidArgument());
6723
6682
 
6724
6683
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
@@ -6728,7 +6687,7 @@ TEST_F(DBTest, PromoteL0Failure) {
6728
6687
  ASSERT_OK(Put(Key(5), ""));
6729
6688
  ASSERT_OK(Flush());
6730
6689
  // Fails because L1 is non-empty.
6731
- status = experimental::PromoteL0(db_, db_->DefaultColumnFamily());
6690
+ status = experimental::PromoteL0(db_.get(), db_->DefaultColumnFamily());
6732
6691
  ASSERT_TRUE(status.IsInvalidArgument());
6733
6692
  }
6734
6693
 
@@ -7799,11 +7758,568 @@ TEST_F(DBTest, ShuttingDownNotBlockStalledWrites) {
7799
7758
  });
7800
7759
 
7801
7760
  TEST_SYNC_POINT("DBTest::ShuttingDownNotBlockStalledWrites");
7802
- CancelAllBackgroundWork(db_, true);
7761
+ CancelAllBackgroundWork(db_.get(), true);
7803
7762
 
7804
7763
  thd.join();
7805
7764
  }
7806
7765
 
7766
+ TEST_F(DBTest, FileReadSampledStats) {
7767
+ SyncPoint::GetInstance()->SetCallBack(
7768
+ "should_sample_file_read:override",
7769
+ [](void* arg) { *static_cast<bool*>(arg) = true; });
7770
+ SyncPoint::GetInstance()->EnableProcessing();
7771
+ Options options = CurrentOptions();
7772
+ options.disable_auto_compactions = true;
7773
+ DestroyAndReopen(options);
7774
+
7775
+ // Write a key and flush to L0, then move to L1 so LevelIterator is used.
7776
+ ASSERT_OK(Put("key1", "val1"));
7777
+ ASSERT_OK(Flush());
7778
+ MoveFilesToLevel(1);
7779
+
7780
+ auto files = GetLevelFileMetadatas(1);
7781
+ ASSERT_EQ(files.size(), 1);
7782
+ auto* meta = files[0];
7783
+
7784
+ // Reset counters (may have been incremented during compaction).
7785
+ meta->stats.num_reads_sampled.store(0, std::memory_order_relaxed);
7786
+
7787
+ // A Get that finds the key should increment num_reads_sampled by
7788
+ // kFileReadSampleRate (one sampled file access).
7789
+ ASSERT_EQ("val1", Get("key1"));
7790
+ ASSERT_EQ(meta->stats.num_reads_sampled.load(std::memory_order_relaxed),
7791
+ kFileReadSampleRate);
7792
+
7793
+ meta->stats.num_reads_sampled.store(0, std::memory_order_relaxed);
7794
+
7795
+ // An iterator scan should also increment num_reads_sampled by
7796
+ // kFileReadSampleRate (one file opened by LevelIterator).
7797
+ {
7798
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
7799
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
7800
+ }
7801
+ ASSERT_OK(iter->status());
7802
+ }
7803
+ ASSERT_EQ(meta->stats.num_reads_sampled.load(std::memory_order_relaxed),
7804
+ kFileReadSampleRate);
7805
+
7806
+ // -- Test L0 Get path --
7807
+ ASSERT_OK(Put("key2", "val2"));
7808
+ ASSERT_OK(Flush());
7809
+
7810
+ auto l0_files = GetLevelFileMetadatas(0);
7811
+ ASSERT_EQ(l0_files.size(), 1);
7812
+ auto* l0_meta = l0_files[0];
7813
+ l0_meta->stats.num_reads_sampled.store(0, std::memory_order_relaxed);
7814
+
7815
+ // A Get on an L0 file should increment num_reads_sampled.
7816
+ ASSERT_EQ("val2", Get("key2"));
7817
+ ASSERT_EQ(l0_meta->stats.num_reads_sampled.load(std::memory_order_relaxed),
7818
+ kFileReadSampleRate);
7819
+
7820
+ SyncPoint::GetInstance()->DisableProcessing();
7821
+ SyncPoint::GetInstance()->ClearAllCallBacks();
7822
+ }
7823
+
7824
+ TEST_F(DBTest, FileCollapsibleEntryReadSampledStats) {
7825
+ SyncPoint::GetInstance()->SetCallBack(
7826
+ "should_sample_file_read:override",
7827
+ [](void* arg) { *static_cast<bool*>(arg) = true; });
7828
+ SyncPoint::GetInstance()->EnableProcessing();
7829
+ Options options = CurrentOptions();
7830
+ options.disable_auto_compactions = true;
7831
+ options.merge_operator = MergeOperators::CreateStringAppendOperator();
7832
+ DestroyAndReopen(options);
7833
+
7834
+ // -- Setup: create files with collapsible entries --
7835
+ // File in L1 with a value, a delete tombstone, and a merge operand.
7836
+ ASSERT_OK(Put("a", "val_a"));
7837
+ ASSERT_OK(Put("b", "val_b"));
7838
+ ASSERT_OK(Delete("b"));
7839
+ ASSERT_OK(db_->Merge(WriteOptions(), "c", "merge_c"));
7840
+ ASSERT_OK(Put("d", "val_d"));
7841
+ ASSERT_OK(Flush());
7842
+ MoveFilesToLevel(1);
7843
+
7844
+ auto files = GetLevelFileMetadatas(1);
7845
+ ASSERT_EQ(files.size(), 1);
7846
+ auto* meta = files[0];
7847
+
7848
+ // -- Test Get path --
7849
+ // Get for a found key should NOT increment collapsible counter.
7850
+ meta->stats.num_collapsible_entry_reads_sampled.store(
7851
+ 0, std::memory_order_relaxed);
7852
+ ASSERT_EQ("val_a", Get("a"));
7853
+ ASSERT_EQ(meta->stats.num_collapsible_entry_reads_sampled.load(
7854
+ std::memory_order_relaxed),
7855
+ 0);
7856
+
7857
+ // Get for a missing key within the file's key range (kNotFound) should
7858
+ // increment collapsible counter by kFileReadSampleRate.
7859
+ ASSERT_EQ("NOT_FOUND", Get("aa"));
7860
+ ASSERT_EQ(meta->stats.num_collapsible_entry_reads_sampled.load(
7861
+ std::memory_order_relaxed),
7862
+ kFileReadSampleRate);
7863
+
7864
+ // -- Test Iterator path --
7865
+ // Iterating should count the delete and merge as collapsible entries.
7866
+ // The file has one delete ("b") and one merge ("c"), so the counter
7867
+ // should increment by 2 * kFileReadSampleRate.
7868
+ meta->stats.num_collapsible_entry_reads_sampled.store(
7869
+ 0, std::memory_order_relaxed);
7870
+ {
7871
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
7872
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
7873
+ }
7874
+ ASSERT_OK(iter->status());
7875
+ }
7876
+ ASSERT_EQ(meta->stats.num_collapsible_entry_reads_sampled.load(
7877
+ std::memory_order_relaxed),
7878
+ 2 * kFileReadSampleRate);
7879
+
7880
+ // -- Test L0 Get path --
7881
+ DestroyAndReopen(options);
7882
+
7883
+ ASSERT_OK(Put("a", "val_a"));
7884
+ ASSERT_OK(Delete("b"));
7885
+ ASSERT_OK(Put("d", "val_d"));
7886
+ ASSERT_OK(Flush());
7887
+
7888
+ auto l0_files = GetLevelFileMetadatas(0);
7889
+ ASSERT_EQ(l0_files.size(), 1);
7890
+ auto* l0_meta = l0_files[0];
7891
+
7892
+ // Get for a found key in L0 should NOT increment collapsible counter.
7893
+ l0_meta->stats.num_collapsible_entry_reads_sampled.store(
7894
+ 0, std::memory_order_relaxed);
7895
+ ASSERT_EQ("val_a", Get("a"));
7896
+ ASSERT_EQ(l0_meta->stats.num_collapsible_entry_reads_sampled.load(
7897
+ std::memory_order_relaxed),
7898
+ 0);
7899
+
7900
+ // Get for a missing key in L0 (kNotFound) should increment collapsible
7901
+ // counter.
7902
+ ASSERT_EQ("NOT_FOUND", Get("aa"));
7903
+ ASSERT_EQ(l0_meta->stats.num_collapsible_entry_reads_sampled.load(
7904
+ std::memory_order_relaxed),
7905
+ kFileReadSampleRate);
7906
+
7907
+ SyncPoint::GetInstance()->DisableProcessing();
7908
+ SyncPoint::GetInstance()->ClearAllCallBacks();
7909
+ }
7910
+
7911
+ enum class ReadType : uint8_t { kGet, kMultiGet, kIterator, kNumReadTypes };
7912
+
7913
+ class OpenFilesAsyncTest
7914
+ : public DBTest,
7915
+ public testing::WithParamInterface<std::tuple<uint32_t, int, bool>> {
7916
+ public:
7917
+ OpenFilesAsyncTest() {
7918
+ std::tie(num_flushes_, max_open_files_, read_only_) = GetParam();
7919
+ }
7920
+
7921
+ std::string BeforeFindTableSyncPoint(ReadType rt) {
7922
+ switch (rt) {
7923
+ case ReadType::kGet:
7924
+ return "TableCache::Get::BeforeFindTable";
7925
+ case ReadType::kMultiGet:
7926
+ return "TableCache::MultiGet::BeforeFindTable";
7927
+ case ReadType::kIterator:
7928
+ return "TableCache::NewIterator::BeforeFindTable";
7929
+ default:
7930
+ assert(false);
7931
+ return "";
7932
+ }
7933
+ }
7934
+
7935
+ std::string KeyFor(uint32_t f) {
7936
+ char buf[32];
7937
+ snprintf(buf, sizeof(buf), "key%04u", f);
7938
+ return buf;
7939
+ }
7940
+
7941
+ std::string ValueFor(uint32_t f) {
7942
+ char buf[32];
7943
+ snprintf(buf, sizeof(buf), "value%04u", f);
7944
+ return buf;
7945
+ }
7946
+
7947
+ void SetupData(Options& options, const std::vector<std::string>& cfs = {
7948
+ kDefaultColumnFamilyName}) {
7949
+ options.create_if_missing = true;
7950
+ options.max_open_files = max_open_files_;
7951
+
7952
+ // disable auto compactions/flushes
7953
+ options.disable_auto_compactions = true;
7954
+
7955
+ options.info_log_level = FATAL_LEVEL; // reduce LOG size
7956
+ DestroyAndReopen(options);
7957
+
7958
+ for (const auto& cf : cfs) {
7959
+ if (cf != kDefaultColumnFamilyName) {
7960
+ CreateColumnFamilies({cf}, options);
7961
+ }
7962
+ }
7963
+ ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
7964
+
7965
+ for (uint32_t f = 0; f < num_flushes_; f++) {
7966
+ for (int cf = 0; cf < static_cast<int>(cfs.size()); cf++) {
7967
+ ASSERT_OK(Put(cf, KeyFor(f), ValueFor(f)));
7968
+ ASSERT_OK(Flush(cf));
7969
+ }
7970
+ }
7971
+
7972
+ Close();
7973
+ }
7974
+
7975
+ void VerifyData(ReadType rt) {
7976
+ switch (rt) {
7977
+ case ReadType::kGet:
7978
+ for (uint32_t f = 0; f < num_flushes_; f++) {
7979
+ ASSERT_EQ(Get(KeyFor(f)), ValueFor(f));
7980
+ }
7981
+ break;
7982
+ case ReadType::kMultiGet: {
7983
+ std::vector<std::string> keys;
7984
+ std::vector<Slice> key_slices;
7985
+ keys.reserve(num_flushes_);
7986
+ key_slices.reserve(num_flushes_);
7987
+ for (uint32_t f = 0; f < num_flushes_; f++) {
7988
+ keys.push_back(KeyFor(f));
7989
+ }
7990
+ for (auto& k : keys) {
7991
+ key_slices.emplace_back(k);
7992
+ }
7993
+ std::vector<std::string> values(num_flushes_);
7994
+ std::vector<Status> statuses =
7995
+ db_->MultiGet(ReadOptions(), key_slices, &values);
7996
+ for (uint32_t f = 0; f < num_flushes_; f++) {
7997
+ ASSERT_OK(statuses[f]);
7998
+ ASSERT_EQ(values[f], ValueFor(f));
7999
+ }
8000
+ break;
8001
+ }
8002
+ case ReadType::kIterator: {
8003
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
8004
+ iter->SeekToFirst();
8005
+ for (uint32_t f = 0; f < num_flushes_; f++) {
8006
+ ASSERT_TRUE(iter->Valid());
8007
+ ASSERT_EQ(iter->key().ToString(), KeyFor(f));
8008
+ ASSERT_EQ(iter->value().ToString(), ValueFor(f));
8009
+ iter->Next();
8010
+ }
8011
+ ASSERT_OK(iter->status());
8012
+ break;
8013
+ }
8014
+ default:
8015
+ assert(false);
8016
+ }
8017
+ }
8018
+
8019
+ void OpenTestDB(Options& options) {
8020
+ options.open_files_async = true;
8021
+ options.skip_stats_update_on_db_open = true;
8022
+ options.statistics = CreateDBStatistics();
8023
+ options.info_log_level = FATAL_LEVEL; // reduce LOG size
8024
+
8025
+ std::vector<std::string> cfs;
8026
+ ASSERT_OK(DB::ListColumnFamilies(options, dbname_, &cfs));
8027
+
8028
+ if (read_only_) {
8029
+ ASSERT_OK(TryReopenReadOnlyWithColumnFamilies(cfs, options));
8030
+ } else {
8031
+ ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
8032
+ }
8033
+ }
8034
+
8035
+ void VerifyReadError(ReadType rt) {
8036
+ switch (rt) {
8037
+ case ReadType::kGet: {
8038
+ PinnableSlice value;
8039
+ Status read_s = db_->Get(ReadOptions(), db_->DefaultColumnFamily(),
8040
+ KeyFor(0), &value);
8041
+ ASSERT_TRUE(read_s.IsCorruption()) << read_s.ToString();
8042
+ break;
8043
+ }
8044
+ case ReadType::kMultiGet: {
8045
+ std::vector<std::string> keys = {KeyFor(0)};
8046
+ std::vector<Slice> key_slices = {keys[0]};
8047
+ std::vector<std::string> values(1);
8048
+ std::vector<Status> statuses =
8049
+ db_->MultiGet(ReadOptions(), key_slices, &values);
8050
+ ASSERT_TRUE(statuses[0].IsCorruption()) << statuses[0].ToString();
8051
+ break;
8052
+ }
8053
+ case ReadType::kIterator: {
8054
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
8055
+ iter->SeekToFirst();
8056
+ ASSERT_TRUE(iter->status().IsCorruption()) << iter->status().ToString();
8057
+ break;
8058
+ }
8059
+ default:
8060
+ assert(false);
8061
+ }
8062
+ }
8063
+
8064
+ uint32_t num_flushes_{};
8065
+ int max_open_files_{};
8066
+ bool read_only_{};
8067
+ };
8068
+
8069
+ INSTANTIATE_TEST_CASE_P(OpenFilesAsync, OpenFilesAsyncTest,
8070
+ ::testing::Combine(::testing::Values(4),
8071
+ ::testing::Values(-1, 10),
8072
+ ::testing::Bool()));
8073
+
8074
+ // Test mix of races with async file open, reads, compactions
8075
+ TEST_P(OpenFilesAsyncTest, ConcurrentFileAccess) {
8076
+ Options options = CurrentOptions();
8077
+ ASSERT_NO_FATAL_FAILURE(SetupData(options));
8078
+
8079
+ for (uint8_t i = 0; i < static_cast<uint8_t>(ReadType::kNumReadTypes); i++) {
8080
+ auto rt = static_cast<ReadType>(i);
8081
+ OpenTestDB(options);
8082
+
8083
+ port::Thread reader_thread([&]() { VerifyData(rt); });
8084
+
8085
+ port::Thread compaction_thread([&]() {
8086
+ if (!read_only_) {
8087
+ db_->CompactRange(CompactRangeOptions(), nullptr, nullptr)
8088
+ .PermitUncheckedError();
8089
+ }
8090
+ });
8091
+
8092
+ reader_thread.join();
8093
+ compaction_thread.join();
8094
+
8095
+ if (max_open_files_ == -1) {
8096
+ EXPECT_EQ(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8097
+ } else {
8098
+ EXPECT_GE(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8099
+ }
8100
+ Close();
8101
+ }
8102
+ }
8103
+
8104
+ TEST_P(OpenFilesAsyncTest, AfterRead) {
8105
+ Options options = CurrentOptions();
8106
+ ASSERT_NO_FATAL_FAILURE(SetupData(options));
8107
+
8108
+ for (uint8_t i = 0; i < static_cast<uint8_t>(ReadType::kNumReadTypes); i++) {
8109
+ auto rt = static_cast<ReadType>(i);
8110
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
8111
+ {"OpenFilesAsyncTest::AfterRead",
8112
+ "VersionBuilder::Rep::LoadTableHandlers::BeforeFindTable"},
8113
+ {"DBImpl::BGWorkAsyncFileOpen:Done",
8114
+ "OpenFilesAsyncTest::AfterRead::BeforeClose"},
8115
+ });
8116
+
8117
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8118
+ BeforeFindTableSyncPoint(rt), [&](void* arg) {
8119
+ FileDescriptor* fd = static_cast<FileDescriptor*>(arg);
8120
+ if (max_open_files_ == -1) {
8121
+ ASSERT_EQ(fd->pinned_reader.Get(), nullptr);
8122
+ }
8123
+ });
8124
+
8125
+ std::atomic<uint32_t> file_opens = 0;
8126
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8127
+ "VersionBuilder::Rep::LoadTableHandlers::BeforeFindTable",
8128
+ [&](void* arg) {
8129
+ ++file_opens;
8130
+ FileMetaData* file_meta = static_cast<FileMetaData*>(arg);
8131
+ if (max_open_files_ == -1) {
8132
+ ASSERT_NE(file_meta->fd.pinned_reader.Get(), nullptr);
8133
+ }
8134
+ });
8135
+
8136
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8137
+
8138
+ OpenTestDB(options);
8139
+
8140
+ VerifyData(rt);
8141
+ TEST_SYNC_POINT("OpenFilesAsyncTest::AfterRead");
8142
+
8143
+ TEST_SYNC_POINT("OpenFilesAsyncTest::AfterRead::BeforeClose");
8144
+
8145
+ if (max_open_files_ == -1) {
8146
+ EXPECT_EQ(file_opens, num_flushes_);
8147
+ EXPECT_EQ(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8148
+ } else {
8149
+ EXPECT_GE(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8150
+ }
8151
+
8152
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
8153
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
8154
+ Close();
8155
+ }
8156
+ }
8157
+
8158
+ TEST_P(OpenFilesAsyncTest, BeforeRead) {
8159
+ Options options = CurrentOptions();
8160
+ ASSERT_NO_FATAL_FAILURE(SetupData(options));
8161
+
8162
+ for (uint8_t i = 0; i < static_cast<uint8_t>(ReadType::kNumReadTypes); i++) {
8163
+ auto rt = static_cast<ReadType>(i);
8164
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
8165
+ {"DBImpl::BGWorkAsyncFileOpen:Done", "OpenFilesAsyncTest::BeforeRead"},
8166
+ });
8167
+
8168
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8169
+ BeforeFindTableSyncPoint(rt), [&](void* arg) {
8170
+ FileDescriptor* fd = static_cast<FileDescriptor*>(arg);
8171
+ if (options.max_open_files == -1) {
8172
+ ASSERT_NE(fd->pinned_reader.Get(), nullptr);
8173
+ }
8174
+ });
8175
+
8176
+ std::atomic<uint32_t> file_opens = 0;
8177
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8178
+ "VersionBuilder::Rep::LoadTableHandlers::BeforeFindTable",
8179
+ [&](void* arg) {
8180
+ ++file_opens;
8181
+ FileMetaData* file_meta = static_cast<FileMetaData*>(arg);
8182
+ ASSERT_EQ(file_meta->fd.pinned_reader.Get(), nullptr);
8183
+ });
8184
+
8185
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8186
+
8187
+ OpenTestDB(options);
8188
+
8189
+ TEST_SYNC_POINT("OpenFilesAsyncTest::BeforeRead");
8190
+
8191
+ VerifyData(rt);
8192
+
8193
+ if (max_open_files_ == -1) {
8194
+ EXPECT_EQ(file_opens, num_flushes_);
8195
+ EXPECT_EQ(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8196
+ } else {
8197
+ EXPECT_GE(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8198
+ }
8199
+
8200
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
8201
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
8202
+ Close();
8203
+ }
8204
+ }
8205
+
8206
+ TEST_P(OpenFilesAsyncTest, Shutdown) {
8207
+ Options options = CurrentOptions();
8208
+ ASSERT_NO_FATAL_FAILURE(SetupData(options));
8209
+
8210
+ std::atomic<uint32_t> file_opens = 0;
8211
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
8212
+ "VersionBuilder::Rep::LoadTableHandlers::BeforeFindTable",
8213
+ [&](void* /*arg*/) { ++file_opens; });
8214
+
8215
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
8216
+ {{"DBImpl::~DBImpl:WaitJob", "DBImpl::BGWorkAsyncFileOpen::Start"},
8217
+ {"DBImpl::BGWorkAsyncFileOpen:Done", "OpenFilesAsyncTest::Shutdown"}});
8218
+
8219
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8220
+
8221
+ OpenTestDB(options);
8222
+
8223
+ Close();
8224
+ TEST_SYNC_POINT("OpenFilesAsyncTest::Shutdown");
8225
+
8226
+ ASSERT_EQ(file_opens, 0);
8227
+
8228
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
8229
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
8230
+ }
8231
+
8232
+ TEST_P(OpenFilesAsyncTest, Error) {
8233
+ Options options = CurrentOptions();
8234
+ ASSERT_NO_FATAL_FAILURE(SetupData(options));
8235
+
8236
+ // Get SST file paths and corrupt all of them
8237
+ std::vector<std::string> sst_files;
8238
+ {
8239
+ Reopen(options);
8240
+ std::vector<LiveFileMetaData> metadata;
8241
+ db_->GetLiveFilesMetaData(&metadata);
8242
+ ASSERT_GT(metadata.size(), 0);
8243
+ for (const auto& m : metadata) {
8244
+ sst_files.push_back(m.directory + "/" + m.name);
8245
+ }
8246
+ Close();
8247
+ }
8248
+ for (const auto& f : sst_files) {
8249
+ ASSERT_OK(test::CorruptFile(env_, f, 0, 100));
8250
+ }
8251
+
8252
+ for (uint8_t i = 0; i < static_cast<uint8_t>(ReadType::kNumReadTypes); i++) {
8253
+ auto rt = static_cast<ReadType>(i);
8254
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
8255
+ {"DBImpl::BGWorkAsyncFileOpen:Done", "OpenFilesAsyncTest::Error"},
8256
+ });
8257
+
8258
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8259
+
8260
+ OpenTestDB(options);
8261
+
8262
+ TEST_SYNC_POINT("OpenFilesAsyncTest::Error");
8263
+
8264
+ ASSERT_TRUE(dbfull()->TEST_GetBGError().IsCorruption());
8265
+
8266
+ VerifyReadError(rt);
8267
+
8268
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
8269
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
8270
+ Close();
8271
+ }
8272
+ }
8273
+
8274
+ TEST_P(OpenFilesAsyncTest, DropColumnFamily) {
8275
+ // Can't drop CFs in read-only mode
8276
+ if (read_only_) {
8277
+ return;
8278
+ }
8279
+
8280
+ for (uint8_t i = 0; i < static_cast<uint8_t>(ReadType::kNumReadTypes); i++) {
8281
+ auto rt = static_cast<ReadType>(i);
8282
+ Options options = CurrentOptions();
8283
+ ASSERT_NO_FATAL_FAILURE(
8284
+ SetupData(options, {kDefaultColumnFamilyName, "cf1"}));
8285
+
8286
+ // Delay the async opener until after we drop the CF
8287
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
8288
+ {"OpenFilesAsyncTest::DropColumnFamily::AfterDrop",
8289
+ "DBImpl::BGWorkAsyncFileOpen::Start"},
8290
+ {"DBImpl::BGWorkAsyncFileOpen:Done",
8291
+ "OpenFilesAsyncTest::DropColumnFamily::BeforeClose"},
8292
+ });
8293
+
8294
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
8295
+
8296
+ OpenTestDB(options);
8297
+
8298
+ // Drop the non-default CF before async opener runs
8299
+ ASSERT_OK(db_->DropColumnFamily(handles_[1]));
8300
+ ASSERT_OK(db_->DestroyColumnFamilyHandle(handles_[1]));
8301
+ handles_[1] = nullptr;
8302
+
8303
+ TEST_SYNC_POINT("OpenFilesAsyncTest::DropColumnFamily::AfterDrop");
8304
+
8305
+ // Default CF data should still be readable
8306
+ VerifyData(rt);
8307
+
8308
+ TEST_SYNC_POINT("OpenFilesAsyncTest::DropColumnFamily::BeforeClose");
8309
+
8310
+ if (max_open_files_ == -1) {
8311
+ EXPECT_EQ(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8312
+ } else {
8313
+ EXPECT_GE(TestGetTickerCount(options, NO_FILE_OPENS), num_flushes_);
8314
+ }
8315
+
8316
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
8317
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
8318
+
8319
+ Close();
8320
+ }
8321
+ }
8322
+
7807
8323
  } // namespace ROCKSDB_NAMESPACE
7808
8324
 
7809
8325
  int main(int argc, char** argv) {