@nxtedition/rocksdb 6.0.0 → 6.0.3

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 (488) hide show
  1. package/BUILDING.md +18 -0
  2. package/binding.cc +16 -17
  3. package/binding.gyp +2 -2
  4. package/deps/rocksdb/build_version.cc +4 -10
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +26 -3
  6. package/deps/rocksdb/rocksdb/Makefile +73 -91
  7. package/deps/rocksdb/rocksdb/TARGETS +27 -2
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
  13. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  14. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  15. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  16. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  17. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  18. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  19. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  20. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  21. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  22. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  23. package/deps/rocksdb/rocksdb/common.mk +30 -0
  24. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  25. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  26. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  27. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  28. package/deps/rocksdb/rocksdb/db/builder.cc +22 -7
  29. package/deps/rocksdb/rocksdb/db/c.cc +71 -0
  30. package/deps/rocksdb/rocksdb/db/c_test.c +28 -2
  31. package/deps/rocksdb/rocksdb/db/column_family.cc +12 -5
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +54 -16
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +14 -2
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +85 -18
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +23 -22
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +151 -32
  47. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  49. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  50. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  51. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +404 -32
  52. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  53. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  54. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  55. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  56. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +11 -20
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +15 -1
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +12 -9
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +42 -10
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +54 -23
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +14 -4
  68. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  69. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  70. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  71. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  72. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  74. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  75. package/deps/rocksdb/rocksdb/db/db_options_test.cc +28 -12
  76. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  77. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  78. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +331 -0
  79. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +11 -6
  80. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  81. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_test.cc +60 -42
  83. package/deps/rocksdb/rocksdb/db/db_test2.cc +244 -111
  84. package/deps/rocksdb/rocksdb/db/db_test_util.cc +101 -19
  85. package/deps/rocksdb/rocksdb/db/db_test_util.h +52 -2
  86. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  87. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  88. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +5 -175
  89. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  90. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  91. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  92. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  93. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  94. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  95. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  96. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +91 -12
  97. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -2
  98. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +2 -0
  99. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  100. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  101. package/deps/rocksdb/rocksdb/db/flush_job.cc +28 -15
  102. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  103. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  104. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  105. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +14 -1
  106. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  107. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  108. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  109. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  110. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  111. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  112. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  113. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  114. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  115. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  116. package/deps/rocksdb/rocksdb/db/repair.cc +13 -2
  117. package/deps/rocksdb/rocksdb/db/repair_test.cc +37 -15
  118. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  119. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +3 -1
  120. package/deps/rocksdb/rocksdb/db/table_cache.cc +20 -130
  121. package/deps/rocksdb/rocksdb/db/table_cache.h +3 -2
  122. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +140 -0
  123. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  124. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +133 -133
  125. package/deps/rocksdb/rocksdb/db/version_edit.cc +22 -2
  126. package/deps/rocksdb/rocksdb/db/version_edit.h +13 -4
  127. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +14 -14
  128. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -214
  129. package/deps/rocksdb/rocksdb/db/version_set.h +14 -3
  130. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +154 -0
  131. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -9
  132. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  133. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  134. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  135. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  136. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  137. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -6
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +44 -6
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +374 -275
  147. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  148. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  149. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  150. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  151. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  152. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  153. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  154. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  155. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  156. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  157. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  158. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  159. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  160. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  161. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  162. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +159 -65
  163. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +44 -22
  164. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  165. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +142 -17
  166. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  167. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  168. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +60 -40
  169. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -0
  170. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +23 -5
  171. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +49 -1
  172. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  173. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  174. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  175. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  176. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  177. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  180. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -3
  182. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +4 -1
  184. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  186. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  187. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  188. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +378 -103
  192. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  194. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  195. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  196. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  197. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  198. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  199. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  200. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  201. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  202. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  203. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  204. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  205. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  206. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +7 -8
  207. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  208. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  209. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  210. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  211. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  212. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  213. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  214. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  215. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  216. package/deps/rocksdb/rocksdb/options/cf_options.cc +47 -38
  217. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  218. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  219. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  220. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  221. package/deps/rocksdb/rocksdb/options/db_options.cc +46 -17
  222. package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
  223. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  224. package/deps/rocksdb/rocksdb/options/options_helper.cc +86 -39
  225. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  226. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +12 -7
  227. package/deps/rocksdb/rocksdb/options/options_test.cc +222 -68
  228. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  229. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  230. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  231. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  232. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  233. package/deps/rocksdb/rocksdb/src.mk +6 -1
  234. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  235. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  236. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  237. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  238. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +23 -8
  239. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  240. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +81 -7
  241. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +8 -2
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +94 -726
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +21 -15
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +9 -3
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +754 -0
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -73
  247. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -5
  248. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  249. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +2 -11
  250. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +59 -1
  251. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +18 -0
  252. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  253. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +0 -61
  254. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +0 -13
  255. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  256. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -2
  258. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  259. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -2
  260. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  261. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +8 -4
  262. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  263. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -1
  264. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +65 -7
  265. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -0
  266. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  267. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  268. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  269. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  271. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  272. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +39 -0
  273. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  274. package/deps/rocksdb/rocksdb/table/multiget_context.h +60 -13
  275. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  276. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  277. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  278. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -1
  279. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +1 -1
  280. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  281. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  282. package/deps/rocksdb/rocksdb/table/table_reader.h +13 -0
  283. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  284. package/deps/rocksdb/rocksdb/table/unique_id.cc +84 -25
  285. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +37 -4
  286. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -1
  287. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  288. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  289. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  290. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  291. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  292. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +277 -105
  293. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  294. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  295. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  296. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  297. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  298. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  299. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +26 -4
  300. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  301. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  302. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +72 -0
  303. package/deps/rocksdb/rocksdb/util/async_file_reader.h +144 -0
  304. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  305. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  306. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  307. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  308. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  309. package/deps/rocksdb/rocksdb/util/compression.h +56 -7
  310. package/deps/rocksdb/rocksdb/util/coro_utils.h +111 -0
  311. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  312. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  313. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  314. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  315. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  316. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  317. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  318. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  319. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  320. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +55 -0
  321. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  323. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  324. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  325. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  326. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  327. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  328. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  329. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  332. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  333. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  334. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  335. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  336. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  337. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  338. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  339. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  340. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  341. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  342. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  343. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  344. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  345. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  346. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  347. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  348. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  349. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  350. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  351. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  352. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  353. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  354. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  355. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  356. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  357. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  358. package/deps/rocksdb/rocksdb.gyp +47 -37
  359. package/package-lock.json +23687 -0
  360. package/package.json +2 -30
  361. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  362. package/prebuilds/darwin-x64/node.napi.node +0 -0
  363. package/prebuilds/linux-x64/node.napi.node +0 -0
  364. package/deps/liburing/liburing/README +0 -46
  365. package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
  366. package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
  367. package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
  368. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
  369. package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
  370. package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
  371. package/deps/liburing/liburing/test/Makefile +0 -312
  372. package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
  373. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
  374. package/deps/liburing/liburing/test/accept-link.c +0 -251
  375. package/deps/liburing/liburing/test/accept-reuse.c +0 -164
  376. package/deps/liburing/liburing/test/accept-test.c +0 -79
  377. package/deps/liburing/liburing/test/accept.c +0 -476
  378. package/deps/liburing/liburing/test/across-fork.c +0 -283
  379. package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
  380. package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
  381. package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
  382. package/deps/liburing/liburing/test/close-opath.c +0 -122
  383. package/deps/liburing/liburing/test/config +0 -10
  384. package/deps/liburing/liburing/test/connect.c +0 -398
  385. package/deps/liburing/liburing/test/cq-full.c +0 -96
  386. package/deps/liburing/liburing/test/cq-overflow.c +0 -294
  387. package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
  388. package/deps/liburing/liburing/test/cq-ready.c +0 -94
  389. package/deps/liburing/liburing/test/cq-size.c +0 -58
  390. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
  391. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
  392. package/deps/liburing/liburing/test/defer.c +0 -307
  393. package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
  394. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
  395. package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
  396. package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
  397. package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
  398. package/deps/liburing/liburing/test/eventfd.c +0 -112
  399. package/deps/liburing/liburing/test/fadvise.c +0 -202
  400. package/deps/liburing/liburing/test/fallocate.c +0 -249
  401. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
  402. package/deps/liburing/liburing/test/file-register.c +0 -843
  403. package/deps/liburing/liburing/test/file-update.c +0 -173
  404. package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
  405. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
  406. package/deps/liburing/liburing/test/fixed-link.c +0 -90
  407. package/deps/liburing/liburing/test/fsync.c +0 -224
  408. package/deps/liburing/liburing/test/hardlink.c +0 -136
  409. package/deps/liburing/liburing/test/helpers.c +0 -135
  410. package/deps/liburing/liburing/test/helpers.h +0 -67
  411. package/deps/liburing/liburing/test/io-cancel.c +0 -537
  412. package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
  413. package/deps/liburing/liburing/test/io_uring_register.c +0 -664
  414. package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
  415. package/deps/liburing/liburing/test/iopoll.c +0 -366
  416. package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
  417. package/deps/liburing/liburing/test/lfs-openat.c +0 -273
  418. package/deps/liburing/liburing/test/link-timeout.c +0 -1107
  419. package/deps/liburing/liburing/test/link.c +0 -496
  420. package/deps/liburing/liburing/test/link_drain.c +0 -229
  421. package/deps/liburing/liburing/test/madvise.c +0 -195
  422. package/deps/liburing/liburing/test/mkdir.c +0 -108
  423. package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
  424. package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
  425. package/deps/liburing/liburing/test/nop.c +0 -115
  426. package/deps/liburing/liburing/test/open-close.c +0 -146
  427. package/deps/liburing/liburing/test/openat2.c +0 -240
  428. package/deps/liburing/liburing/test/personality.c +0 -204
  429. package/deps/liburing/liburing/test/pipe-eof.c +0 -81
  430. package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
  431. package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
  432. package/deps/liburing/liburing/test/poll-cancel.c +0 -135
  433. package/deps/liburing/liburing/test/poll-link.c +0 -227
  434. package/deps/liburing/liburing/test/poll-many.c +0 -208
  435. package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
  436. package/deps/liburing/liburing/test/poll-ring.c +0 -48
  437. package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
  438. package/deps/liburing/liburing/test/poll.c +0 -109
  439. package/deps/liburing/liburing/test/probe.c +0 -137
  440. package/deps/liburing/liburing/test/read-write.c +0 -876
  441. package/deps/liburing/liburing/test/register-restrictions.c +0 -633
  442. package/deps/liburing/liburing/test/rename.c +0 -134
  443. package/deps/liburing/liburing/test/ring-leak.c +0 -173
  444. package/deps/liburing/liburing/test/ring-leak2.c +0 -249
  445. package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
  446. package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
  447. package/deps/liburing/liburing/test/runtests.sh +0 -170
  448. package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
  449. package/deps/liburing/liburing/test/self.c +0 -91
  450. package/deps/liburing/liburing/test/send_recv.c +0 -291
  451. package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
  452. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
  453. package/deps/liburing/liburing/test/shared-wq.c +0 -84
  454. package/deps/liburing/liburing/test/short-read.c +0 -75
  455. package/deps/liburing/liburing/test/shutdown.c +0 -163
  456. package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
  457. package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
  458. package/deps/liburing/liburing/test/socket-rw.c +0 -147
  459. package/deps/liburing/liburing/test/splice.c +0 -511
  460. package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
  461. package/deps/liburing/liburing/test/sq-full.c +0 -45
  462. package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
  463. package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
  464. package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
  465. package/deps/liburing/liburing/test/sq-space_left.c +0 -159
  466. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
  467. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
  468. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
  469. package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
  470. package/deps/liburing/liburing/test/statx.c +0 -172
  471. package/deps/liburing/liburing/test/stdout.c +0 -232
  472. package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
  473. package/deps/liburing/liburing/test/submit-reuse.c +0 -239
  474. package/deps/liburing/liburing/test/symlink.c +0 -116
  475. package/deps/liburing/liburing/test/teardowns.c +0 -58
  476. package/deps/liburing/liburing/test/thread-exit.c +0 -131
  477. package/deps/liburing/liburing/test/timeout-new.c +0 -246
  478. package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
  479. package/deps/liburing/liburing/test/timeout.c +0 -1354
  480. package/deps/liburing/liburing/test/unlink.c +0 -111
  481. package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
  482. package/deps/rocksdb/rocksdb/README.md +0 -32
  483. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  484. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  485. package/deps/rocksdb/rocksdb/port/README +0 -10
  486. package/deps/rocksdb/rocksdb/python.mk +0 -9
  487. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  488. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -12,6 +12,7 @@
12
12
  #include "db/db_test_util.h"
13
13
  #include "options/options_helper.h"
14
14
  #include "port/stack_trace.h"
15
+ #include "rocksdb/filter_policy.h"
15
16
  #include "rocksdb/flush_block_policy.h"
16
17
  #include "rocksdb/merge_operator.h"
17
18
  #include "rocksdb/perf_context.h"
@@ -1180,10 +1181,17 @@ TEST_F(DBBasicTest, DBCloseFlushError) {
1180
1181
  Destroy(options);
1181
1182
  }
1182
1183
 
1183
- class DBMultiGetTestWithParam : public DBBasicTest,
1184
- public testing::WithParamInterface<bool> {};
1184
+ class DBMultiGetTestWithParam
1185
+ : public DBBasicTest,
1186
+ public testing::WithParamInterface<std::tuple<bool, bool>> {};
1185
1187
 
1186
1188
  TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1189
+ #ifndef USE_COROUTINES
1190
+ if (std::get<1>(GetParam())) {
1191
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1192
+ return;
1193
+ }
1194
+ #endif // USE_COROUTINES
1187
1195
  Options options = CurrentOptions();
1188
1196
  CreateAndReopenWithCF({"pikachu", "ilya", "muromec", "dobrynia", "nikitich",
1189
1197
  "alyosha", "popovich"},
@@ -1240,7 +1248,8 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1240
1248
  keys.push_back(std::get<1>(cf_kv_vec[i]));
1241
1249
  }
1242
1250
 
1243
- values = MultiGet(cfs, keys, nullptr, GetParam());
1251
+ values = MultiGet(cfs, keys, nullptr, std::get<0>(GetParam()),
1252
+ std::get<1>(GetParam()));
1244
1253
  ASSERT_EQ(values.size(), num_keys);
1245
1254
  for (unsigned int j = 0; j < values.size(); ++j) {
1246
1255
  ASSERT_EQ(values[j], std::get<2>(cf_kv_vec[j]) + "_2");
@@ -1254,7 +1263,8 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1254
1263
  keys.push_back(std::get<1>(cf_kv_vec[3]));
1255
1264
  cfs.push_back(std::get<0>(cf_kv_vec[4]));
1256
1265
  keys.push_back(std::get<1>(cf_kv_vec[4]));
1257
- values = MultiGet(cfs, keys, nullptr, GetParam());
1266
+ values = MultiGet(cfs, keys, nullptr, std::get<0>(GetParam()),
1267
+ std::get<1>(GetParam()));
1258
1268
  ASSERT_EQ(values[0], std::get<2>(cf_kv_vec[0]) + "_2");
1259
1269
  ASSERT_EQ(values[1], std::get<2>(cf_kv_vec[3]) + "_2");
1260
1270
  ASSERT_EQ(values[2], std::get<2>(cf_kv_vec[4]) + "_2");
@@ -1267,7 +1277,8 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1267
1277
  keys.push_back(std::get<1>(cf_kv_vec[6]));
1268
1278
  cfs.push_back(std::get<0>(cf_kv_vec[1]));
1269
1279
  keys.push_back(std::get<1>(cf_kv_vec[1]));
1270
- values = MultiGet(cfs, keys, nullptr, GetParam());
1280
+ values = MultiGet(cfs, keys, nullptr, std::get<0>(GetParam()),
1281
+ std::get<1>(GetParam()));
1271
1282
  ASSERT_EQ(values[0], std::get<2>(cf_kv_vec[7]) + "_2");
1272
1283
  ASSERT_EQ(values[1], std::get<2>(cf_kv_vec[6]) + "_2");
1273
1284
  ASSERT_EQ(values[2], std::get<2>(cf_kv_vec[1]) + "_2");
@@ -1283,6 +1294,12 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCF) {
1283
1294
  }
1284
1295
 
1285
1296
  TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFMutex) {
1297
+ #ifndef USE_COROUTINES
1298
+ if (std::get<1>(GetParam())) {
1299
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1300
+ return;
1301
+ }
1302
+ #endif // USE_COROUTINES
1286
1303
  Options options = CurrentOptions();
1287
1304
  CreateAndReopenWithCF({"pikachu", "ilya", "muromec", "dobrynia", "nikitich",
1288
1305
  "alyosha", "popovich"},
@@ -1328,7 +1345,8 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFMutex) {
1328
1345
  keys.push_back("cf" + std::to_string(i) + "_key");
1329
1346
  }
1330
1347
 
1331
- values = MultiGet(cfs, keys, nullptr, GetParam());
1348
+ values = MultiGet(cfs, keys, nullptr, std::get<0>(GetParam()),
1349
+ std::get<1>(GetParam()));
1332
1350
  ASSERT_TRUE(last_try);
1333
1351
  ASSERT_EQ(values.size(), 8);
1334
1352
  for (unsigned int j = 0; j < values.size(); ++j) {
@@ -1345,6 +1363,12 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFMutex) {
1345
1363
  }
1346
1364
 
1347
1365
  TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFSnapshot) {
1366
+ #ifndef USE_COROUTINES
1367
+ if (std::get<1>(GetParam())) {
1368
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1369
+ return;
1370
+ }
1371
+ #endif // USE_COROUTINES
1348
1372
  Options options = CurrentOptions();
1349
1373
  CreateAndReopenWithCF({"pikachu", "ilya", "muromec", "dobrynia", "nikitich",
1350
1374
  "alyosha", "popovich"},
@@ -1389,7 +1413,8 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFSnapshot) {
1389
1413
  }
1390
1414
 
1391
1415
  const Snapshot* snapshot = db_->GetSnapshot();
1392
- values = MultiGet(cfs, keys, snapshot, GetParam());
1416
+ values = MultiGet(cfs, keys, snapshot, std::get<0>(GetParam()),
1417
+ std::get<1>(GetParam()));
1393
1418
  db_->ReleaseSnapshot(snapshot);
1394
1419
  ASSERT_EQ(values.size(), 8);
1395
1420
  for (unsigned int j = 0; j < values.size(); ++j) {
@@ -1405,6 +1430,12 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFSnapshot) {
1405
1430
  }
1406
1431
 
1407
1432
  TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFUnsorted) {
1433
+ #ifndef USE_COROUTINES
1434
+ if (std::get<1>(GetParam())) {
1435
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1436
+ return;
1437
+ }
1438
+ #endif // USE_COROUTINES
1408
1439
  Options options = CurrentOptions();
1409
1440
  CreateAndReopenWithCF({"one", "two"}, options);
1410
1441
 
@@ -1417,8 +1448,9 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFUnsorted) {
1417
1448
  std::vector<std::string> keys{"foo", "baz", "abc"};
1418
1449
  std::vector<std::string> values;
1419
1450
 
1420
- values =
1421
- MultiGet(cfs, keys, /* snapshot */ nullptr, /* batched */ GetParam());
1451
+ values = MultiGet(cfs, keys, /* snapshot */ nullptr,
1452
+ /* batched */ std::get<0>(GetParam()),
1453
+ /* async */ std::get<1>(GetParam()));
1422
1454
 
1423
1455
  ASSERT_EQ(values.size(), 3);
1424
1456
  ASSERT_EQ(values[0], "bar");
@@ -1426,10 +1458,18 @@ TEST_P(DBMultiGetTestWithParam, MultiGetMultiCFUnsorted) {
1426
1458
  ASSERT_EQ(values[2], "def");
1427
1459
  }
1428
1460
 
1429
- INSTANTIATE_TEST_CASE_P(DBMultiGetTestWithParam, DBMultiGetTestWithParam,
1430
- testing::Bool());
1431
-
1432
- TEST_F(DBBasicTest, MultiGetBatchedSimpleUnsorted) {
1461
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedSimpleUnsorted) {
1462
+ #ifndef USE_COROUTINES
1463
+ if (std::get<1>(GetParam())) {
1464
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1465
+ return;
1466
+ }
1467
+ #endif // USE_COROUTINES
1468
+ // Skip for unbatched MultiGet
1469
+ if (!std::get<0>(GetParam())) {
1470
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1471
+ return;
1472
+ }
1433
1473
  do {
1434
1474
  CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
1435
1475
  SetPerfLevel(kEnableCount);
@@ -1448,8 +1488,10 @@ TEST_F(DBBasicTest, MultiGetBatchedSimpleUnsorted) {
1448
1488
  std::vector<ColumnFamilyHandle*> cfs(keys.size(), handles_[1]);
1449
1489
  std::vector<Status> s(keys.size());
1450
1490
 
1451
- db_->MultiGet(ReadOptions(), handles_[1], keys.size(), keys.data(),
1452
- values.data(), s.data(), false);
1491
+ ReadOptions ro;
1492
+ ro.async_io = std::get<1>(GetParam());
1493
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
1494
+ s.data(), false);
1453
1495
 
1454
1496
  ASSERT_EQ(values.size(), keys.size());
1455
1497
  ASSERT_EQ(std::string(values[5].data(), values[5].size()), "v1");
@@ -1470,7 +1512,18 @@ TEST_F(DBBasicTest, MultiGetBatchedSimpleUnsorted) {
1470
1512
  } while (ChangeCompactOptions());
1471
1513
  }
1472
1514
 
1473
- TEST_F(DBBasicTest, MultiGetBatchedSortedMultiFile) {
1515
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedSortedMultiFile) {
1516
+ #ifndef USE_COROUTINES
1517
+ if (std::get<1>(GetParam())) {
1518
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1519
+ return;
1520
+ }
1521
+ #endif // USE_COROUTINES
1522
+ // Skip for unbatched MultiGet
1523
+ if (!std::get<0>(GetParam())) {
1524
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1525
+ return;
1526
+ }
1474
1527
  do {
1475
1528
  CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
1476
1529
  SetPerfLevel(kEnableCount);
@@ -1493,8 +1546,10 @@ TEST_F(DBBasicTest, MultiGetBatchedSortedMultiFile) {
1493
1546
  std::vector<ColumnFamilyHandle*> cfs(keys.size(), handles_[1]);
1494
1547
  std::vector<Status> s(keys.size());
1495
1548
 
1496
- db_->MultiGet(ReadOptions(), handles_[1], keys.size(), keys.data(),
1497
- values.data(), s.data(), true);
1549
+ ReadOptions ro;
1550
+ ro.async_io = std::get<1>(GetParam());
1551
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
1552
+ s.data(), true);
1498
1553
 
1499
1554
  ASSERT_EQ(values.size(), keys.size());
1500
1555
  ASSERT_EQ(std::string(values[0].data(), values[0].size()), "v1");
@@ -1515,7 +1570,18 @@ TEST_F(DBBasicTest, MultiGetBatchedSortedMultiFile) {
1515
1570
  } while (ChangeOptions());
1516
1571
  }
1517
1572
 
1518
- TEST_F(DBBasicTest, MultiGetBatchedDuplicateKeys) {
1573
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedDuplicateKeys) {
1574
+ #ifndef USE_COROUTINES
1575
+ if (std::get<1>(GetParam())) {
1576
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1577
+ return;
1578
+ }
1579
+ #endif // USE_COROUTINES
1580
+ // Skip for unbatched MultiGet
1581
+ if (!std::get<0>(GetParam())) {
1582
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1583
+ return;
1584
+ }
1519
1585
  Options opts = CurrentOptions();
1520
1586
  opts.merge_operator = MergeOperators::CreateStringAppendOperator();
1521
1587
  CreateAndReopenWithCF({"pikachu"}, opts);
@@ -1546,8 +1612,10 @@ TEST_F(DBBasicTest, MultiGetBatchedDuplicateKeys) {
1546
1612
  std::vector<ColumnFamilyHandle*> cfs(keys.size(), handles_[1]);
1547
1613
  std::vector<Status> s(keys.size());
1548
1614
 
1549
- db_->MultiGet(ReadOptions(), handles_[1], keys.size(), keys.data(),
1550
- values.data(), s.data(), false);
1615
+ ReadOptions ro;
1616
+ ro.async_io = std::get<1>(GetParam());
1617
+ db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
1618
+ s.data(), false);
1551
1619
 
1552
1620
  ASSERT_EQ(values.size(), keys.size());
1553
1621
  ASSERT_EQ(std::string(values[0].data(), values[0].size()), "v8");
@@ -1566,7 +1634,18 @@ TEST_F(DBBasicTest, MultiGetBatchedDuplicateKeys) {
1566
1634
  SetPerfLevel(kDisable);
1567
1635
  }
1568
1636
 
1569
- TEST_F(DBBasicTest, MultiGetBatchedMultiLevel) {
1637
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedMultiLevel) {
1638
+ #ifndef USE_COROUTINES
1639
+ if (std::get<1>(GetParam())) {
1640
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1641
+ return;
1642
+ }
1643
+ #endif // USE_COROUTINES
1644
+ // Skip for unbatched MultiGet
1645
+ if (!std::get<0>(GetParam())) {
1646
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1647
+ return;
1648
+ }
1570
1649
  Options options = CurrentOptions();
1571
1650
  options.disable_auto_compactions = true;
1572
1651
  Reopen(options);
@@ -1625,7 +1704,7 @@ TEST_F(DBBasicTest, MultiGetBatchedMultiLevel) {
1625
1704
  keys.push_back("key_" + std::to_string(i));
1626
1705
  }
1627
1706
 
1628
- values = MultiGet(keys, nullptr);
1707
+ values = MultiGet(keys, nullptr, std::get<1>(GetParam()));
1629
1708
  ASSERT_EQ(values.size(), 16);
1630
1709
  for (unsigned int j = 0; j < values.size(); ++j) {
1631
1710
  int key = j + 64;
@@ -1641,7 +1720,18 @@ TEST_F(DBBasicTest, MultiGetBatchedMultiLevel) {
1641
1720
  }
1642
1721
  }
1643
1722
 
1644
- TEST_F(DBBasicTest, MultiGetBatchedMultiLevelMerge) {
1723
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedMultiLevelMerge) {
1724
+ #ifndef USE_COROUTINES
1725
+ if (std::get<1>(GetParam())) {
1726
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1727
+ return;
1728
+ }
1729
+ #endif // USE_COROUTINES
1730
+ // Skip for unbatched MultiGet
1731
+ if (!std::get<0>(GetParam())) {
1732
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1733
+ return;
1734
+ }
1645
1735
  Options options = CurrentOptions();
1646
1736
  options.disable_auto_compactions = true;
1647
1737
  options.merge_operator = MergeOperators::CreateStringAppendOperator();
@@ -1705,7 +1795,7 @@ TEST_F(DBBasicTest, MultiGetBatchedMultiLevelMerge) {
1705
1795
  keys.push_back("key_" + std::to_string(i));
1706
1796
  }
1707
1797
 
1708
- values = MultiGet(keys, nullptr);
1798
+ values = MultiGet(keys, nullptr, std::get<1>(GetParam()));
1709
1799
  ASSERT_EQ(values.size(), keys.size());
1710
1800
  for (unsigned int j = 0; j < 48; ++j) {
1711
1801
  int key = j + 32;
@@ -1727,7 +1817,18 @@ TEST_F(DBBasicTest, MultiGetBatchedMultiLevelMerge) {
1727
1817
  }
1728
1818
  }
1729
1819
 
1730
- TEST_F(DBBasicTest, MultiGetBatchedValueSizeInMemory) {
1820
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedValueSizeInMemory) {
1821
+ #ifndef USE_COROUTINES
1822
+ if (std::get<1>(GetParam())) {
1823
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1824
+ return;
1825
+ }
1826
+ #endif // USE_COROUTINES
1827
+ // Skip for unbatched MultiGet
1828
+ if (!std::get<0>(GetParam())) {
1829
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1830
+ return;
1831
+ }
1731
1832
  CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
1732
1833
  SetPerfLevel(kEnableCount);
1733
1834
  ASSERT_OK(Put(1, "k1", "v_1"));
@@ -1744,6 +1845,7 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSizeInMemory) {
1744
1845
  get_perf_context()->Reset();
1745
1846
  ReadOptions ro;
1746
1847
  ro.value_size_soft_limit = 11;
1848
+ ro.async_io = std::get<1>(GetParam());
1747
1849
  db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
1748
1850
  s.data(), false);
1749
1851
 
@@ -1761,7 +1863,17 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSizeInMemory) {
1761
1863
  SetPerfLevel(kDisable);
1762
1864
  }
1763
1865
 
1764
- TEST_F(DBBasicTest, MultiGetBatchedValueSize) {
1866
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedValueSize) {
1867
+ #ifndef USE_COROUTINES
1868
+ if (std::get<1>(GetParam())) {
1869
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1870
+ return;
1871
+ }
1872
+ #endif // USE_COROUTINES
1873
+ // Skip for unbatched MultiGet
1874
+ if (!std::get<0>(GetParam())) {
1875
+ return;
1876
+ }
1765
1877
  do {
1766
1878
  CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
1767
1879
  SetPerfLevel(kEnableCount);
@@ -1801,6 +1913,7 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSize) {
1801
1913
 
1802
1914
  ReadOptions ro;
1803
1915
  ro.value_size_soft_limit = 20;
1916
+ ro.async_io = std::get<1>(GetParam());
1804
1917
  db_->MultiGet(ro, handles_[1], keys.size(), keys.data(), values.data(),
1805
1918
  s.data(), false);
1806
1919
 
@@ -1836,7 +1949,18 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSize) {
1836
1949
  } while (ChangeCompactOptions());
1837
1950
  }
1838
1951
 
1839
- TEST_F(DBBasicTest, MultiGetBatchedValueSizeMultiLevelMerge) {
1952
+ TEST_P(DBMultiGetTestWithParam, MultiGetBatchedValueSizeMultiLevelMerge) {
1953
+ #ifndef USE_COROUTINES
1954
+ if (std::get<1>(GetParam())) {
1955
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
1956
+ return;
1957
+ }
1958
+ #endif // USE_COROUTINES
1959
+ // Skip for unbatched MultiGet
1960
+ if (!std::get<0>(GetParam())) {
1961
+ ROCKSDB_GTEST_SKIP("This test is only for batched MultiGet");
1962
+ return;
1963
+ }
1840
1964
  Options options = CurrentOptions();
1841
1965
  options.disable_auto_compactions = true;
1842
1966
  options.merge_operator = MergeOperators::CreateStringAppendOperator();
@@ -1908,6 +2032,7 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSizeMultiLevelMerge) {
1908
2032
  ReadOptions read_options;
1909
2033
  read_options.verify_checksums = true;
1910
2034
  read_options.value_size_soft_limit = 380;
2035
+ read_options.async_io = std::get<1>(GetParam());
1911
2036
  db_->MultiGet(read_options, dbfull()->DefaultColumnFamily(), keys.size(),
1912
2037
  keys.data(), values.data(), statuses.data());
1913
2038
 
@@ -1939,6 +2064,217 @@ TEST_F(DBBasicTest, MultiGetBatchedValueSizeMultiLevelMerge) {
1939
2064
  }
1940
2065
  }
1941
2066
 
2067
+ INSTANTIATE_TEST_CASE_P(DBMultiGetTestWithParam, DBMultiGetTestWithParam,
2068
+ testing::Combine(testing::Bool(), testing::Bool()));
2069
+
2070
+ #if USE_COROUTINES
2071
+ class DBMultiGetAsyncIOTest : public DBBasicTest {
2072
+ public:
2073
+ DBMultiGetAsyncIOTest()
2074
+ : DBBasicTest(), statistics_(ROCKSDB_NAMESPACE::CreateDBStatistics()) {
2075
+ BlockBasedTableOptions bbto;
2076
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10));
2077
+ Options options = CurrentOptions();
2078
+ options.disable_auto_compactions = true;
2079
+ options.statistics = statistics_;
2080
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2081
+ Reopen(options);
2082
+ int num_keys = 0;
2083
+
2084
+ // Put all keys in the bottommost level, and overwrite some keys
2085
+ // in L0 and L1
2086
+ for (int i = 0; i < 128; ++i) {
2087
+ EXPECT_OK(Put(Key(i), "val_l2_" + std::to_string(i)));
2088
+ num_keys++;
2089
+ if (num_keys == 8) {
2090
+ EXPECT_OK(Flush());
2091
+ num_keys = 0;
2092
+ }
2093
+ }
2094
+ if (num_keys > 0) {
2095
+ EXPECT_OK(Flush());
2096
+ num_keys = 0;
2097
+ }
2098
+ MoveFilesToLevel(2);
2099
+
2100
+ for (int i = 0; i < 128; i += 3) {
2101
+ EXPECT_OK(Put(Key(i), "val_l1_" + std::to_string(i)));
2102
+ num_keys++;
2103
+ if (num_keys == 8) {
2104
+ EXPECT_OK(Flush());
2105
+ num_keys = 0;
2106
+ }
2107
+ }
2108
+ if (num_keys > 0) {
2109
+ EXPECT_OK(Flush());
2110
+ num_keys = 0;
2111
+ }
2112
+ MoveFilesToLevel(1);
2113
+
2114
+ for (int i = 0; i < 128; i += 5) {
2115
+ EXPECT_OK(Put(Key(i), "val_l0_" + std::to_string(i)));
2116
+ num_keys++;
2117
+ if (num_keys == 8) {
2118
+ EXPECT_OK(Flush());
2119
+ num_keys = 0;
2120
+ }
2121
+ }
2122
+ if (num_keys > 0) {
2123
+ EXPECT_OK(Flush());
2124
+ num_keys = 0;
2125
+ }
2126
+ EXPECT_EQ(0, num_keys);
2127
+ }
2128
+
2129
+ const std::shared_ptr<Statistics>& statistics() { return statistics_; }
2130
+
2131
+ private:
2132
+ std::shared_ptr<Statistics> statistics_;
2133
+ };
2134
+
2135
+ TEST_F(DBMultiGetAsyncIOTest, GetFromL0) {
2136
+ // All 3 keys in L0. The L0 files should be read serially.
2137
+ std::vector<std::string> key_strs{Key(0), Key(40), Key(80)};
2138
+ std::vector<Slice> keys{key_strs[0], key_strs[1], key_strs[2]};
2139
+ std::vector<PinnableSlice> values(key_strs.size());
2140
+ std::vector<Status> statuses(key_strs.size());
2141
+
2142
+ ReadOptions ro;
2143
+ ro.async_io = true;
2144
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2145
+ keys.data(), values.data(), statuses.data());
2146
+ ASSERT_EQ(values.size(), 3);
2147
+ ASSERT_OK(statuses[0]);
2148
+ ASSERT_OK(statuses[1]);
2149
+ ASSERT_OK(statuses[2]);
2150
+ ASSERT_EQ(values[0], "val_l0_" + std::to_string(0));
2151
+ ASSERT_EQ(values[1], "val_l0_" + std::to_string(40));
2152
+ ASSERT_EQ(values[2], "val_l0_" + std::to_string(80));
2153
+
2154
+ HistogramData multiget_io_batch_size;
2155
+
2156
+ statistics()->histogramData(MULTIGET_IO_BATCH_SIZE, &multiget_io_batch_size);
2157
+
2158
+ // No async IO in this case since we don't do parallel lookup in L0
2159
+ ASSERT_EQ(multiget_io_batch_size.count, 0);
2160
+ ASSERT_EQ(multiget_io_batch_size.max, 0);
2161
+ }
2162
+
2163
+ TEST_F(DBMultiGetAsyncIOTest, GetFromL1) {
2164
+ std::vector<std::string> key_strs;
2165
+ std::vector<Slice> keys;
2166
+ std::vector<PinnableSlice> values;
2167
+ std::vector<Status> statuses;
2168
+
2169
+ key_strs.push_back(Key(33));
2170
+ key_strs.push_back(Key(54));
2171
+ key_strs.push_back(Key(102));
2172
+ keys.push_back(key_strs[0]);
2173
+ keys.push_back(key_strs[1]);
2174
+ keys.push_back(key_strs[2]);
2175
+ values.resize(keys.size());
2176
+ statuses.resize(keys.size());
2177
+
2178
+ ReadOptions ro;
2179
+ ro.async_io = true;
2180
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2181
+ keys.data(), values.data(), statuses.data());
2182
+ ASSERT_EQ(values.size(), 3);
2183
+ ASSERT_EQ(statuses[0], Status::OK());
2184
+ ASSERT_EQ(statuses[1], Status::OK());
2185
+ ASSERT_EQ(statuses[2], Status::OK());
2186
+ ASSERT_EQ(values[0], "val_l1_" + std::to_string(33));
2187
+ ASSERT_EQ(values[1], "val_l1_" + std::to_string(54));
2188
+ ASSERT_EQ(values[2], "val_l1_" + std::to_string(102));
2189
+
2190
+ HistogramData multiget_io_batch_size;
2191
+
2192
+ statistics()->histogramData(MULTIGET_IO_BATCH_SIZE, &multiget_io_batch_size);
2193
+
2194
+ // A batch of 3 async IOs is expected, one for each overlapping file in L1
2195
+ ASSERT_EQ(multiget_io_batch_size.count, 1);
2196
+ ASSERT_EQ(multiget_io_batch_size.max, 3);
2197
+ }
2198
+
2199
+ TEST_F(DBMultiGetAsyncIOTest, LastKeyInFile) {
2200
+ std::vector<std::string> key_strs;
2201
+ std::vector<Slice> keys;
2202
+ std::vector<PinnableSlice> values;
2203
+ std::vector<Status> statuses;
2204
+
2205
+ // 21 is the last key in the first L1 file
2206
+ key_strs.push_back(Key(21));
2207
+ key_strs.push_back(Key(54));
2208
+ key_strs.push_back(Key(102));
2209
+ keys.push_back(key_strs[0]);
2210
+ keys.push_back(key_strs[1]);
2211
+ keys.push_back(key_strs[2]);
2212
+ values.resize(keys.size());
2213
+ statuses.resize(keys.size());
2214
+
2215
+ ReadOptions ro;
2216
+ ro.async_io = true;
2217
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2218
+ keys.data(), values.data(), statuses.data());
2219
+ ASSERT_EQ(values.size(), 3);
2220
+ ASSERT_EQ(statuses[0], Status::OK());
2221
+ ASSERT_EQ(statuses[1], Status::OK());
2222
+ ASSERT_EQ(statuses[2], Status::OK());
2223
+ ASSERT_EQ(values[0], "val_l1_" + std::to_string(21));
2224
+ ASSERT_EQ(values[1], "val_l1_" + std::to_string(54));
2225
+ ASSERT_EQ(values[2], "val_l1_" + std::to_string(102));
2226
+
2227
+ HistogramData multiget_io_batch_size;
2228
+
2229
+ statistics()->histogramData(MULTIGET_IO_BATCH_SIZE, &multiget_io_batch_size);
2230
+
2231
+ // Since the first MultiGet key is the last key in a file, the MultiGet is
2232
+ // expected to lookup in that file first, before moving on to other files.
2233
+ // So the first file lookup will issue one async read, and the next lookup
2234
+ // will lookup 2 files in parallel and issue 2 async reads
2235
+ ASSERT_EQ(multiget_io_batch_size.count, 2);
2236
+ ASSERT_EQ(multiget_io_batch_size.max, 2);
2237
+ }
2238
+
2239
+ TEST_F(DBMultiGetAsyncIOTest, GetFromL1AndL2) {
2240
+ std::vector<std::string> key_strs;
2241
+ std::vector<Slice> keys;
2242
+ std::vector<PinnableSlice> values;
2243
+ std::vector<Status> statuses;
2244
+
2245
+ // 33 and 102 are in L1, and 56 is in L2
2246
+ key_strs.push_back(Key(33));
2247
+ key_strs.push_back(Key(56));
2248
+ key_strs.push_back(Key(102));
2249
+ keys.push_back(key_strs[0]);
2250
+ keys.push_back(key_strs[1]);
2251
+ keys.push_back(key_strs[2]);
2252
+ values.resize(keys.size());
2253
+ statuses.resize(keys.size());
2254
+
2255
+ ReadOptions ro;
2256
+ ro.async_io = true;
2257
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2258
+ keys.data(), values.data(), statuses.data());
2259
+ ASSERT_EQ(values.size(), 3);
2260
+ ASSERT_EQ(statuses[0], Status::OK());
2261
+ ASSERT_EQ(statuses[1], Status::OK());
2262
+ ASSERT_EQ(statuses[2], Status::OK());
2263
+ ASSERT_EQ(values[0], "val_l1_" + std::to_string(33));
2264
+ ASSERT_EQ(values[1], "val_l2_" + std::to_string(56));
2265
+ ASSERT_EQ(values[2], "val_l1_" + std::to_string(102));
2266
+
2267
+ HistogramData multiget_io_batch_size;
2268
+
2269
+ statistics()->histogramData(MULTIGET_IO_BATCH_SIZE, &multiget_io_batch_size);
2270
+
2271
+ // There is only one MultiGet key in the bottommost level - 56. Thus
2272
+ // the bottommost level will not use async IO.
2273
+ ASSERT_EQ(multiget_io_batch_size.count, 1);
2274
+ ASSERT_EQ(multiget_io_batch_size.max, 2);
2275
+ }
2276
+ #endif // USE_COROUTINES
2277
+
1942
2278
  TEST_F(DBBasicTest, MultiGetStats) {
1943
2279
  Options options;
1944
2280
  options.create_if_missing = true;
@@ -3308,6 +3644,11 @@ class DeadlineRandomAccessFile : public FSRandomAccessFileOwnerWrapper {
3308
3644
  IOStatus MultiRead(FSReadRequest* reqs, size_t num_reqs,
3309
3645
  const IOOptions& options, IODebugContext* dbg) override;
3310
3646
 
3647
+ IOStatus ReadAsync(FSReadRequest& req, const IOOptions& opts,
3648
+ std::function<void(const FSReadRequest&, void*)> cb,
3649
+ void* cb_arg, void** io_handle, IOHandleDeleter* del_fn,
3650
+ IODebugContext* dbg) override;
3651
+
3311
3652
  private:
3312
3653
  DeadlineFS& fs_;
3313
3654
  std::unique_ptr<FSRandomAccessFile> file_;
@@ -3448,6 +3789,26 @@ IOStatus DeadlineRandomAccessFile::Read(uint64_t offset, size_t len,
3448
3789
  return s;
3449
3790
  }
3450
3791
 
3792
+ IOStatus DeadlineRandomAccessFile::ReadAsync(
3793
+ FSReadRequest& req, const IOOptions& opts,
3794
+ std::function<void(const FSReadRequest&, void*)> cb, void* cb_arg,
3795
+ void** io_handle, IOHandleDeleter* del_fn, IODebugContext* dbg) {
3796
+ const std::chrono::microseconds deadline = fs_.GetDeadline();
3797
+ const std::chrono::microseconds io_timeout = fs_.GetIOTimeout();
3798
+ IOStatus s;
3799
+ if (deadline.count() || io_timeout.count()) {
3800
+ fs_.AssertDeadline(deadline, io_timeout, opts);
3801
+ }
3802
+ if (s.ok()) {
3803
+ s = FSRandomAccessFileWrapper::ReadAsync(req, opts, cb, cb_arg, io_handle,
3804
+ del_fn, dbg);
3805
+ }
3806
+ if (s.ok()) {
3807
+ s = fs_.ShouldDelay(opts);
3808
+ }
3809
+ return s;
3810
+ }
3811
+
3451
3812
  IOStatus DeadlineRandomAccessFile::MultiRead(FSReadRequest* reqs,
3452
3813
  size_t num_reqs,
3453
3814
  const IOOptions& options,
@@ -3469,7 +3830,8 @@ IOStatus DeadlineRandomAccessFile::MultiRead(FSReadRequest* reqs,
3469
3830
 
3470
3831
  // A test class for intercepting random reads and injecting artificial
3471
3832
  // delays. Used for testing the MultiGet deadline feature
3472
- class DBBasicTestMultiGetDeadline : public DBBasicTestMultiGet {
3833
+ class DBBasicTestMultiGetDeadline : public DBBasicTestMultiGet,
3834
+ public testing::WithParamInterface<bool> {
3473
3835
  public:
3474
3836
  DBBasicTestMultiGetDeadline()
3475
3837
  : DBBasicTestMultiGet(
@@ -3492,7 +3854,13 @@ class DBBasicTestMultiGetDeadline : public DBBasicTestMultiGet {
3492
3854
  }
3493
3855
  };
3494
3856
 
3495
- TEST_F(DBBasicTestMultiGetDeadline, MultiGetDeadlineExceeded) {
3857
+ TEST_P(DBBasicTestMultiGetDeadline, MultiGetDeadlineExceeded) {
3858
+ #ifndef USE_COROUTINES
3859
+ if (GetParam()) {
3860
+ ROCKSDB_GTEST_SKIP("This test requires coroutine support");
3861
+ return;
3862
+ }
3863
+ #endif // USE_COROUTINES
3496
3864
  std::shared_ptr<DeadlineFS> fs = std::make_shared<DeadlineFS>(env_, false);
3497
3865
  std::unique_ptr<Env> env(new CompositeEnvWrapper(env_, fs));
3498
3866
  Options options = CurrentOptions();
@@ -3523,6 +3891,7 @@ TEST_F(DBBasicTestMultiGetDeadline, MultiGetDeadlineExceeded) {
3523
3891
 
3524
3892
  ReadOptions ro;
3525
3893
  ro.deadline = std::chrono::microseconds{env->NowMicros() + 10000};
3894
+ ro.async_io = GetParam();
3526
3895
  // Delay the first IO
3527
3896
  fs->SetDelayTrigger(ro.deadline, ro.io_timeout, 0);
3528
3897
 
@@ -3625,6 +3994,9 @@ TEST_F(DBBasicTestMultiGetDeadline, MultiGetDeadlineExceeded) {
3625
3994
  Close();
3626
3995
  }
3627
3996
 
3997
+ INSTANTIATE_TEST_CASE_P(DeadlineIO, DBBasicTestMultiGetDeadline,
3998
+ ::testing::Bool());
3999
+
3628
4000
  TEST_F(DBBasicTest, ManifestWriteFailure) {
3629
4001
  Options options = GetDefaultOptions();
3630
4002
  options.create_if_missing = true;
@@ -3783,7 +4155,7 @@ TEST_P(DBBasicTestDeadline, PointLookupDeadline) {
3783
4155
 
3784
4156
  Random rnd(301);
3785
4157
  for (int i = 0; i < 400; ++i) {
3786
- std::string key = "k" + ToString(i);
4158
+ std::string key = "k" + std::to_string(i);
3787
4159
  ASSERT_OK(Put(key, rnd.RandomString(100)));
3788
4160
  }
3789
4161
  ASSERT_OK(Flush());
@@ -3866,7 +4238,7 @@ TEST_P(DBBasicTestDeadline, IteratorDeadline) {
3866
4238
 
3867
4239
  Random rnd(301);
3868
4240
  for (int i = 0; i < 400; ++i) {
3869
- std::string key = "k" + ToString(i);
4241
+ std::string key = "k" + std::to_string(i);
3870
4242
  ASSERT_OK(Put(key, rnd.RandomString(100)));
3871
4243
  }
3872
4244
  ASSERT_OK(Flush());