@nxtedition/rocksdb 7.1.29 → 7.1.31

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 (382) hide show
  1. package/binding.cc +34 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -2
  3. package/deps/rocksdb/rocksdb/cache/cache_test.cc +15 -23
  4. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -1
  5. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +4 -5
  6. package/deps/rocksdb/rocksdb/cache/lru_cache.h +3 -1
  7. package/deps/rocksdb/rocksdb/crash_test.mk +1 -1
  8. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +15 -0
  9. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +1 -1
  10. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -1
  11. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +78 -6
  12. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +32 -6
  13. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +8 -8
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +47 -8
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +3 -3
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +105 -166
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +3 -4
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +46 -15
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +47 -26
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +17 -10
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +11 -5
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +12 -6
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -2
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +337 -103
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -5
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -2
  28. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +524 -1
  29. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +164 -0
  30. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +6 -6
  31. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5 -7
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -1
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +4 -4
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +2 -3
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +1 -1
  38. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  39. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -23
  40. package/deps/rocksdb/rocksdb/db/merge_helper.cc +30 -0
  41. package/deps/rocksdb/rocksdb/db/merge_helper.h +9 -0
  42. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +29 -9
  43. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +10 -7
  44. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +12 -8
  45. package/deps/rocksdb/rocksdb/db/version_set.cc +11 -6
  46. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +142 -0
  47. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +59 -53
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -2
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -3
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +7 -4
  52. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +0 -2
  53. package/deps/rocksdb/rocksdb/env/env.cc +16 -19
  54. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -1
  55. package/deps/rocksdb/rocksdb/env/env_chroot.cc +20 -20
  56. package/deps/rocksdb/rocksdb/env/env_encryption.cc +62 -60
  57. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  58. package/deps/rocksdb/rocksdb/env/env_test.cc +179 -176
  59. package/deps/rocksdb/rocksdb/env/file_system.cc +3 -4
  60. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -2
  61. package/deps/rocksdb/rocksdb/env/io_posix.h +1 -2
  62. package/deps/rocksdb/rocksdb/env/mock_env.h +1 -0
  63. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +4 -4
  64. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +6 -5
  65. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +2 -5
  66. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +6 -7
  67. package/deps/rocksdb/rocksdb/file/file_util.cc +1 -1
  68. package/deps/rocksdb/rocksdb/file/filename.cc +16 -17
  69. package/deps/rocksdb/rocksdb/file/filename.h +4 -5
  70. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +492 -496
  71. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +1 -1
  72. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +1 -3
  73. package/deps/rocksdb/rocksdb/file/read_write_util.cc +1 -0
  74. package/deps/rocksdb/rocksdb/file/read_write_util.h +1 -0
  75. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +6 -8
  76. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +1 -2
  77. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -4
  78. package/deps/rocksdb/rocksdb/include/rocksdb/block_cache_trace_writer.h +4 -4
  79. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +166 -167
  80. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +1 -0
  81. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +0 -1
  82. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +12 -12
  83. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +2 -0
  84. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +1 -0
  85. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +1 -0
  86. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -1
  87. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +1 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +1 -0
  89. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +0 -4
  90. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -3
  91. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +1 -1
  92. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +1 -0
  94. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +1 -0
  95. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +1 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +1 -0
  97. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +4 -4
  98. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +4 -4
  100. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +1 -1
  101. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +2 -2
  102. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  103. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +3 -3
  104. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +3 -7
  105. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +20 -23
  106. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/logging/event_logger.cc +1 -3
  108. package/deps/rocksdb/rocksdb/logging/event_logger.h +4 -5
  109. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +2 -1
  110. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +2 -3
  111. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -2
  112. package/deps/rocksdb/rocksdb/logging/logging.h +3 -3
  113. package/deps/rocksdb/rocksdb/memory/allocator.h +1 -0
  114. package/deps/rocksdb/rocksdb/memory/arena_test.cc +1 -1
  115. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +2 -0
  116. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -0
  117. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -0
  118. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +17 -20
  119. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +13 -15
  120. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +11 -10
  121. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +3 -3
  122. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +2 -2
  123. package/deps/rocksdb/rocksdb/memtable/skiplist.h +30 -28
  124. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +4 -6
  125. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +73 -70
  126. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +1 -1
  127. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +21 -23
  128. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +24 -38
  130. package/deps/rocksdb/rocksdb/monitoring/histogram.h +10 -17
  131. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +19 -19
  132. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +22 -30
  133. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +4 -6
  134. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -0
  135. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +4 -12
  136. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -3
  137. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  138. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +12 -14
  139. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +2 -3
  140. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -1
  141. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +1 -3
  142. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +1 -0
  143. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  144. package/deps/rocksdb/rocksdb/monitoring/statistics.h +7 -7
  145. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +12 -22
  146. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +7 -10
  147. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  148. package/deps/rocksdb/rocksdb/port/lang.h +3 -1
  149. package/deps/rocksdb/rocksdb/port/likely.h +2 -2
  150. package/deps/rocksdb/rocksdb/port/mmap.h +2 -2
  151. package/deps/rocksdb/rocksdb/port/port_dirent.h +2 -2
  152. package/deps/rocksdb/rocksdb/port/port_posix.cc +32 -27
  153. package/deps/rocksdb/rocksdb/port/port_posix.h +31 -30
  154. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -1
  155. package/deps/rocksdb/rocksdb/port/sys_time.h +1 -1
  156. package/deps/rocksdb/rocksdb/port/win/io_win.h +6 -7
  157. package/deps/rocksdb/rocksdb/port/win/port_win.h +12 -20
  158. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +5 -4
  159. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -5
  160. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -4
  161. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +30 -49
  162. package/deps/rocksdb/rocksdb/port/win/win_thread.h +5 -5
  163. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -62
  164. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +2 -2
  165. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +4 -3
  166. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -0
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -2
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +2 -1
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +0 -1
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -4
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +0 -1
  173. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +2 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -1
  175. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -30
  176. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +2 -1
  177. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  178. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +3 -3
  179. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -0
  180. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +4 -5
  181. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +1 -3
  182. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -2
  183. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +1 -0
  184. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +0 -1
  185. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +1 -1
  186. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +0 -1
  187. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +7 -6
  188. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +0 -1
  189. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -6
  191. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -2
  192. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +90 -80
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +5 -4
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +63 -69
  195. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +2 -1
  196. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +58 -57
  197. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +3 -3
  198. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +35 -30
  199. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -10
  200. package/deps/rocksdb/rocksdb/table/iter_heap.h +2 -0
  201. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -1
  202. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -3
  203. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +31 -16
  204. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -6
  205. package/deps/rocksdb/rocksdb/table/multiget_context.h +5 -6
  206. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +1 -0
  207. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +1 -1
  208. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +7 -10
  209. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -1
  210. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +2 -2
  211. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +4 -3
  212. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +2 -2
  213. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -0
  214. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +10 -21
  215. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +14 -12
  216. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +2 -5
  217. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -3
  218. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +0 -6
  219. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +0 -33
  220. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -6
  221. package/deps/rocksdb/rocksdb/table/table_properties.cc +24 -37
  222. package/deps/rocksdb/rocksdb/table/table_reader.h +3 -2
  223. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +9 -8
  224. package/deps/rocksdb/rocksdb/table/table_test.cc +77 -82
  225. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +1 -0
  226. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  227. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +8 -18
  228. package/deps/rocksdb/rocksdb/test_util/sync_point.h +2 -2
  229. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +4 -3
  230. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +13 -18
  231. package/deps/rocksdb/rocksdb/test_util/testharness.cc +1 -2
  232. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -7
  233. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +3 -4
  234. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +1 -1
  235. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +1 -0
  236. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -7
  237. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +3 -2
  238. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +296 -314
  239. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +6 -6
  240. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +2 -1
  241. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +57 -64
  242. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +6 -5
  243. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +2 -2
  244. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  245. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  246. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +1 -2
  247. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +10 -10
  248. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -1
  249. package/deps/rocksdb/rocksdb/tools/write_stress.cc +6 -3
  250. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +12 -31
  251. package/deps/rocksdb/rocksdb/util/autovector.h +3 -6
  252. package/deps/rocksdb/rocksdb/util/autovector_test.cc +12 -12
  253. package/deps/rocksdb/rocksdb/util/bloom_test.cc +8 -12
  254. package/deps/rocksdb/rocksdb/util/coding.cc +1 -0
  255. package/deps/rocksdb/rocksdb/util/coding.h +17 -15
  256. package/deps/rocksdb/rocksdb/util/coding_test.cc +14 -15
  257. package/deps/rocksdb/rocksdb/util/comparator.cc +4 -4
  258. package/deps/rocksdb/rocksdb/util/compression.h +6 -3
  259. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +2 -2
  260. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +5 -8
  261. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +1 -1
  262. package/deps/rocksdb/rocksdb/util/crc32c.cc +202 -297
  263. package/deps/rocksdb/rocksdb/util/crc32c.h +2 -3
  264. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +2 -0
  265. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +39 -54
  266. package/deps/rocksdb/rocksdb/util/defer.h +2 -1
  267. package/deps/rocksdb/rocksdb/util/defer_test.cc +2 -1
  268. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +2 -1
  269. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +1 -1
  270. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  271. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -1
  272. package/deps/rocksdb/rocksdb/util/filelock_test.cc +24 -29
  273. package/deps/rocksdb/rocksdb/util/filter_bench.cc +4 -4
  274. package/deps/rocksdb/rocksdb/util/hash_test.cc +2 -2
  275. package/deps/rocksdb/rocksdb/util/heap.h +5 -4
  276. package/deps/rocksdb/rocksdb/util/heap_test.cc +15 -25
  277. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  278. package/deps/rocksdb/rocksdb/util/murmurhash.cc +7 -2
  279. package/deps/rocksdb/rocksdb/util/murmurhash.h +4 -3
  280. package/deps/rocksdb/rocksdb/util/mutexlock.h +5 -11
  281. package/deps/rocksdb/rocksdb/util/random.cc +1 -0
  282. package/deps/rocksdb/rocksdb/util/random.h +2 -4
  283. package/deps/rocksdb/rocksdb/util/random_test.cc +2 -1
  284. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +4 -3
  285. package/deps/rocksdb/rocksdb/util/slice.cc +1 -1
  286. package/deps/rocksdb/rocksdb/util/slice_test.cc +1 -2
  287. package/deps/rocksdb/rocksdb/util/status.cc +2 -0
  288. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -0
  289. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +64 -76
  290. package/deps/rocksdb/rocksdb/util/thread_local.cc +18 -32
  291. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -3
  292. package/deps/rocksdb/rocksdb/util/thread_operation.h +34 -43
  293. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +54 -73
  294. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +18 -18
  295. package/deps/rocksdb/rocksdb/util/timer.h +4 -9
  296. package/deps/rocksdb/rocksdb/util/timer_queue.h +1 -0
  297. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +1 -0
  298. package/deps/rocksdb/rocksdb/util/xxhash.cc +1 -2
  299. package/deps/rocksdb/rocksdb/util/xxhash.h +7 -4
  300. package/deps/rocksdb/rocksdb/util/xxph3.h +3 -1
  301. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +16 -24
  302. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +1 -1
  303. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +106 -104
  304. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +3 -4
  305. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +6 -6
  306. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +1 -2
  307. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +3 -4
  308. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -1
  309. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +11 -15
  310. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -2
  311. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +3 -3
  312. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +12 -12
  313. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +56 -55
  314. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +91 -74
  315. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +17 -34
  316. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +21 -45
  317. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +74 -97
  318. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +17 -18
  319. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -4
  320. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +19 -19
  321. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +19 -18
  322. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +7 -10
  323. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +3 -4
  324. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +2 -2
  325. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +10 -15
  326. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +2 -1
  327. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +1 -0
  328. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +5 -3
  329. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -2
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +4 -5
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -7
  332. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -13
  333. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +1 -0
  334. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +7 -9
  335. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +4 -5
  336. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +4 -3
  337. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +1 -1
  338. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +3 -3
  339. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +2 -4
  340. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +2 -2
  341. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +39 -50
  342. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +2 -2
  343. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +4 -3
  344. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +2 -2
  345. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +5 -7
  346. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +5 -4
  347. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  348. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +3 -6
  349. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +1 -1
  350. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +2 -2
  351. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -1
  352. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +1 -0
  353. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -1
  354. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +1 -1
  355. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +18 -13
  356. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +1 -3
  357. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +15 -14
  358. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +14 -12
  359. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -2
  360. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +4 -7
  361. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1 -2
  362. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  363. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +1 -1
  364. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -1
  365. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +3 -2
  366. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +1 -2
  367. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +3 -2
  368. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +5 -5
  369. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -4
  370. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -2
  371. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +5 -4
  372. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -1
  373. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +1 -0
  374. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +3 -4
  375. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +2 -6
  376. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +80 -79
  377. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -3
  378. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +9 -17
  379. package/index.js +4 -0
  380. package/package.json +2 -2
  381. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  382. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -660,7 +660,7 @@ TEST_P(PrefetchTest, PrefetchWhenReseek) {
660
660
  iter->Seek(BuildKey(1019));
661
661
  ASSERT_TRUE(iter->Valid());
662
662
  // Missed 2 blocks but they are already in buffer so no reset.
663
- iter->Seek(BuildKey(103)); // Already in buffer.
663
+ iter->Seek(BuildKey(103)); // Already in buffer.
664
664
  ASSERT_TRUE(iter->Valid());
665
665
  iter->Seek(BuildKey(1033)); // Prefetch Data
666
666
  ASSERT_TRUE(iter->Valid());
@@ -1455,119 +1455,165 @@ extern "C" bool RocksDbIOUringEnable() { return true; }
1455
1455
  namespace {
1456
1456
  #ifndef ROCKSDB_LITE
1457
1457
  #ifdef GFLAGS
1458
- const int kMaxArgCount = 100;
1459
- const size_t kArgBufferSize = 100000;
1458
+ const int kMaxArgCount = 100;
1459
+ const size_t kArgBufferSize = 100000;
1460
1460
 
1461
- void RunIOTracerParserTool(std::string trace_file) {
1462
- std::vector<std::string> params = {"./io_tracer_parser",
1463
- "-io_trace_file=" + trace_file};
1461
+ void RunIOTracerParserTool(std::string trace_file) {
1462
+ std::vector<std::string> params = {"./io_tracer_parser",
1463
+ "-io_trace_file=" + trace_file};
1464
1464
 
1465
- char arg_buffer[kArgBufferSize];
1466
- char* argv[kMaxArgCount];
1467
- int argc = 0;
1468
- int cursor = 0;
1469
- for (const auto& arg : params) {
1470
- ASSERT_LE(cursor + arg.size() + 1, kArgBufferSize);
1471
- ASSERT_LE(argc + 1, kMaxArgCount);
1465
+ char arg_buffer[kArgBufferSize];
1466
+ char* argv[kMaxArgCount];
1467
+ int argc = 0;
1468
+ int cursor = 0;
1469
+ for (const auto& arg : params) {
1470
+ ASSERT_LE(cursor + arg.size() + 1, kArgBufferSize);
1471
+ ASSERT_LE(argc + 1, kMaxArgCount);
1472
1472
 
1473
- snprintf(arg_buffer + cursor, arg.size() + 1, "%s", arg.c_str());
1473
+ snprintf(arg_buffer + cursor, arg.size() + 1, "%s", arg.c_str());
1474
1474
 
1475
- argv[argc++] = arg_buffer + cursor;
1476
- cursor += static_cast<int>(arg.size()) + 1;
1477
- }
1478
- ASSERT_EQ(0, ROCKSDB_NAMESPACE::io_tracer_parser(argc, argv));
1475
+ argv[argc++] = arg_buffer + cursor;
1476
+ cursor += static_cast<int>(arg.size()) + 1;
1479
1477
  }
1478
+ ASSERT_EQ(0, ROCKSDB_NAMESPACE::io_tracer_parser(argc, argv));
1479
+ }
1480
1480
  #endif // GFLAGS
1481
1481
  #endif // ROCKSDB_LITE
1482
- } // namespace
1482
+ } // namespace
1483
1483
 
1484
1484
  // Tests the default implementation of ReadAsync API with PosixFileSystem.
1485
- TEST_P(PrefetchTest, ReadAsyncWithPosixFS) {
1486
- if (mem_env_ || encrypted_env_) {
1487
- ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1488
- return;
1489
- }
1485
+ TEST_P(PrefetchTest, ReadAsyncWithPosixFS) {
1486
+ if (mem_env_ || encrypted_env_) {
1487
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1488
+ return;
1489
+ }
1490
1490
 
1491
- const int kNumKeys = 1000;
1492
- std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1493
- FileSystem::Default(), /*support_prefetch=*/false);
1494
- std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1495
-
1496
- bool use_direct_io = std::get<0>(GetParam());
1497
- Options options = CurrentOptions();
1498
- options.write_buffer_size = 1024;
1499
- options.create_if_missing = true;
1500
- options.compression = kNoCompression;
1501
- options.env = env.get();
1502
- options.statistics = CreateDBStatistics();
1503
- if (use_direct_io) {
1504
- options.use_direct_reads = true;
1505
- options.use_direct_io_for_flush_and_compaction = true;
1506
- }
1507
- BlockBasedTableOptions table_options;
1508
- table_options.no_block_cache = true;
1509
- table_options.cache_index_and_filter_blocks = false;
1510
- table_options.metadata_block_size = 1024;
1511
- table_options.index_type =
1512
- BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1513
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1514
-
1515
- Status s = TryReopen(options);
1516
- if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1517
- // If direct IO is not supported, skip the test
1518
- return;
1519
- } else {
1520
- ASSERT_OK(s);
1521
- }
1491
+ const int kNumKeys = 1000;
1492
+ std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1493
+ FileSystem::Default(), /*support_prefetch=*/false);
1494
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1522
1495
 
1523
- int total_keys = 0;
1524
- // Write the keys.
1525
- {
1526
- WriteBatch batch;
1527
- Random rnd(309);
1528
- for (int j = 0; j < 5; j++) {
1529
- for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
1530
- ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1531
- total_keys++;
1532
- }
1533
- ASSERT_OK(db_->Write(WriteOptions(), &batch));
1534
- ASSERT_OK(Flush());
1496
+ bool use_direct_io = std::get<0>(GetParam());
1497
+ Options options = CurrentOptions();
1498
+ options.write_buffer_size = 1024;
1499
+ options.create_if_missing = true;
1500
+ options.compression = kNoCompression;
1501
+ options.env = env.get();
1502
+ options.statistics = CreateDBStatistics();
1503
+ if (use_direct_io) {
1504
+ options.use_direct_reads = true;
1505
+ options.use_direct_io_for_flush_and_compaction = true;
1506
+ }
1507
+ BlockBasedTableOptions table_options;
1508
+ table_options.no_block_cache = true;
1509
+ table_options.cache_index_and_filter_blocks = false;
1510
+ table_options.metadata_block_size = 1024;
1511
+ table_options.index_type =
1512
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1513
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1514
+
1515
+ Status s = TryReopen(options);
1516
+ if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1517
+ // If direct IO is not supported, skip the test
1518
+ return;
1519
+ } else {
1520
+ ASSERT_OK(s);
1521
+ }
1522
+
1523
+ int total_keys = 0;
1524
+ // Write the keys.
1525
+ {
1526
+ WriteBatch batch;
1527
+ Random rnd(309);
1528
+ for (int j = 0; j < 5; j++) {
1529
+ for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
1530
+ ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1531
+ total_keys++;
1535
1532
  }
1536
- MoveFilesToLevel(2);
1533
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
1534
+ ASSERT_OK(Flush());
1537
1535
  }
1536
+ MoveFilesToLevel(2);
1537
+ }
1538
1538
 
1539
- int buff_prefetch_count = 0;
1540
- bool read_async_called = false;
1541
- ReadOptions ro;
1542
- ro.adaptive_readahead = true;
1543
- ro.async_io = true;
1539
+ int buff_prefetch_count = 0;
1540
+ bool read_async_called = false;
1541
+ ReadOptions ro;
1542
+ ro.adaptive_readahead = true;
1543
+ ro.async_io = true;
1544
+
1545
+ if (std::get<1>(GetParam())) {
1546
+ ro.readahead_size = 16 * 1024;
1547
+ }
1548
+
1549
+ SyncPoint::GetInstance()->SetCallBack(
1550
+ "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1551
+ [&](void*) { buff_prefetch_count++; });
1552
+
1553
+ SyncPoint::GetInstance()->SetCallBack(
1554
+ "UpdateResults::io_uring_result",
1555
+ [&](void* /*arg*/) { read_async_called = true; });
1556
+ SyncPoint::GetInstance()->EnableProcessing();
1557
+
1558
+ // Read the keys.
1559
+ {
1560
+ ASSERT_OK(options.statistics->Reset());
1561
+ get_perf_context()->Reset();
1544
1562
 
1545
- if (std::get<1>(GetParam())) {
1546
- ro.readahead_size = 16 * 1024;
1563
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1564
+ int num_keys = 0;
1565
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1566
+ ASSERT_OK(iter->status());
1567
+ num_keys++;
1547
1568
  }
1548
1569
 
1549
- SyncPoint::GetInstance()->SetCallBack(
1550
- "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1551
- [&](void*) { buff_prefetch_count++; });
1570
+ ASSERT_EQ(num_keys, total_keys);
1571
+ ASSERT_GT(buff_prefetch_count, 0);
1552
1572
 
1553
- SyncPoint::GetInstance()->SetCallBack(
1554
- "UpdateResults::io_uring_result",
1555
- [&](void* /*arg*/) { read_async_called = true; });
1556
- SyncPoint::GetInstance()->EnableProcessing();
1573
+ // Check stats to make sure async prefetch is done.
1574
+ {
1575
+ HistogramData async_read_bytes;
1576
+ options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
1577
+ HistogramData prefetched_bytes_discarded;
1578
+ options.statistics->histogramData(PREFETCHED_BYTES_DISCARDED,
1579
+ &prefetched_bytes_discarded);
1580
+
1581
+ // Not all platforms support iouring. In that case, ReadAsync in posix
1582
+ // won't submit async requests.
1583
+ if (read_async_called) {
1584
+ ASSERT_GT(async_read_bytes.count, 0);
1585
+ } else {
1586
+ ASSERT_EQ(async_read_bytes.count, 0);
1587
+ }
1588
+ ASSERT_GT(prefetched_bytes_discarded.count, 0);
1589
+ }
1590
+ ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1591
+ }
1557
1592
 
1558
- // Read the keys.
1593
+ {
1594
+ // Read the keys using seek.
1559
1595
  {
1560
1596
  ASSERT_OK(options.statistics->Reset());
1561
1597
  get_perf_context()->Reset();
1562
1598
 
1563
1599
  auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1564
1600
  int num_keys = 0;
1565
- for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1601
+ iter->Seek(BuildKey(450));
1602
+ while (iter->Valid()) {
1603
+ ASSERT_OK(iter->status());
1604
+ num_keys++;
1605
+ iter->Next();
1606
+ }
1607
+ ASSERT_OK(iter->status());
1608
+
1609
+ iter->Seek(BuildKey(450));
1610
+ while (iter->Valid()) {
1566
1611
  ASSERT_OK(iter->status());
1567
1612
  num_keys++;
1613
+ iter->Prev();
1568
1614
  }
1569
1615
 
1570
- ASSERT_EQ(num_keys, total_keys);
1616
+ ASSERT_EQ(num_keys, total_keys + 1);
1571
1617
  ASSERT_GT(buff_prefetch_count, 0);
1572
1618
 
1573
1619
  // Check stats to make sure async prefetch is done.
@@ -1582,498 +1628,448 @@ namespace {
1582
1628
  // won't submit async requests.
1583
1629
  if (read_async_called) {
1584
1630
  ASSERT_GT(async_read_bytes.count, 0);
1631
+ ASSERT_GT(get_perf_context()->number_async_seek, 0);
1585
1632
  } else {
1586
1633
  ASSERT_EQ(async_read_bytes.count, 0);
1634
+ ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1587
1635
  }
1588
1636
  ASSERT_GT(prefetched_bytes_discarded.count, 0);
1589
1637
  }
1590
- ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1591
1638
  }
1639
+ }
1592
1640
 
1593
- {
1594
- // Read the keys using seek.
1595
- {
1596
- ASSERT_OK(options.statistics->Reset());
1597
- get_perf_context()->Reset();
1598
-
1599
- auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1600
- int num_keys = 0;
1601
- iter->Seek(BuildKey(450));
1602
- while (iter->Valid()) {
1603
- ASSERT_OK(iter->status());
1604
- num_keys++;
1605
- iter->Next();
1606
- }
1607
- ASSERT_OK(iter->status());
1641
+ SyncPoint::GetInstance()->DisableProcessing();
1642
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1608
1643
 
1609
- iter->Seek(BuildKey(450));
1610
- while (iter->Valid()) {
1611
- ASSERT_OK(iter->status());
1612
- num_keys++;
1613
- iter->Prev();
1614
- }
1644
+ Close();
1645
+ }
1615
1646
 
1616
- ASSERT_EQ(num_keys, total_keys + 1);
1617
- ASSERT_GT(buff_prefetch_count, 0);
1618
-
1619
- // Check stats to make sure async prefetch is done.
1620
- {
1621
- HistogramData async_read_bytes;
1622
- options.statistics->histogramData(ASYNC_READ_BYTES,
1623
- &async_read_bytes);
1624
- HistogramData prefetched_bytes_discarded;
1625
- options.statistics->histogramData(PREFETCHED_BYTES_DISCARDED,
1626
- &prefetched_bytes_discarded);
1627
-
1628
- // Not all platforms support iouring. In that case, ReadAsync in posix
1629
- // won't submit async requests.
1630
- if (read_async_called) {
1631
- ASSERT_GT(async_read_bytes.count, 0);
1632
- ASSERT_GT(get_perf_context()->number_async_seek, 0);
1633
- } else {
1634
- ASSERT_EQ(async_read_bytes.count, 0);
1635
- ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1636
- }
1637
- ASSERT_GT(prefetched_bytes_discarded.count, 0);
1638
- }
1639
- }
1640
- }
1647
+ TEST_P(PrefetchTest, MultipleSeekWithPosixFS) {
1648
+ if (mem_env_ || encrypted_env_) {
1649
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1650
+ return;
1651
+ }
1641
1652
 
1642
- SyncPoint::GetInstance()->DisableProcessing();
1643
- SyncPoint::GetInstance()->ClearAllCallBacks();
1653
+ const int kNumKeys = 1000;
1654
+ std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1655
+ FileSystem::Default(), /*support_prefetch=*/false);
1656
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1644
1657
 
1645
- Close();
1658
+ bool use_direct_io = std::get<0>(GetParam());
1659
+ Options options = CurrentOptions();
1660
+ options.write_buffer_size = 1024;
1661
+ options.create_if_missing = true;
1662
+ options.compression = kNoCompression;
1663
+ options.env = env.get();
1664
+ options.statistics = CreateDBStatistics();
1665
+ if (use_direct_io) {
1666
+ options.use_direct_reads = true;
1667
+ options.use_direct_io_for_flush_and_compaction = true;
1646
1668
  }
1669
+ BlockBasedTableOptions table_options;
1670
+ table_options.no_block_cache = true;
1671
+ table_options.cache_index_and_filter_blocks = false;
1672
+ table_options.metadata_block_size = 1024;
1673
+ table_options.index_type =
1674
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1675
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1647
1676
 
1648
- TEST_P(PrefetchTest, MultipleSeekWithPosixFS) {
1649
- if (mem_env_ || encrypted_env_) {
1650
- ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1651
- return;
1652
- }
1677
+ Status s = TryReopen(options);
1678
+ if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1679
+ // If direct IO is not supported, skip the test
1680
+ return;
1681
+ } else {
1682
+ ASSERT_OK(s);
1683
+ }
1653
1684
 
1654
- const int kNumKeys = 1000;
1655
- std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1656
- FileSystem::Default(), /*support_prefetch=*/false);
1657
- std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1658
-
1659
- bool use_direct_io = std::get<0>(GetParam());
1660
- Options options = CurrentOptions();
1661
- options.write_buffer_size = 1024;
1662
- options.create_if_missing = true;
1663
- options.compression = kNoCompression;
1664
- options.env = env.get();
1665
- options.statistics = CreateDBStatistics();
1666
- if (use_direct_io) {
1667
- options.use_direct_reads = true;
1668
- options.use_direct_io_for_flush_and_compaction = true;
1685
+ int total_keys = 0;
1686
+ // Write the keys.
1687
+ {
1688
+ WriteBatch batch;
1689
+ Random rnd(309);
1690
+ for (int j = 0; j < 5; j++) {
1691
+ for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
1692
+ ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1693
+ total_keys++;
1694
+ }
1695
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
1696
+ ASSERT_OK(Flush());
1669
1697
  }
1670
- BlockBasedTableOptions table_options;
1671
- table_options.no_block_cache = true;
1672
- table_options.cache_index_and_filter_blocks = false;
1673
- table_options.metadata_block_size = 1024;
1674
- table_options.index_type =
1675
- BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1676
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1677
-
1678
- Status s = TryReopen(options);
1679
- if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1680
- // If direct IO is not supported, skip the test
1681
- return;
1682
- } else {
1683
- ASSERT_OK(s);
1698
+ MoveFilesToLevel(2);
1699
+ }
1700
+
1701
+ int num_keys_first_batch = 0;
1702
+ int num_keys_second_batch = 0;
1703
+ // Calculate number of keys without async_io for correctness validation.
1704
+ {
1705
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ReadOptions()));
1706
+ // First Seek.
1707
+ iter->Seek(BuildKey(450));
1708
+ while (iter->Valid() && num_keys_first_batch < 100) {
1709
+ ASSERT_OK(iter->status());
1710
+ num_keys_first_batch++;
1711
+ iter->Next();
1684
1712
  }
1713
+ ASSERT_OK(iter->status());
1685
1714
 
1686
- int total_keys = 0;
1687
- // Write the keys.
1688
- {
1689
- WriteBatch batch;
1690
- Random rnd(309);
1691
- for (int j = 0; j < 5; j++) {
1692
- for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
1693
- ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1694
- total_keys++;
1695
- }
1696
- ASSERT_OK(db_->Write(WriteOptions(), &batch));
1697
- ASSERT_OK(Flush());
1698
- }
1699
- MoveFilesToLevel(2);
1715
+ iter->Seek(BuildKey(942));
1716
+ while (iter->Valid()) {
1717
+ ASSERT_OK(iter->status());
1718
+ num_keys_second_batch++;
1719
+ iter->Next();
1700
1720
  }
1721
+ ASSERT_OK(iter->status());
1722
+ }
1701
1723
 
1702
- int num_keys_first_batch = 0;
1703
- int num_keys_second_batch = 0;
1704
- // Calculate number of keys without async_io for correctness validation.
1724
+ int buff_prefetch_count = 0;
1725
+ bool read_async_called = false;
1726
+ ReadOptions ro;
1727
+ ro.adaptive_readahead = true;
1728
+ ro.async_io = true;
1729
+
1730
+ if (std::get<1>(GetParam())) {
1731
+ ro.readahead_size = 16 * 1024;
1732
+ }
1733
+
1734
+ SyncPoint::GetInstance()->SetCallBack(
1735
+ "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1736
+ [&](void*) { buff_prefetch_count++; });
1737
+
1738
+ SyncPoint::GetInstance()->SetCallBack(
1739
+ "UpdateResults::io_uring_result",
1740
+ [&](void* /*arg*/) { read_async_called = true; });
1741
+ SyncPoint::GetInstance()->EnableProcessing();
1742
+
1743
+ // Read the keys using seek.
1744
+ {
1745
+ ASSERT_OK(options.statistics->Reset());
1746
+ get_perf_context()->Reset();
1747
+
1748
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1749
+ int num_keys = 0;
1750
+ // First Seek.
1705
1751
  {
1706
- auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ReadOptions()));
1707
- // First Seek.
1708
1752
  iter->Seek(BuildKey(450));
1709
- while (iter->Valid() && num_keys_first_batch < 100) {
1753
+ while (iter->Valid() && num_keys < 100) {
1710
1754
  ASSERT_OK(iter->status());
1711
- num_keys_first_batch++;
1755
+ num_keys++;
1712
1756
  iter->Next();
1713
1757
  }
1714
1758
  ASSERT_OK(iter->status());
1759
+ ASSERT_EQ(num_keys, num_keys_first_batch);
1760
+ // Check stats to make sure async prefetch is done.
1761
+ {
1762
+ HistogramData async_read_bytes;
1763
+ options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
1715
1764
 
1716
- iter->Seek(BuildKey(942));
1717
- while (iter->Valid()) {
1718
- ASSERT_OK(iter->status());
1719
- num_keys_second_batch++;
1720
- iter->Next();
1765
+ // Not all platforms support iouring. In that case, ReadAsync in posix
1766
+ // won't submit async requests.
1767
+ if (read_async_called) {
1768
+ ASSERT_GT(async_read_bytes.count, 0);
1769
+ ASSERT_GT(get_perf_context()->number_async_seek, 0);
1770
+ } else {
1771
+ ASSERT_EQ(async_read_bytes.count, 0);
1772
+ ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1773
+ }
1721
1774
  }
1722
- ASSERT_OK(iter->status());
1723
1775
  }
1724
1776
 
1725
- int buff_prefetch_count = 0;
1726
- bool read_async_called = false;
1727
- ReadOptions ro;
1728
- ro.adaptive_readahead = true;
1729
- ro.async_io = true;
1730
-
1731
- if (std::get<1>(GetParam())) {
1732
- ro.readahead_size = 16 * 1024;
1733
- }
1734
-
1735
- SyncPoint::GetInstance()->SetCallBack(
1736
- "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1737
- [&](void*) { buff_prefetch_count++; });
1738
-
1739
- SyncPoint::GetInstance()->SetCallBack(
1740
- "UpdateResults::io_uring_result",
1741
- [&](void* /*arg*/) { read_async_called = true; });
1742
- SyncPoint::GetInstance()->EnableProcessing();
1743
-
1744
- // Read the keys using seek.
1777
+ // Second Seek.
1745
1778
  {
1779
+ num_keys = 0;
1746
1780
  ASSERT_OK(options.statistics->Reset());
1747
1781
  get_perf_context()->Reset();
1748
1782
 
1749
- auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1750
- int num_keys = 0;
1751
- // First Seek.
1752
- {
1753
- iter->Seek(BuildKey(450));
1754
- while (iter->Valid() && num_keys < 100) {
1755
- ASSERT_OK(iter->status());
1756
- num_keys++;
1757
- iter->Next();
1758
- }
1783
+ iter->Seek(BuildKey(942));
1784
+ while (iter->Valid()) {
1759
1785
  ASSERT_OK(iter->status());
1760
- ASSERT_EQ(num_keys, num_keys_first_batch);
1761
- // Check stats to make sure async prefetch is done.
1762
- {
1763
- HistogramData async_read_bytes;
1764
- options.statistics->histogramData(ASYNC_READ_BYTES,
1765
- &async_read_bytes);
1766
-
1767
- // Not all platforms support iouring. In that case, ReadAsync in posix
1768
- // won't submit async requests.
1769
- if (read_async_called) {
1770
- ASSERT_GT(async_read_bytes.count, 0);
1771
- ASSERT_GT(get_perf_context()->number_async_seek, 0);
1772
- } else {
1773
- ASSERT_EQ(async_read_bytes.count, 0);
1774
- ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1775
- }
1776
- }
1786
+ num_keys++;
1787
+ iter->Next();
1777
1788
  }
1789
+ ASSERT_OK(iter->status());
1790
+ ASSERT_EQ(num_keys, num_keys_second_batch);
1778
1791
 
1779
- // Second Seek.
1792
+ ASSERT_GT(buff_prefetch_count, 0);
1793
+
1794
+ // Check stats to make sure async prefetch is done.
1780
1795
  {
1781
- num_keys = 0;
1782
- ASSERT_OK(options.statistics->Reset());
1783
- get_perf_context()->Reset();
1784
-
1785
- iter->Seek(BuildKey(942));
1786
- while (iter->Valid()) {
1787
- ASSERT_OK(iter->status());
1788
- num_keys++;
1789
- iter->Next();
1790
- }
1791
- ASSERT_OK(iter->status());
1792
- ASSERT_EQ(num_keys, num_keys_second_batch);
1793
-
1794
- ASSERT_GT(buff_prefetch_count, 0);
1795
-
1796
- // Check stats to make sure async prefetch is done.
1797
- {
1798
- HistogramData async_read_bytes;
1799
- options.statistics->histogramData(ASYNC_READ_BYTES,
1800
- &async_read_bytes);
1801
- HistogramData prefetched_bytes_discarded;
1802
- options.statistics->histogramData(PREFETCHED_BYTES_DISCARDED,
1803
- &prefetched_bytes_discarded);
1804
-
1805
- // Not all platforms support iouring. In that case, ReadAsync in posix
1806
- // won't submit async requests.
1807
- if (read_async_called) {
1808
- ASSERT_GT(async_read_bytes.count, 0);
1809
- ASSERT_GT(get_perf_context()->number_async_seek, 0);
1810
- } else {
1811
- ASSERT_EQ(async_read_bytes.count, 0);
1812
- ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1813
- }
1814
- ASSERT_GT(prefetched_bytes_discarded.count, 0);
1796
+ HistogramData async_read_bytes;
1797
+ options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
1798
+ HistogramData prefetched_bytes_discarded;
1799
+ options.statistics->histogramData(PREFETCHED_BYTES_DISCARDED,
1800
+ &prefetched_bytes_discarded);
1801
+
1802
+ // Not all platforms support iouring. In that case, ReadAsync in posix
1803
+ // won't submit async requests.
1804
+ if (read_async_called) {
1805
+ ASSERT_GT(async_read_bytes.count, 0);
1806
+ ASSERT_GT(get_perf_context()->number_async_seek, 0);
1807
+ } else {
1808
+ ASSERT_EQ(async_read_bytes.count, 0);
1809
+ ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1815
1810
  }
1811
+ ASSERT_GT(prefetched_bytes_discarded.count, 0);
1816
1812
  }
1817
1813
  }
1814
+ }
1818
1815
 
1819
- SyncPoint::GetInstance()->DisableProcessing();
1820
- SyncPoint::GetInstance()->ClearAllCallBacks();
1821
- Close();
1816
+ SyncPoint::GetInstance()->DisableProcessing();
1817
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1818
+ Close();
1819
+ }
1820
+
1821
+ TEST_P(PrefetchTest, SeekParallelizationTest1) {
1822
+ if (mem_env_ || encrypted_env_) {
1823
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1824
+ return;
1822
1825
  }
1826
+ const int kNumKeys = 2000;
1827
+ // Set options
1828
+ std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1829
+ FileSystem::Default(), /*support_prefetch=*/false);
1830
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1823
1831
 
1824
- TEST_P(PrefetchTest, SeekParallelizationTest1) {
1825
- if (mem_env_ || encrypted_env_) {
1826
- ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1827
- return;
1828
- }
1829
- const int kNumKeys = 2000;
1830
- // Set options
1831
- std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1832
- FileSystem::Default(), /*support_prefetch=*/false);
1833
- std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1834
-
1835
- bool use_direct_io = std::get<0>(GetParam());
1836
- Options options = CurrentOptions();
1837
- options.write_buffer_size = 1024;
1838
- options.create_if_missing = true;
1839
- options.compression = kNoCompression;
1840
- options.env = env.get();
1841
- if (use_direct_io) {
1842
- options.use_direct_reads = true;
1843
- options.use_direct_io_for_flush_and_compaction = true;
1844
- }
1832
+ bool use_direct_io = std::get<0>(GetParam());
1833
+ Options options = CurrentOptions();
1834
+ options.write_buffer_size = 1024;
1835
+ options.create_if_missing = true;
1836
+ options.compression = kNoCompression;
1837
+ options.env = env.get();
1838
+ if (use_direct_io) {
1839
+ options.use_direct_reads = true;
1840
+ options.use_direct_io_for_flush_and_compaction = true;
1841
+ }
1845
1842
 
1846
- options.statistics = CreateDBStatistics();
1847
- BlockBasedTableOptions table_options;
1848
- table_options.no_block_cache = true;
1849
- table_options.cache_index_and_filter_blocks = false;
1850
- table_options.metadata_block_size = 1024;
1851
- table_options.index_type =
1852
- BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1853
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1854
-
1855
- Status s = TryReopen(options);
1856
- if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1857
- // If direct IO is not supported, skip the test
1858
- return;
1859
- } else {
1860
- ASSERT_OK(s);
1861
- }
1843
+ options.statistics = CreateDBStatistics();
1844
+ BlockBasedTableOptions table_options;
1845
+ table_options.no_block_cache = true;
1846
+ table_options.cache_index_and_filter_blocks = false;
1847
+ table_options.metadata_block_size = 1024;
1848
+ table_options.index_type =
1849
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1850
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1862
1851
 
1863
- WriteBatch batch;
1864
- Random rnd(309);
1865
- for (int i = 0; i < kNumKeys; i++) {
1866
- ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1867
- }
1868
- ASSERT_OK(db_->Write(WriteOptions(), &batch));
1852
+ Status s = TryReopen(options);
1853
+ if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1854
+ // If direct IO is not supported, skip the test
1855
+ return;
1856
+ } else {
1857
+ ASSERT_OK(s);
1858
+ }
1869
1859
 
1870
- std::string start_key = BuildKey(0);
1871
- std::string end_key = BuildKey(kNumKeys - 1);
1872
- Slice least(start_key.data(), start_key.size());
1873
- Slice greatest(end_key.data(), end_key.size());
1860
+ WriteBatch batch;
1861
+ Random rnd(309);
1862
+ for (int i = 0; i < kNumKeys; i++) {
1863
+ ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1864
+ }
1865
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
1874
1866
 
1875
- ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &least, &greatest));
1867
+ std::string start_key = BuildKey(0);
1868
+ std::string end_key = BuildKey(kNumKeys - 1);
1869
+ Slice least(start_key.data(), start_key.size());
1870
+ Slice greatest(end_key.data(), end_key.size());
1876
1871
 
1877
- int buff_prefetch_count = 0;
1872
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &least, &greatest));
1878
1873
 
1879
- SyncPoint::GetInstance()->SetCallBack(
1880
- "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1881
- [&](void*) { buff_prefetch_count++; });
1874
+ int buff_prefetch_count = 0;
1882
1875
 
1883
- bool read_async_called = false;
1884
- SyncPoint::GetInstance()->SetCallBack(
1885
- "UpdateResults::io_uring_result",
1886
- [&](void* /*arg*/) { read_async_called = true; });
1887
- SyncPoint::GetInstance()->EnableProcessing();
1876
+ SyncPoint::GetInstance()->SetCallBack(
1877
+ "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
1878
+ [&](void*) { buff_prefetch_count++; });
1888
1879
 
1889
- SyncPoint::GetInstance()->EnableProcessing();
1890
- ReadOptions ro;
1891
- ro.adaptive_readahead = true;
1892
- ro.async_io = true;
1880
+ bool read_async_called = false;
1881
+ SyncPoint::GetInstance()->SetCallBack(
1882
+ "UpdateResults::io_uring_result",
1883
+ [&](void* /*arg*/) { read_async_called = true; });
1884
+ SyncPoint::GetInstance()->EnableProcessing();
1893
1885
 
1894
- if (std::get<1>(GetParam())) {
1895
- ro.readahead_size = 16 * 1024;
1896
- }
1886
+ SyncPoint::GetInstance()->EnableProcessing();
1887
+ ReadOptions ro;
1888
+ ro.adaptive_readahead = true;
1889
+ ro.async_io = true;
1897
1890
 
1898
- {
1899
- ASSERT_OK(options.statistics->Reset());
1900
- // Each block contains around 4 keys.
1901
- auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1902
- iter->Seek(
1903
- BuildKey(0)); // Prefetch data because of seek parallelization.
1904
- ASSERT_TRUE(iter->Valid());
1905
- iter->Next();
1906
- ASSERT_TRUE(iter->Valid());
1907
- iter->Next();
1908
- ASSERT_TRUE(iter->Valid());
1909
- iter->Next();
1910
- ASSERT_TRUE(iter->Valid());
1891
+ if (std::get<1>(GetParam())) {
1892
+ ro.readahead_size = 16 * 1024;
1893
+ }
1911
1894
 
1912
- // New data block. Since num_file_reads in FilePrefetch after this read is
1913
- // 2, it won't go for prefetching.
1914
- iter->Next();
1915
- ASSERT_TRUE(iter->Valid());
1916
- iter->Next();
1917
- ASSERT_TRUE(iter->Valid());
1918
- iter->Next();
1919
- ASSERT_TRUE(iter->Valid());
1920
- iter->Next();
1921
- ASSERT_TRUE(iter->Valid());
1895
+ {
1896
+ ASSERT_OK(options.statistics->Reset());
1897
+ // Each block contains around 4 keys.
1898
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
1899
+ iter->Seek(BuildKey(0)); // Prefetch data because of seek parallelization.
1900
+ ASSERT_TRUE(iter->Valid());
1901
+ iter->Next();
1902
+ ASSERT_TRUE(iter->Valid());
1903
+ iter->Next();
1904
+ ASSERT_TRUE(iter->Valid());
1905
+ iter->Next();
1906
+ ASSERT_TRUE(iter->Valid());
1922
1907
 
1923
- // Prefetch data.
1924
- iter->Next();
1925
- ASSERT_TRUE(iter->Valid());
1908
+ // New data block. Since num_file_reads in FilePrefetch after this read is
1909
+ // 2, it won't go for prefetching.
1910
+ iter->Next();
1911
+ ASSERT_TRUE(iter->Valid());
1912
+ iter->Next();
1913
+ ASSERT_TRUE(iter->Valid());
1914
+ iter->Next();
1915
+ ASSERT_TRUE(iter->Valid());
1916
+ iter->Next();
1917
+ ASSERT_TRUE(iter->Valid());
1926
1918
 
1927
- // Check stats to make sure async prefetch is done.
1928
- {
1929
- HistogramData async_read_bytes;
1930
- options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
1931
- // Not all platforms support iouring. In that case, ReadAsync in posix
1932
- // won't submit async requests.
1933
- if (read_async_called) {
1934
- ASSERT_GT(async_read_bytes.count, 0);
1935
- ASSERT_GT(get_perf_context()->number_async_seek, 0);
1936
- if (std::get<1>(GetParam())) {
1937
- ASSERT_EQ(buff_prefetch_count, 1);
1938
- } else {
1939
- ASSERT_EQ(buff_prefetch_count, 2);
1940
- }
1941
- } else {
1942
- ASSERT_EQ(async_read_bytes.count, 0);
1943
- ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1919
+ // Prefetch data.
1920
+ iter->Next();
1921
+ ASSERT_TRUE(iter->Valid());
1922
+
1923
+ // Check stats to make sure async prefetch is done.
1924
+ {
1925
+ HistogramData async_read_bytes;
1926
+ options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
1927
+ // Not all platforms support iouring. In that case, ReadAsync in posix
1928
+ // won't submit async requests.
1929
+ if (read_async_called) {
1930
+ ASSERT_GT(async_read_bytes.count, 0);
1931
+ ASSERT_GT(get_perf_context()->number_async_seek, 0);
1932
+ if (std::get<1>(GetParam())) {
1944
1933
  ASSERT_EQ(buff_prefetch_count, 1);
1934
+ } else {
1935
+ ASSERT_EQ(buff_prefetch_count, 2);
1945
1936
  }
1937
+ } else {
1938
+ ASSERT_EQ(async_read_bytes.count, 0);
1939
+ ASSERT_EQ(get_perf_context()->number_async_seek, 0);
1940
+ ASSERT_EQ(buff_prefetch_count, 1);
1946
1941
  }
1947
-
1948
- buff_prefetch_count = 0;
1949
1942
  }
1950
- Close();
1943
+
1944
+ buff_prefetch_count = 0;
1951
1945
  }
1946
+ Close();
1947
+ }
1952
1948
 
1953
1949
  #ifndef ROCKSDB_LITE
1954
1950
  #ifdef GFLAGS
1955
- TEST_P(PrefetchTest, TraceReadAsyncWithCallbackWrapper) {
1956
- if (mem_env_ || encrypted_env_) {
1957
- ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1958
- return;
1959
- }
1951
+ TEST_P(PrefetchTest, TraceReadAsyncWithCallbackWrapper) {
1952
+ if (mem_env_ || encrypted_env_) {
1953
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1954
+ return;
1955
+ }
1960
1956
 
1961
- const int kNumKeys = 1000;
1962
- std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1963
- FileSystem::Default(), /*support_prefetch=*/false);
1964
- std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1965
-
1966
- bool use_direct_io = std::get<0>(GetParam());
1967
- Options options = CurrentOptions();
1968
- options.write_buffer_size = 1024;
1969
- options.create_if_missing = true;
1970
- options.compression = kNoCompression;
1971
- options.env = env.get();
1972
- options.statistics = CreateDBStatistics();
1973
- if (use_direct_io) {
1974
- options.use_direct_reads = true;
1975
- options.use_direct_io_for_flush_and_compaction = true;
1976
- }
1977
- BlockBasedTableOptions table_options;
1978
- table_options.no_block_cache = true;
1979
- table_options.cache_index_and_filter_blocks = false;
1980
- table_options.metadata_block_size = 1024;
1981
- table_options.index_type =
1982
- BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1983
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1984
-
1985
- Status s = TryReopen(options);
1986
- if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1987
- // If direct IO is not supported, skip the test
1988
- return;
1989
- } else {
1990
- ASSERT_OK(s);
1991
- }
1957
+ const int kNumKeys = 1000;
1958
+ std::shared_ptr<MockFS> fs = std::make_shared<MockFS>(
1959
+ FileSystem::Default(), /*support_prefetch=*/false);
1960
+ std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
1992
1961
 
1993
- int total_keys = 0;
1994
- // Write the keys.
1995
- {
1996
- WriteBatch batch;
1997
- Random rnd(309);
1998
- for (int j = 0; j < 5; j++) {
1999
- for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
2000
- ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
2001
- total_keys++;
2002
- }
2003
- ASSERT_OK(db_->Write(WriteOptions(), &batch));
2004
- ASSERT_OK(Flush());
1962
+ bool use_direct_io = std::get<0>(GetParam());
1963
+ Options options = CurrentOptions();
1964
+ options.write_buffer_size = 1024;
1965
+ options.create_if_missing = true;
1966
+ options.compression = kNoCompression;
1967
+ options.env = env.get();
1968
+ options.statistics = CreateDBStatistics();
1969
+ if (use_direct_io) {
1970
+ options.use_direct_reads = true;
1971
+ options.use_direct_io_for_flush_and_compaction = true;
1972
+ }
1973
+ BlockBasedTableOptions table_options;
1974
+ table_options.no_block_cache = true;
1975
+ table_options.cache_index_and_filter_blocks = false;
1976
+ table_options.metadata_block_size = 1024;
1977
+ table_options.index_type =
1978
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
1979
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1980
+
1981
+ Status s = TryReopen(options);
1982
+ if (use_direct_io && (s.IsNotSupported() || s.IsInvalidArgument())) {
1983
+ // If direct IO is not supported, skip the test
1984
+ return;
1985
+ } else {
1986
+ ASSERT_OK(s);
1987
+ }
1988
+
1989
+ int total_keys = 0;
1990
+ // Write the keys.
1991
+ {
1992
+ WriteBatch batch;
1993
+ Random rnd(309);
1994
+ for (int j = 0; j < 5; j++) {
1995
+ for (int i = j * kNumKeys; i < (j + 1) * kNumKeys; i++) {
1996
+ ASSERT_OK(batch.Put(BuildKey(i), rnd.RandomString(1000)));
1997
+ total_keys++;
2005
1998
  }
2006
- MoveFilesToLevel(2);
1999
+ ASSERT_OK(db_->Write(WriteOptions(), &batch));
2000
+ ASSERT_OK(Flush());
2007
2001
  }
2002
+ MoveFilesToLevel(2);
2003
+ }
2008
2004
 
2009
- int buff_prefetch_count = 0;
2010
- bool read_async_called = false;
2011
- ReadOptions ro;
2012
- ro.adaptive_readahead = true;
2013
- ro.async_io = true;
2005
+ int buff_prefetch_count = 0;
2006
+ bool read_async_called = false;
2007
+ ReadOptions ro;
2008
+ ro.adaptive_readahead = true;
2009
+ ro.async_io = true;
2014
2010
 
2015
- if (std::get<1>(GetParam())) {
2016
- ro.readahead_size = 16 * 1024;
2017
- }
2011
+ if (std::get<1>(GetParam())) {
2012
+ ro.readahead_size = 16 * 1024;
2013
+ }
2018
2014
 
2019
- SyncPoint::GetInstance()->SetCallBack(
2020
- "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
2021
- [&](void*) { buff_prefetch_count++; });
2015
+ SyncPoint::GetInstance()->SetCallBack(
2016
+ "FilePrefetchBuffer::PrefetchAsyncInternal:Start",
2017
+ [&](void*) { buff_prefetch_count++; });
2022
2018
 
2023
- SyncPoint::GetInstance()->SetCallBack(
2024
- "UpdateResults::io_uring_result",
2025
- [&](void* /*arg*/) { read_async_called = true; });
2026
- SyncPoint::GetInstance()->EnableProcessing();
2019
+ SyncPoint::GetInstance()->SetCallBack(
2020
+ "UpdateResults::io_uring_result",
2021
+ [&](void* /*arg*/) { read_async_called = true; });
2022
+ SyncPoint::GetInstance()->EnableProcessing();
2027
2023
 
2028
- // Read the keys.
2029
- {
2030
- // Start io_tracing.
2031
- WriteOptions write_opt;
2032
- TraceOptions trace_opt;
2033
- std::unique_ptr<TraceWriter> trace_writer;
2034
- std::string trace_file_path = dbname_ + "/io_trace_file";
2035
-
2036
- ASSERT_OK(NewFileTraceWriter(env_, EnvOptions(), trace_file_path,
2037
- &trace_writer));
2038
- ASSERT_OK(db_->StartIOTrace(trace_opt, std::move(trace_writer)));
2039
- ASSERT_OK(options.statistics->Reset());
2024
+ // Read the keys.
2025
+ {
2026
+ // Start io_tracing.
2027
+ WriteOptions write_opt;
2028
+ TraceOptions trace_opt;
2029
+ std::unique_ptr<TraceWriter> trace_writer;
2030
+ std::string trace_file_path = dbname_ + "/io_trace_file";
2031
+
2032
+ ASSERT_OK(
2033
+ NewFileTraceWriter(env_, EnvOptions(), trace_file_path, &trace_writer));
2034
+ ASSERT_OK(db_->StartIOTrace(trace_opt, std::move(trace_writer)));
2035
+ ASSERT_OK(options.statistics->Reset());
2040
2036
 
2041
- auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
2042
- int num_keys = 0;
2043
- for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2044
- ASSERT_OK(iter->status());
2045
- num_keys++;
2046
- }
2037
+ auto iter = std::unique_ptr<Iterator>(db_->NewIterator(ro));
2038
+ int num_keys = 0;
2039
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2040
+ ASSERT_OK(iter->status());
2041
+ num_keys++;
2042
+ }
2047
2043
 
2048
- // End the tracing.
2049
- ASSERT_OK(db_->EndIOTrace());
2050
- ASSERT_OK(env_->FileExists(trace_file_path));
2044
+ // End the tracing.
2045
+ ASSERT_OK(db_->EndIOTrace());
2046
+ ASSERT_OK(env_->FileExists(trace_file_path));
2051
2047
 
2052
- ASSERT_EQ(num_keys, total_keys);
2053
- ASSERT_GT(buff_prefetch_count, 0);
2048
+ ASSERT_EQ(num_keys, total_keys);
2049
+ ASSERT_GT(buff_prefetch_count, 0);
2054
2050
 
2055
- // Check stats to make sure async prefetch is done.
2056
- {
2057
- HistogramData async_read_bytes;
2058
- options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
2059
- // Not all platforms support iouring. In that case, ReadAsync in posix
2060
- // won't submit async requests.
2061
- if (read_async_called) {
2062
- ASSERT_GT(async_read_bytes.count, 0);
2063
- } else {
2064
- ASSERT_EQ(async_read_bytes.count, 0);
2065
- }
2051
+ // Check stats to make sure async prefetch is done.
2052
+ {
2053
+ HistogramData async_read_bytes;
2054
+ options.statistics->histogramData(ASYNC_READ_BYTES, &async_read_bytes);
2055
+ // Not all platforms support iouring. In that case, ReadAsync in posix
2056
+ // won't submit async requests.
2057
+ if (read_async_called) {
2058
+ ASSERT_GT(async_read_bytes.count, 0);
2059
+ } else {
2060
+ ASSERT_EQ(async_read_bytes.count, 0);
2066
2061
  }
2067
-
2068
- // Check the file to see if ReadAsync is logged.
2069
- RunIOTracerParserTool(trace_file_path);
2070
2062
  }
2071
2063
 
2072
- SyncPoint::GetInstance()->DisableProcessing();
2073
- SyncPoint::GetInstance()->ClearAllCallBacks();
2074
-
2075
- Close();
2064
+ // Check the file to see if ReadAsync is logged.
2065
+ RunIOTracerParserTool(trace_file_path);
2076
2066
  }
2067
+
2068
+ SyncPoint::GetInstance()->DisableProcessing();
2069
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2070
+
2071
+ Close();
2072
+ }
2077
2073
  #endif // GFLAGS
2078
2074
  #endif // ROCKSDB_LITE
2079
2075
  } // namespace ROCKSDB_NAMESPACE