@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -11,12 +11,17 @@
11
11
  #include <sys/ioctl.h>
12
12
  #endif
13
13
 
14
+ #if defined(ROCKSDB_IOURING_PRESENT)
15
+ #include <liburing.h>
16
+ #include <sys/uio.h>
17
+ #endif
18
+
14
19
  #include <sys/types.h>
15
20
 
16
- #include <iostream>
17
- #include <unordered_set>
18
21
  #include <atomic>
19
22
  #include <list>
23
+ #include <mutex>
24
+ #include <unordered_set>
20
25
 
21
26
  #ifdef OS_LINUX
22
27
  #include <fcntl.h>
@@ -30,18 +35,35 @@
30
35
  #include <errno.h>
31
36
  #endif
32
37
 
38
+ #include "db/db_impl/db_impl.h"
39
+ #include "env/emulated_clock.h"
33
40
  #include "env/env_chroot.h"
41
+ #include "env/env_encryption_ctr.h"
42
+ #include "env/fs_readonly.h"
43
+ #include "env/mock_env.h"
44
+ #include "env/unique_id_gen.h"
34
45
  #include "logging/log_buffer.h"
46
+ #include "logging/logging.h"
35
47
  #include "port/malloc.h"
36
48
  #include "port/port.h"
49
+ #include "port/stack_trace.h"
50
+ #include "rocksdb/convenience.h"
37
51
  #include "rocksdb/env.h"
52
+ #include "rocksdb/env_encryption.h"
53
+ #include "rocksdb/file_system.h"
54
+ #include "rocksdb/system_clock.h"
55
+ #include "rocksdb/utilities/object_registry.h"
56
+ #include "test_util/mock_time_env.h"
38
57
  #include "test_util/sync_point.h"
39
58
  #include "test_util/testharness.h"
40
59
  #include "test_util/testutil.h"
41
60
  #include "util/coding.h"
61
+ #include "util/crc32c.h"
42
62
  #include "util/mutexlock.h"
43
63
  #include "util/random.h"
44
64
  #include "util/string_util.h"
65
+ #include "utilities/counted_fs.h"
66
+ #include "utilities/env_timed.h"
45
67
  #include "utilities/fault_injection_env.h"
46
68
  #include "utilities/fault_injection_fs.h"
47
69
 
@@ -63,6 +85,8 @@ struct Deleter {
63
85
  void (*fn_)(void*);
64
86
  };
65
87
 
88
+ extern "C" bool RocksDbIOUringEnable() { return true; }
89
+
66
90
  std::unique_ptr<char, Deleter> NewAligned(const size_t size, const char ch) {
67
91
  char* ptr = nullptr;
68
92
  #ifdef OS_WIN
@@ -89,6 +113,11 @@ class EnvPosixTest : public testing::Test {
89
113
  Env* env_;
90
114
  bool direct_io_;
91
115
  EnvPosixTest() : env_(Env::Default()), direct_io_(false) {}
116
+ ~EnvPosixTest() {
117
+ SyncPoint::GetInstance()->DisableProcessing();
118
+ SyncPoint::GetInstance()->LoadDependency({});
119
+ SyncPoint::GetInstance()->ClearAllCallBacks();
120
+ }
92
121
  };
93
122
 
94
123
  class EnvPosixTestWithParam
@@ -432,11 +461,17 @@ TEST_P(EnvPosixTestWithParam, RunMany) {
432
461
  env_->Schedule(&CB::Run, &cb2);
433
462
  env_->Schedule(&CB::Run, &cb3);
434
463
  env_->Schedule(&CB::Run, &cb4);
464
+ // thread-pool pops a thread function and then run the function, which may
465
+ // cause threadpool is empty but the last function is still running. Add a
466
+ // dummy function at the end, to make sure the last callback is finished
467
+ // before threadpool is empty.
468
+ struct DummyCB {
469
+ static void Run(void*) {}
470
+ };
471
+ env_->Schedule(&DummyCB::Run, nullptr);
435
472
 
436
- Env::Default()->SleepForMicroseconds(kDelayMicros);
437
- int cur = last_id.load(std::memory_order_acquire);
438
- ASSERT_EQ(4, cur);
439
473
  WaitThreadPoolsEmpty();
474
+ ASSERT_EQ(4, last_id.load(std::memory_order_acquire));
440
475
  }
441
476
  #endif
442
477
 
@@ -913,7 +948,7 @@ class IoctlFriendlyTmpdir {
913
948
  } else {
914
949
  // mkdtemp failed: diagnose it, but don't give up.
915
950
  fprintf(stderr, "mkdtemp(%s/...) failed: %s\n", d.c_str(),
916
- strerror(errno));
951
+ errnoStr(errno).c_str());
917
952
  }
918
953
  }
919
954
 
@@ -1038,7 +1073,8 @@ TEST_P(EnvPosixTestWithParam, AllocateTest) {
1038
1073
  int err_number = 0;
1039
1074
  if (alloc_status != 0) {
1040
1075
  err_number = errno;
1041
- fprintf(stderr, "Warning: fallocate() fails, %s\n", strerror(err_number));
1076
+ fprintf(stderr, "Warning: fallocate() fails, %s\n",
1077
+ errnoStr(err_number).c_str());
1042
1078
  }
1043
1079
  close(fd);
1044
1080
  ASSERT_OK(env_->DeleteFile(fname_test_fallocate));
@@ -1222,7 +1258,7 @@ TEST_P(EnvPosixTestWithParam, MultiRead) {
1222
1258
  // Random Read
1223
1259
  Random rnd(301 + attempt);
1224
1260
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1225
- "PosixRandomAccessFile::MultiRead:io_uring_result", [&](void* arg) {
1261
+ "UpdateResults::io_uring_result", [&](void* arg) {
1226
1262
  if (attempt > 0) {
1227
1263
  // No failure in the first attempt.
1228
1264
  size_t& bytes_read = *static_cast<size_t*>(arg);
@@ -1265,7 +1301,7 @@ TEST_P(EnvPosixTestWithParam, MultiRead) {
1265
1301
  }
1266
1302
 
1267
1303
  TEST_F(EnvPosixTest, MultiReadNonAlignedLargeNum) {
1268
- // In this test we don't do aligned read, wo it doesn't work for
1304
+ // In this test we don't do aligned read, so it doesn't work for
1269
1305
  // direct I/O case.
1270
1306
  EnvOptions soptions;
1271
1307
  soptions.use_direct_reads = soptions.use_direct_writes = false;
@@ -1292,7 +1328,7 @@ TEST_F(EnvPosixTest, MultiReadNonAlignedLargeNum) {
1292
1328
  const int num_reads = rnd.Uniform(512) + 1;
1293
1329
 
1294
1330
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1295
- "PosixRandomAccessFile::MultiRead:io_uring_result", [&](void* arg) {
1331
+ "UpdateResults::io_uring_result", [&](void* arg) {
1296
1332
  if (attempt > 5) {
1297
1333
  // Improve partial result rates in second half of the run to
1298
1334
  // cover the case of repeated partial results.
@@ -1356,6 +1392,121 @@ TEST_F(EnvPosixTest, MultiReadNonAlignedLargeNum) {
1356
1392
  }
1357
1393
  }
1358
1394
 
1395
+ #if defined(ROCKSDB_IOURING_PRESENT)
1396
+ void GenerateFilesAndRequest(Env* env, const std::string& fname,
1397
+ std::vector<ReadRequest>* ret_reqs,
1398
+ std::vector<std::string>* scratches) {
1399
+ const size_t kTotalSize = 81920;
1400
+ Random rnd(301);
1401
+ std::string expected_data = rnd.RandomString(kTotalSize);
1402
+
1403
+ // Create file.
1404
+ {
1405
+ std::unique_ptr<WritableFile> wfile;
1406
+ ASSERT_OK(env->NewWritableFile(fname, &wfile, EnvOptions()));
1407
+ ASSERT_OK(wfile->Append(expected_data));
1408
+ ASSERT_OK(wfile->Close());
1409
+ }
1410
+
1411
+ // Right now kIoUringDepth is hard coded as 256, so we need very large
1412
+ // number of keys to cover the case of multiple rounds of submissions.
1413
+ // Right now the test latency is still acceptable. If it ends up with
1414
+ // too long, we can modify the io uring depth with SyncPoint here.
1415
+ const int num_reads = 3;
1416
+ std::vector<size_t> offsets = {10000, 20000, 30000};
1417
+ std::vector<size_t> lens = {3000, 200, 100};
1418
+
1419
+ // Create requests
1420
+ scratches->reserve(num_reads);
1421
+ std::vector<ReadRequest>& reqs = *ret_reqs;
1422
+ reqs.resize(num_reads);
1423
+ for (int i = 0; i < num_reads; ++i) {
1424
+ reqs[i].offset = offsets[i];
1425
+ reqs[i].len = lens[i];
1426
+ scratches->emplace_back(reqs[i].len, ' ');
1427
+ reqs[i].scratch = const_cast<char*>(scratches->back().data());
1428
+ }
1429
+ }
1430
+
1431
+ TEST_F(EnvPosixTest, MultiReadIOUringError) {
1432
+ // In this test we don't do aligned read, so we can't do direct I/O.
1433
+ EnvOptions soptions;
1434
+ soptions.use_direct_reads = soptions.use_direct_writes = false;
1435
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
1436
+
1437
+ std::vector<std::string> scratches;
1438
+ std::vector<ReadRequest> reqs;
1439
+ GenerateFilesAndRequest(env_, fname, &reqs, &scratches);
1440
+ // Query the data
1441
+ std::unique_ptr<RandomAccessFile> file;
1442
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1443
+
1444
+ bool io_uring_wait_cqe_called = false;
1445
+ SyncPoint::GetInstance()->SetCallBack(
1446
+ "PosixRandomAccessFile::MultiRead:io_uring_wait_cqe:return",
1447
+ [&](void* arg) {
1448
+ if (!io_uring_wait_cqe_called) {
1449
+ io_uring_wait_cqe_called = true;
1450
+ ssize_t& ret = *(static_cast<ssize_t*>(arg));
1451
+ ret = 1;
1452
+ }
1453
+ });
1454
+ SyncPoint::GetInstance()->EnableProcessing();
1455
+
1456
+ Status s = file->MultiRead(reqs.data(), reqs.size());
1457
+ if (io_uring_wait_cqe_called) {
1458
+ ASSERT_NOK(s);
1459
+ } else {
1460
+ s.PermitUncheckedError();
1461
+ }
1462
+
1463
+ SyncPoint::GetInstance()->DisableProcessing();
1464
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1465
+ }
1466
+
1467
+ TEST_F(EnvPosixTest, MultiReadIOUringError2) {
1468
+ // In this test we don't do aligned read, so we can't do direct I/O.
1469
+ EnvOptions soptions;
1470
+ soptions.use_direct_reads = soptions.use_direct_writes = false;
1471
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
1472
+
1473
+ std::vector<std::string> scratches;
1474
+ std::vector<ReadRequest> reqs;
1475
+ GenerateFilesAndRequest(env_, fname, &reqs, &scratches);
1476
+ // Query the data
1477
+ std::unique_ptr<RandomAccessFile> file;
1478
+ ASSERT_OK(env_->NewRandomAccessFile(fname, &file, soptions));
1479
+
1480
+ bool io_uring_submit_and_wait_called = false;
1481
+ SyncPoint::GetInstance()->SetCallBack(
1482
+ "PosixRandomAccessFile::MultiRead:io_uring_submit_and_wait:return1",
1483
+ [&](void* arg) {
1484
+ io_uring_submit_and_wait_called = true;
1485
+ ssize_t* ret = static_cast<ssize_t*>(arg);
1486
+ (*ret)--;
1487
+ });
1488
+ SyncPoint::GetInstance()->SetCallBack(
1489
+ "PosixRandomAccessFile::MultiRead:io_uring_submit_and_wait:return2",
1490
+ [&](void* arg) {
1491
+ struct io_uring* iu = static_cast<struct io_uring*>(arg);
1492
+ struct io_uring_cqe* cqe;
1493
+ assert(io_uring_wait_cqe(iu, &cqe) == 0);
1494
+ io_uring_cqe_seen(iu, cqe);
1495
+ });
1496
+ SyncPoint::GetInstance()->EnableProcessing();
1497
+
1498
+ Status s = file->MultiRead(reqs.data(), reqs.size());
1499
+ if (io_uring_submit_and_wait_called) {
1500
+ ASSERT_NOK(s);
1501
+ } else {
1502
+ s.PermitUncheckedError();
1503
+ }
1504
+
1505
+ SyncPoint::GetInstance()->DisableProcessing();
1506
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1507
+ }
1508
+ #endif // ROCKSDB_IOURING_PRESENT
1509
+
1359
1510
  // Only works in linux platforms
1360
1511
  #ifdef OS_WIN
1361
1512
  TEST_P(EnvPosixTestWithParam, DISABLED_InvalidateCache) {
@@ -1667,12 +1818,26 @@ TEST_P(EnvPosixTestWithParam, WritableFileWrapper) {
1667
1818
  return Status::OK();
1668
1819
  }
1669
1820
 
1821
+ Status Append(
1822
+ const Slice& /*data*/,
1823
+ const DataVerificationInfo& /* verification_info */) override {
1824
+ inc(1);
1825
+ return Status::OK();
1826
+ }
1827
+
1670
1828
  Status PositionedAppend(const Slice& /*data*/,
1671
1829
  uint64_t /*offset*/) override {
1672
1830
  inc(2);
1673
1831
  return Status::OK();
1674
1832
  }
1675
1833
 
1834
+ Status PositionedAppend(
1835
+ const Slice& /*data*/, uint64_t /*offset*/,
1836
+ const DataVerificationInfo& /* verification_info */) override {
1837
+ inc(2);
1838
+ return Status::OK();
1839
+ }
1840
+
1676
1841
  Status Truncate(uint64_t /*size*/) override {
1677
1842
  inc(3);
1678
1843
  return Status::OK();
@@ -1982,29 +2147,29 @@ class TestEnv : public EnvWrapper {
1982
2147
  public:
1983
2148
  explicit TestEnv() : EnvWrapper(Env::Default()),
1984
2149
  close_count(0) { }
1985
-
1986
- class TestLogger : public Logger {
1987
- public:
1988
- using Logger::Logv;
1989
- TestLogger(TestEnv* env_ptr) : Logger() { env = env_ptr; }
1990
- ~TestLogger() override {
1991
- if (!closed_) {
1992
- Status s = CloseHelper();
1993
- s.PermitUncheckedError();
2150
+ const char* Name() const override { return "TestEnv"; }
2151
+ class TestLogger : public Logger {
2152
+ public:
2153
+ using Logger::Logv;
2154
+ explicit TestLogger(TestEnv* env_ptr) : Logger() { env = env_ptr; }
2155
+ ~TestLogger() override {
2156
+ if (!closed_) {
2157
+ Status s = CloseHelper();
2158
+ s.PermitUncheckedError();
2159
+ }
1994
2160
  }
1995
- }
1996
- void Logv(const char* /*format*/, va_list /*ap*/) override{};
2161
+ void Logv(const char* /*format*/, va_list /*ap*/) override {}
1997
2162
 
1998
- protected:
1999
- Status CloseImpl() override { return CloseHelper(); }
2163
+ protected:
2164
+ Status CloseImpl() override { return CloseHelper(); }
2000
2165
 
2001
- private:
2002
- Status CloseHelper() {
2003
- env->CloseCountInc();;
2004
- return Status::OK();
2005
- }
2006
- TestEnv* env;
2007
- };
2166
+ private:
2167
+ Status CloseHelper() {
2168
+ env->CloseCountInc();
2169
+ return Status::OK();
2170
+ }
2171
+ TestEnv* env;
2172
+ };
2008
2173
 
2009
2174
  void CloseCountInc() { close_count++; }
2010
2175
 
@@ -2081,14 +2246,17 @@ INSTANTIATE_TEST_CASE_P(DefaultEnvWithDirectIO, EnvPosixTestWithParam,
2081
2246
  #endif // !defined(ROCKSDB_LITE)
2082
2247
 
2083
2248
  #if !defined(ROCKSDB_LITE) && !defined(OS_WIN)
2084
- static std::unique_ptr<Env> chroot_env(
2085
- NewChrootEnv(Env::Default(), test::TmpDir(Env::Default())));
2086
- INSTANTIATE_TEST_CASE_P(
2087
- ChrootEnvWithoutDirectIO, EnvPosixTestWithParam,
2088
- ::testing::Values(std::pair<Env*, bool>(chroot_env.get(), false)));
2089
- INSTANTIATE_TEST_CASE_P(
2090
- ChrootEnvWithDirectIO, EnvPosixTestWithParam,
2091
- ::testing::Values(std::pair<Env*, bool>(chroot_env.get(), true)));
2249
+ static Env* GetChrootEnv() {
2250
+ static std::unique_ptr<Env> chroot_env(
2251
+ NewChrootEnv(Env::Default(), test::TmpDir(Env::Default())));
2252
+ return chroot_env.get();
2253
+ }
2254
+ INSTANTIATE_TEST_CASE_P(ChrootEnvWithoutDirectIO, EnvPosixTestWithParam,
2255
+ ::testing::Values(std::pair<Env*, bool>(GetChrootEnv(),
2256
+ false)));
2257
+ INSTANTIATE_TEST_CASE_P(ChrootEnvWithDirectIO, EnvPosixTestWithParam,
2258
+ ::testing::Values(std::pair<Env*, bool>(GetChrootEnv(),
2259
+ true)));
2092
2260
  #endif // !defined(ROCKSDB_LITE) && !defined(OS_WIN)
2093
2261
 
2094
2262
  class EnvFSTestWithParam
@@ -2213,7 +2381,8 @@ TEST_F(EnvTest, IsDirectory) {
2213
2381
  ASSERT_OK(s);
2214
2382
  std::unique_ptr<WritableFileWriter> fwriter;
2215
2383
  fwriter.reset(new WritableFileWriter(std::move(wfile), test_file_path,
2216
- FileOptions(), Env::Default()));
2384
+ FileOptions(),
2385
+ SystemClock::Default().get()));
2217
2386
  constexpr char buf[] = "test";
2218
2387
  s = fwriter->Append(buf);
2219
2388
  ASSERT_OK(s);
@@ -2222,9 +2391,929 @@ TEST_F(EnvTest, IsDirectory) {
2222
2391
  ASSERT_FALSE(is_dir);
2223
2392
  }
2224
2393
 
2394
+ TEST_F(EnvTest, EnvWriteVerificationTest) {
2395
+ Status s = Env::Default()->CreateDirIfMissing(test_directory_);
2396
+ const std::string test_file_path = test_directory_ + "file1";
2397
+ ASSERT_OK(s);
2398
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
2399
+ new FaultInjectionTestFS(FileSystem::Default()));
2400
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2401
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
2402
+ std::unique_ptr<WritableFile> file;
2403
+ s = fault_fs_env->NewWritableFile(test_file_path, &file, EnvOptions());
2404
+ ASSERT_OK(s);
2405
+
2406
+ DataVerificationInfo v_info;
2407
+ std::string test_data = "test";
2408
+ std::string checksum;
2409
+ uint32_t v_crc32c = crc32c::Extend(0, test_data.c_str(), test_data.size());
2410
+ PutFixed32(&checksum, v_crc32c);
2411
+ v_info.checksum = Slice(checksum);
2412
+ s = file->Append(Slice(test_data), v_info);
2413
+ ASSERT_OK(s);
2414
+ }
2415
+
2416
+ class CreateEnvTest : public testing::Test {
2417
+ public:
2418
+ CreateEnvTest() {
2419
+ config_options_.ignore_unknown_options = false;
2420
+ config_options_.ignore_unsupported_options = false;
2421
+ }
2422
+ ConfigOptions config_options_;
2423
+ };
2424
+
2425
+ #ifndef ROCKSDB_LITE
2426
+ TEST_F(CreateEnvTest, LoadCTRProvider) {
2427
+ config_options_.invoke_prepare_options = false;
2428
+ std::string CTR = CTREncryptionProvider::kClassName();
2429
+ std::shared_ptr<EncryptionProvider> provider;
2430
+ // Test a provider with no cipher
2431
+ ASSERT_OK(
2432
+ EncryptionProvider::CreateFromString(config_options_, CTR, &provider));
2433
+ ASSERT_NE(provider, nullptr);
2434
+ ASSERT_EQ(provider->Name(), CTR);
2435
+ ASSERT_NOK(provider->PrepareOptions(config_options_));
2436
+ ASSERT_NOK(provider->ValidateOptions(DBOptions(), ColumnFamilyOptions()));
2437
+ auto cipher = provider->GetOptions<std::shared_ptr<BlockCipher>>("Cipher");
2438
+ ASSERT_NE(cipher, nullptr);
2439
+ ASSERT_EQ(cipher->get(), nullptr);
2440
+ provider.reset();
2441
+
2442
+ ASSERT_OK(EncryptionProvider::CreateFromString(config_options_,
2443
+ CTR + "://test", &provider));
2444
+ ASSERT_NE(provider, nullptr);
2445
+ ASSERT_EQ(provider->Name(), CTR);
2446
+ ASSERT_OK(provider->PrepareOptions(config_options_));
2447
+ ASSERT_OK(provider->ValidateOptions(DBOptions(), ColumnFamilyOptions()));
2448
+ cipher = provider->GetOptions<std::shared_ptr<BlockCipher>>("Cipher");
2449
+ ASSERT_NE(cipher, nullptr);
2450
+ ASSERT_NE(cipher->get(), nullptr);
2451
+ ASSERT_STREQ(cipher->get()->Name(), "ROT13");
2452
+ provider.reset();
2453
+
2454
+ ASSERT_OK(EncryptionProvider::CreateFromString(config_options_, "1://test",
2455
+ &provider));
2456
+ ASSERT_NE(provider, nullptr);
2457
+ ASSERT_EQ(provider->Name(), CTR);
2458
+ ASSERT_OK(provider->PrepareOptions(config_options_));
2459
+ ASSERT_OK(provider->ValidateOptions(DBOptions(), ColumnFamilyOptions()));
2460
+ cipher = provider->GetOptions<std::shared_ptr<BlockCipher>>("Cipher");
2461
+ ASSERT_NE(cipher, nullptr);
2462
+ ASSERT_NE(cipher->get(), nullptr);
2463
+ ASSERT_STREQ(cipher->get()->Name(), "ROT13");
2464
+ provider.reset();
2465
+
2466
+ ASSERT_OK(EncryptionProvider::CreateFromString(
2467
+ config_options_, "id=" + CTR + "; cipher=ROT13", &provider));
2468
+ ASSERT_NE(provider, nullptr);
2469
+ ASSERT_EQ(provider->Name(), CTR);
2470
+ cipher = provider->GetOptions<std::shared_ptr<BlockCipher>>("Cipher");
2471
+ ASSERT_NE(cipher, nullptr);
2472
+ ASSERT_NE(cipher->get(), nullptr);
2473
+ ASSERT_STREQ(cipher->get()->Name(), "ROT13");
2474
+ provider.reset();
2475
+ }
2476
+
2477
+ TEST_F(CreateEnvTest, LoadROT13Cipher) {
2478
+ std::shared_ptr<BlockCipher> cipher;
2479
+ // Test a provider with no cipher
2480
+ ASSERT_OK(BlockCipher::CreateFromString(config_options_, "ROT13", &cipher));
2481
+ ASSERT_NE(cipher, nullptr);
2482
+ ASSERT_STREQ(cipher->Name(), "ROT13");
2483
+ }
2484
+ #endif // ROCKSDB_LITE
2485
+
2486
+ TEST_F(CreateEnvTest, CreateDefaultSystemClock) {
2487
+ std::shared_ptr<SystemClock> clock, copy;
2488
+ ASSERT_OK(SystemClock::CreateFromString(config_options_,
2489
+ SystemClock::kDefaultName(), &clock));
2490
+ ASSERT_NE(clock, nullptr);
2491
+ ASSERT_EQ(clock, SystemClock::Default());
2492
+ #ifndef ROCKSDB_LITE
2493
+ std::string opts_str = clock->ToString(config_options_);
2494
+ std::string mismatch;
2495
+ ASSERT_OK(SystemClock::CreateFromString(config_options_, opts_str, &copy));
2496
+ ASSERT_TRUE(clock->AreEquivalent(config_options_, copy.get(), &mismatch));
2497
+ #endif // ROCKSDB_LITE
2498
+ }
2499
+
2500
+ #ifndef ROCKSDB_LITE
2501
+ TEST_F(CreateEnvTest, CreateMockSystemClock) {
2502
+ std::shared_ptr<SystemClock> mock, copy;
2503
+
2504
+ config_options_.registry->AddLibrary("test")->AddFactory<SystemClock>(
2505
+ MockSystemClock::kClassName(),
2506
+ [](const std::string& /*uri*/, std::unique_ptr<SystemClock>* guard,
2507
+ std::string* /* errmsg */) {
2508
+ guard->reset(new MockSystemClock(nullptr));
2509
+ return guard->get();
2510
+ });
2511
+ ASSERT_OK(SystemClock::CreateFromString(
2512
+ config_options_, EmulatedSystemClock::kClassName(), &mock));
2513
+ ASSERT_NE(mock, nullptr);
2514
+ ASSERT_STREQ(mock->Name(), EmulatedSystemClock::kClassName());
2515
+ ASSERT_EQ(mock->Inner(), SystemClock::Default().get());
2516
+ std::string opts_str = mock->ToString(config_options_);
2517
+ std::string mismatch;
2518
+ ASSERT_OK(SystemClock::CreateFromString(config_options_, opts_str, &copy));
2519
+ ASSERT_TRUE(mock->AreEquivalent(config_options_, copy.get(), &mismatch));
2520
+
2521
+ std::string id = std::string("id=") + EmulatedSystemClock::kClassName() +
2522
+ ";target=" + MockSystemClock::kClassName();
2523
+
2524
+ ASSERT_OK(SystemClock::CreateFromString(config_options_, id, &mock));
2525
+ ASSERT_NE(mock, nullptr);
2526
+ ASSERT_STREQ(mock->Name(), EmulatedSystemClock::kClassName());
2527
+ ASSERT_NE(mock->Inner(), nullptr);
2528
+ ASSERT_STREQ(mock->Inner()->Name(), MockSystemClock::kClassName());
2529
+ ASSERT_EQ(mock->Inner()->Inner(), SystemClock::Default().get());
2530
+ opts_str = mock->ToString(config_options_);
2531
+ ASSERT_OK(SystemClock::CreateFromString(config_options_, opts_str, &copy));
2532
+ ASSERT_TRUE(mock->AreEquivalent(config_options_, copy.get(), &mismatch));
2533
+ ASSERT_OK(SystemClock::CreateFromString(
2534
+ config_options_, EmulatedSystemClock::kClassName(), &mock));
2535
+ }
2536
+
2537
+ TEST_F(CreateEnvTest, CreateReadOnlyFileSystem) {
2538
+ std::shared_ptr<FileSystem> fs, copy;
2539
+
2540
+ ASSERT_OK(FileSystem::CreateFromString(
2541
+ config_options_, ReadOnlyFileSystem::kClassName(), &fs));
2542
+ ASSERT_NE(fs, nullptr);
2543
+ ASSERT_STREQ(fs->Name(), ReadOnlyFileSystem::kClassName());
2544
+ ASSERT_EQ(fs->Inner(), FileSystem::Default().get());
2545
+
2546
+ std::string opts_str = fs->ToString(config_options_);
2547
+ std::string mismatch;
2548
+
2549
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2550
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2551
+
2552
+ ASSERT_OK(FileSystem::CreateFromString(
2553
+ config_options_,
2554
+ std::string("id=") + ReadOnlyFileSystem::kClassName() +
2555
+ "; target=" + TimedFileSystem::kClassName(),
2556
+ &fs));
2557
+ ASSERT_NE(fs, nullptr);
2558
+ opts_str = fs->ToString(config_options_);
2559
+ ASSERT_STREQ(fs->Name(), ReadOnlyFileSystem::kClassName());
2560
+ ASSERT_NE(fs->Inner(), nullptr);
2561
+ ASSERT_STREQ(fs->Inner()->Name(), TimedFileSystem::kClassName());
2562
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2563
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2564
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2565
+ }
2566
+
2567
+ TEST_F(CreateEnvTest, CreateTimedFileSystem) {
2568
+ std::shared_ptr<FileSystem> fs, copy;
2569
+
2570
+ ASSERT_OK(FileSystem::CreateFromString(config_options_,
2571
+ TimedFileSystem::kClassName(), &fs));
2572
+ ASSERT_NE(fs, nullptr);
2573
+ ASSERT_STREQ(fs->Name(), TimedFileSystem::kClassName());
2574
+ ASSERT_EQ(fs->Inner(), FileSystem::Default().get());
2575
+
2576
+ std::string opts_str = fs->ToString(config_options_);
2577
+ std::string mismatch;
2578
+
2579
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2580
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2581
+
2582
+ ASSERT_OK(FileSystem::CreateFromString(
2583
+ config_options_,
2584
+ std::string("id=") + TimedFileSystem::kClassName() +
2585
+ "; target=" + ReadOnlyFileSystem::kClassName(),
2586
+ &fs));
2587
+ ASSERT_NE(fs, nullptr);
2588
+ opts_str = fs->ToString(config_options_);
2589
+ ASSERT_STREQ(fs->Name(), TimedFileSystem::kClassName());
2590
+ ASSERT_NE(fs->Inner(), nullptr);
2591
+ ASSERT_STREQ(fs->Inner()->Name(), ReadOnlyFileSystem::kClassName());
2592
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2593
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2594
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2595
+ }
2596
+
2597
+ TEST_F(CreateEnvTest, CreateCountedFileSystem) {
2598
+ std::shared_ptr<FileSystem> fs, copy;
2599
+
2600
+ ASSERT_OK(FileSystem::CreateFromString(config_options_,
2601
+ CountedFileSystem::kClassName(), &fs));
2602
+ ASSERT_NE(fs, nullptr);
2603
+ ASSERT_STREQ(fs->Name(), CountedFileSystem::kClassName());
2604
+ ASSERT_EQ(fs->Inner(), FileSystem::Default().get());
2605
+
2606
+ std::string opts_str = fs->ToString(config_options_);
2607
+ std::string mismatch;
2608
+
2609
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2610
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2611
+
2612
+ ASSERT_OK(FileSystem::CreateFromString(
2613
+ config_options_,
2614
+ std::string("id=") + CountedFileSystem::kClassName() +
2615
+ "; target=" + ReadOnlyFileSystem::kClassName(),
2616
+ &fs));
2617
+ ASSERT_NE(fs, nullptr);
2618
+ opts_str = fs->ToString(config_options_);
2619
+ ASSERT_STREQ(fs->Name(), CountedFileSystem::kClassName());
2620
+ ASSERT_NE(fs->Inner(), nullptr);
2621
+ ASSERT_STREQ(fs->Inner()->Name(), ReadOnlyFileSystem::kClassName());
2622
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2623
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2624
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2625
+ }
2626
+
2627
+ #ifndef OS_WIN
2628
+ TEST_F(CreateEnvTest, CreateChrootFileSystem) {
2629
+ std::shared_ptr<FileSystem> fs, copy;
2630
+ auto tmp_dir = test::TmpDir(Env::Default());
2631
+ // The Chroot FileSystem has a required "chroot_dir" option.
2632
+ ASSERT_NOK(FileSystem::CreateFromString(config_options_,
2633
+ ChrootFileSystem::kClassName(), &fs));
2634
+
2635
+ // ChrootFileSystem fails with an invalid directory
2636
+ ASSERT_NOK(FileSystem::CreateFromString(
2637
+ config_options_,
2638
+ std::string("chroot_dir=/No/Such/Directory; id=") +
2639
+ ChrootFileSystem::kClassName(),
2640
+ &fs));
2641
+ std::string chroot_opts = std::string("chroot_dir=") + tmp_dir +
2642
+ std::string("; id=") +
2643
+ ChrootFileSystem::kClassName();
2644
+
2645
+ // Create a valid ChrootFileSystem with an inner Default
2646
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, chroot_opts, &fs));
2647
+ ASSERT_NE(fs, nullptr);
2648
+ ASSERT_STREQ(fs->Name(), ChrootFileSystem::kClassName());
2649
+ ASSERT_EQ(fs->Inner(), FileSystem::Default().get());
2650
+ std::string opts_str = fs->ToString(config_options_);
2651
+ std::string mismatch;
2652
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2653
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2654
+
2655
+ // Create a valid ChrootFileSystem with an inner TimedFileSystem
2656
+ ASSERT_OK(FileSystem::CreateFromString(
2657
+ config_options_,
2658
+ chroot_opts + "; target=" + TimedFileSystem::kClassName(), &fs));
2659
+ ASSERT_NE(fs, nullptr);
2660
+ ASSERT_STREQ(fs->Name(), ChrootFileSystem::kClassName());
2661
+ ASSERT_NE(fs->Inner(), nullptr);
2662
+ ASSERT_STREQ(fs->Inner()->Name(), TimedFileSystem::kClassName());
2663
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2664
+ opts_str = fs->ToString(config_options_);
2665
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2666
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2667
+
2668
+ // Create a TimedFileSystem with an inner ChrootFileSystem
2669
+ ASSERT_OK(FileSystem::CreateFromString(
2670
+ config_options_,
2671
+ "target={" + chroot_opts + "}; id=" + TimedFileSystem::kClassName(),
2672
+ &fs));
2673
+ ASSERT_NE(fs, nullptr);
2674
+ ASSERT_STREQ(fs->Name(), TimedFileSystem::kClassName());
2675
+ ASSERT_NE(fs->Inner(), nullptr);
2676
+ ASSERT_STREQ(fs->Inner()->Name(), ChrootFileSystem::kClassName());
2677
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2678
+ opts_str = fs->ToString(config_options_);
2679
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2680
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2681
+ }
2682
+ #endif // OS_WIN
2683
+
2684
+ TEST_F(CreateEnvTest, CreateEncryptedFileSystem) {
2685
+ std::shared_ptr<FileSystem> fs, copy;
2686
+
2687
+ std::string base_opts =
2688
+ std::string("provider=1://test; id=") + EncryptedFileSystem::kClassName();
2689
+ // The EncryptedFileSystem requires a "provider" option.
2690
+ ASSERT_NOK(FileSystem::CreateFromString(
2691
+ config_options_, EncryptedFileSystem::kClassName(), &fs));
2692
+
2693
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, base_opts, &fs));
2694
+
2695
+ ASSERT_NE(fs, nullptr);
2696
+ ASSERT_STREQ(fs->Name(), EncryptedFileSystem::kClassName());
2697
+ ASSERT_EQ(fs->Inner(), FileSystem::Default().get());
2698
+ std::string opts_str = fs->ToString(config_options_);
2699
+ std::string mismatch;
2700
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2701
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2702
+ ASSERT_OK(FileSystem::CreateFromString(
2703
+ config_options_, base_opts + "; target=" + TimedFileSystem::kClassName(),
2704
+ &fs));
2705
+ ASSERT_NE(fs, nullptr);
2706
+ ASSERT_STREQ(fs->Name(), EncryptedFileSystem::kClassName());
2707
+ ASSERT_NE(fs->Inner(), nullptr);
2708
+ ASSERT_STREQ(fs->Inner()->Name(), TimedFileSystem::kClassName());
2709
+ ASSERT_EQ(fs->Inner()->Inner(), FileSystem::Default().get());
2710
+ opts_str = fs->ToString(config_options_);
2711
+ ASSERT_OK(FileSystem::CreateFromString(config_options_, opts_str, &copy));
2712
+ ASSERT_TRUE(fs->AreEquivalent(config_options_, copy.get(), &mismatch));
2713
+ }
2714
+
2715
+ #endif // ROCKSDB_LITE
2716
+
2717
+ namespace {
2718
+
2719
+ constexpr size_t kThreads = 8;
2720
+ constexpr size_t kIdsPerThread = 1000;
2721
+
2722
+ // This is a mini-stress test to check for duplicates in functions like
2723
+ // GenerateUniqueId()
2724
+ template <typename IdType, class Hash = std::hash<IdType>>
2725
+ struct NoDuplicateMiniStressTest {
2726
+ std::unordered_set<IdType, Hash> ids;
2727
+ std::mutex mutex;
2728
+ Env* env;
2729
+
2730
+ NoDuplicateMiniStressTest() { env = Env::Default(); }
2731
+
2732
+ virtual ~NoDuplicateMiniStressTest() {}
2733
+
2734
+ void Run() {
2735
+ std::array<std::thread, kThreads> threads;
2736
+ for (size_t i = 0; i < kThreads; ++i) {
2737
+ threads[i] = std::thread([&]() { ThreadFn(); });
2738
+ }
2739
+ for (auto& thread : threads) {
2740
+ thread.join();
2741
+ }
2742
+ // All must be unique
2743
+ ASSERT_EQ(ids.size(), kThreads * kIdsPerThread);
2744
+ }
2745
+
2746
+ void ThreadFn() {
2747
+ std::array<IdType, kIdsPerThread> my_ids;
2748
+ // Generate in parallel threads as fast as possible
2749
+ for (size_t i = 0; i < kIdsPerThread; ++i) {
2750
+ my_ids[i] = Generate();
2751
+ }
2752
+ // Now collate
2753
+ std::lock_guard<std::mutex> lock(mutex);
2754
+ for (auto& id : my_ids) {
2755
+ ids.insert(id);
2756
+ }
2757
+ }
2758
+
2759
+ virtual IdType Generate() = 0;
2760
+ };
2761
+
2762
+ void VerifyRfcUuids(const std::unordered_set<std::string>& uuids) {
2763
+ if (uuids.empty()) {
2764
+ return;
2765
+ }
2766
+ }
2767
+
2768
+ using uint64_pair_t = std::pair<uint64_t, uint64_t>;
2769
+ struct HashUint64Pair {
2770
+ std::size_t operator()(
2771
+ std::pair<uint64_t, uint64_t> const& u) const noexcept {
2772
+ // Assume suitable distribution already
2773
+ return static_cast<size_t>(u.first ^ u.second);
2774
+ }
2775
+ };
2776
+
2777
+ } // namespace
2778
+
2779
+ TEST_F(EnvTest, GenerateUniqueId) {
2780
+ struct MyStressTest : public NoDuplicateMiniStressTest<std::string> {
2781
+ std::string Generate() override { return env->GenerateUniqueId(); }
2782
+ };
2783
+
2784
+ MyStressTest t;
2785
+ t.Run();
2786
+
2787
+ // Basically verify RFC-4122 format
2788
+ for (auto& uuid : t.ids) {
2789
+ ASSERT_EQ(36U, uuid.size());
2790
+ ASSERT_EQ('-', uuid[8]);
2791
+ ASSERT_EQ('-', uuid[13]);
2792
+ ASSERT_EQ('-', uuid[18]);
2793
+ ASSERT_EQ('-', uuid[23]);
2794
+ }
2795
+ }
2796
+
2797
+ TEST_F(EnvTest, GenerateDbSessionId) {
2798
+ struct MyStressTest : public NoDuplicateMiniStressTest<std::string> {
2799
+ std::string Generate() override { return DBImpl::GenerateDbSessionId(env); }
2800
+ };
2801
+
2802
+ MyStressTest t;
2803
+ t.Run();
2804
+
2805
+ // Basically verify session ID
2806
+ for (auto& id : t.ids) {
2807
+ ASSERT_EQ(20U, id.size());
2808
+ }
2809
+ }
2810
+
2811
+ constexpr bool kRequirePortGenerateRfcUuid =
2812
+ #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN)
2813
+ true;
2814
+ #else
2815
+ false;
2816
+ #endif
2817
+
2818
+ TEST_F(EnvTest, PortGenerateRfcUuid) {
2819
+ if (!kRequirePortGenerateRfcUuid) {
2820
+ ROCKSDB_GTEST_SKIP("Not supported/expected on this platform");
2821
+ return;
2822
+ }
2823
+ struct MyStressTest : public NoDuplicateMiniStressTest<std::string> {
2824
+ std::string Generate() override {
2825
+ std::string u;
2826
+ assert(port::GenerateRfcUuid(&u));
2827
+ return u;
2828
+ }
2829
+ };
2830
+
2831
+ MyStressTest t;
2832
+ t.Run();
2833
+
2834
+ // Extra verification on versions and variants
2835
+ VerifyRfcUuids(t.ids);
2836
+ }
2837
+
2838
+ // Test the atomic, linear generation of GenerateRawUuid
2839
+ TEST_F(EnvTest, GenerateRawUniqueId) {
2840
+ struct MyStressTest
2841
+ : public NoDuplicateMiniStressTest<uint64_pair_t, HashUint64Pair> {
2842
+ uint64_pair_t Generate() override {
2843
+ uint64_pair_t p;
2844
+ GenerateRawUniqueId(&p.first, &p.second);
2845
+ return p;
2846
+ }
2847
+ };
2848
+
2849
+ MyStressTest t;
2850
+ t.Run();
2851
+ }
2852
+
2853
+ // Test that each entropy source ("track") is at least adequate
2854
+ TEST_F(EnvTest, GenerateRawUniqueIdTrackPortUuidOnly) {
2855
+ if (!kRequirePortGenerateRfcUuid) {
2856
+ ROCKSDB_GTEST_SKIP("Not supported/expected on this platform");
2857
+ return;
2858
+ }
2859
+
2860
+ struct MyStressTest
2861
+ : public NoDuplicateMiniStressTest<uint64_pair_t, HashUint64Pair> {
2862
+ uint64_pair_t Generate() override {
2863
+ uint64_pair_t p;
2864
+ TEST_GenerateRawUniqueId(&p.first, &p.second, false, true, true);
2865
+ return p;
2866
+ }
2867
+ };
2868
+
2869
+ MyStressTest t;
2870
+ t.Run();
2871
+ }
2872
+
2873
+ TEST_F(EnvTest, GenerateRawUniqueIdTrackEnvDetailsOnly) {
2874
+ struct MyStressTest
2875
+ : public NoDuplicateMiniStressTest<uint64_pair_t, HashUint64Pair> {
2876
+ uint64_pair_t Generate() override {
2877
+ uint64_pair_t p;
2878
+ TEST_GenerateRawUniqueId(&p.first, &p.second, true, false, true);
2879
+ return p;
2880
+ }
2881
+ };
2882
+
2883
+ MyStressTest t;
2884
+ t.Run();
2885
+ }
2886
+
2887
+ TEST_F(EnvTest, GenerateRawUniqueIdTrackRandomDeviceOnly) {
2888
+ struct MyStressTest
2889
+ : public NoDuplicateMiniStressTest<uint64_pair_t, HashUint64Pair> {
2890
+ uint64_pair_t Generate() override {
2891
+ uint64_pair_t p;
2892
+ TEST_GenerateRawUniqueId(&p.first, &p.second, true, true, false);
2893
+ return p;
2894
+ }
2895
+ };
2896
+
2897
+ MyStressTest t;
2898
+ t.Run();
2899
+ }
2900
+
2901
+ TEST_F(EnvTest, SemiStructuredUniqueIdGenTest) {
2902
+ // Must be thread safe and usable as a static
2903
+ static SemiStructuredUniqueIdGen gen;
2904
+
2905
+ struct MyStressTest
2906
+ : public NoDuplicateMiniStressTest<uint64_pair_t, HashUint64Pair> {
2907
+ uint64_pair_t Generate() override {
2908
+ uint64_pair_t p;
2909
+ gen.GenerateNext(&p.first, &p.second);
2910
+ return p;
2911
+ }
2912
+ };
2913
+
2914
+ MyStressTest t;
2915
+ t.Run();
2916
+ }
2917
+
2918
+ TEST_F(EnvTest, FailureToCreateLockFile) {
2919
+ auto env = Env::Default();
2920
+ auto fs = env->GetFileSystem();
2921
+ std::string dir = test::PerThreadDBPath(env, "lockdir");
2922
+ std::string file = dir + "/lockfile";
2923
+
2924
+ // Ensure directory doesn't exist
2925
+ ASSERT_OK(DestroyDir(env, dir));
2926
+
2927
+ // Make sure that we can acquire a file lock after the first attempt fails
2928
+ FileLock* lock = nullptr;
2929
+ ASSERT_NOK(fs->LockFile(file, IOOptions(), &lock, /*dbg*/ nullptr));
2930
+ ASSERT_FALSE(lock);
2931
+
2932
+ ASSERT_OK(fs->CreateDir(dir, IOOptions(), /*dbg*/ nullptr));
2933
+ ASSERT_OK(fs->LockFile(file, IOOptions(), &lock, /*dbg*/ nullptr));
2934
+ ASSERT_OK(fs->UnlockFile(lock, IOOptions(), /*dbg*/ nullptr));
2935
+
2936
+ // Clean up
2937
+ ASSERT_OK(DestroyDir(env, dir));
2938
+ }
2939
+
2940
+ TEST_F(EnvTest, CreateDefaultEnv) {
2941
+ ConfigOptions options;
2942
+ options.ignore_unsupported_options = false;
2943
+
2944
+ std::shared_ptr<Env> guard;
2945
+ Env* env = nullptr;
2946
+ ASSERT_OK(Env::CreateFromString(options, "", &env));
2947
+ ASSERT_EQ(env, Env::Default());
2948
+
2949
+ env = nullptr;
2950
+ ASSERT_OK(Env::CreateFromString(options, Env::kDefaultName(), &env));
2951
+ ASSERT_EQ(env, Env::Default());
2952
+
2953
+ env = nullptr;
2954
+ ASSERT_OK(Env::CreateFromString(options, "", &env, &guard));
2955
+ ASSERT_EQ(env, Env::Default());
2956
+ ASSERT_EQ(guard, nullptr);
2957
+
2958
+ env = nullptr;
2959
+ ASSERT_OK(Env::CreateFromString(options, Env::kDefaultName(), &env, &guard));
2960
+ ASSERT_EQ(env, Env::Default());
2961
+ ASSERT_EQ(guard, nullptr);
2962
+
2963
+ #ifndef ROCKSDB_LITE
2964
+ std::string opt_str = env->ToString(options);
2965
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env));
2966
+ ASSERT_EQ(env, Env::Default());
2967
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &guard));
2968
+ ASSERT_EQ(env, Env::Default());
2969
+ ASSERT_EQ(guard, nullptr);
2970
+ #endif // ROCKSDB_LITE
2971
+ }
2972
+
2973
+ #ifndef ROCKSDB_LITE
2974
+ namespace {
2975
+ class WrappedEnv : public EnvWrapper {
2976
+ public:
2977
+ explicit WrappedEnv(Env* t) : EnvWrapper(t) {}
2978
+ explicit WrappedEnv(const std::shared_ptr<Env>& t) : EnvWrapper(t) {}
2979
+ static const char* kClassName() { return "WrappedEnv"; }
2980
+ const char* Name() const override { return kClassName(); }
2981
+ static void Register(ObjectLibrary& lib, const std::string& /*arg*/) {
2982
+ lib.AddFactory<Env>(
2983
+ WrappedEnv::kClassName(),
2984
+ [](const std::string& /*uri*/, std::unique_ptr<Env>* guard,
2985
+ std::string* /* errmsg */) {
2986
+ guard->reset(new WrappedEnv(nullptr));
2987
+ return guard->get();
2988
+ });
2989
+ }
2990
+ };
2991
+ } // namespace
2992
+ TEST_F(EnvTest, CreateMockEnv) {
2993
+ ConfigOptions options;
2994
+ options.ignore_unsupported_options = false;
2995
+ WrappedEnv::Register(*(options.registry->AddLibrary("test")), "");
2996
+ std::shared_ptr<Env> guard, copy;
2997
+ std::string opt_str;
2998
+
2999
+ Env* env = nullptr;
3000
+ ASSERT_NOK(Env::CreateFromString(options, MockEnv::kClassName(), &env));
3001
+ ASSERT_OK(
3002
+ Env::CreateFromString(options, MockEnv::kClassName(), &env, &guard));
3003
+ ASSERT_NE(env, nullptr);
3004
+ ASSERT_NE(env, Env::Default());
3005
+ opt_str = env->ToString(options);
3006
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3007
+ ASSERT_NE(copy, guard);
3008
+ std::string mismatch;
3009
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3010
+ guard.reset(MockEnv::Create(Env::Default(), SystemClock::Default()));
3011
+ opt_str = guard->ToString(options);
3012
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3013
+ std::unique_ptr<Env> wrapped_env(new WrappedEnv(Env::Default()));
3014
+ guard.reset(MockEnv::Create(wrapped_env.get(), SystemClock::Default()));
3015
+ opt_str = guard->ToString(options);
3016
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3017
+ opt_str = copy->ToString(options);
3018
+ }
3019
+
3020
+ TEST_F(EnvTest, CreateWrappedEnv) {
3021
+ ConfigOptions options;
3022
+ options.ignore_unsupported_options = false;
3023
+ WrappedEnv::Register(*(options.registry->AddLibrary("test")), "");
3024
+ Env* env = nullptr;
3025
+ std::shared_ptr<Env> guard, copy;
3026
+ std::string opt_str;
3027
+ std::string mismatch;
3028
+
3029
+ ASSERT_NOK(Env::CreateFromString(options, WrappedEnv::kClassName(), &env));
3030
+ ASSERT_OK(
3031
+ Env::CreateFromString(options, WrappedEnv::kClassName(), &env, &guard));
3032
+ ASSERT_NE(env, nullptr);
3033
+ ASSERT_NE(env, Env::Default());
3034
+ ASSERT_FALSE(guard->AreEquivalent(options, Env::Default(), &mismatch));
3035
+
3036
+ opt_str = env->ToString(options);
3037
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3038
+ ASSERT_NE(copy, guard);
3039
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3040
+
3041
+ guard.reset(new WrappedEnv(std::make_shared<WrappedEnv>(Env::Default())));
3042
+ ASSERT_NE(guard.get(), env);
3043
+ opt_str = guard->ToString(options);
3044
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3045
+ ASSERT_NE(copy, guard);
3046
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3047
+
3048
+ guard.reset(new WrappedEnv(std::make_shared<WrappedEnv>(
3049
+ std::make_shared<WrappedEnv>(Env::Default()))));
3050
+ ASSERT_NE(guard.get(), env);
3051
+ opt_str = guard->ToString(options);
3052
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3053
+ ASSERT_NE(copy, guard);
3054
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3055
+ }
3056
+
3057
+ TEST_F(EnvTest, CreateCompositeEnv) {
3058
+ ConfigOptions options;
3059
+ options.ignore_unsupported_options = false;
3060
+ std::shared_ptr<Env> guard, copy;
3061
+ Env* env = nullptr;
3062
+ std::string mismatch, opt_str;
3063
+
3064
+ WrappedEnv::Register(*(options.registry->AddLibrary("test")), "");
3065
+ std::unique_ptr<Env> base(NewCompositeEnv(FileSystem::Default()));
3066
+ std::unique_ptr<Env> wrapped(new WrappedEnv(Env::Default()));
3067
+ std::shared_ptr<FileSystem> timed_fs =
3068
+ std::make_shared<TimedFileSystem>(FileSystem::Default());
3069
+ std::shared_ptr<SystemClock> clock =
3070
+ std::make_shared<EmulatedSystemClock>(SystemClock::Default());
3071
+
3072
+ opt_str = base->ToString(options);
3073
+ ASSERT_NOK(Env::CreateFromString(options, opt_str, &env));
3074
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &guard));
3075
+ ASSERT_NE(env, nullptr);
3076
+ ASSERT_NE(env, Env::Default());
3077
+ ASSERT_EQ(env->GetFileSystem(), FileSystem::Default());
3078
+ ASSERT_EQ(env->GetSystemClock(), SystemClock::Default());
3079
+
3080
+ base = NewCompositeEnv(timed_fs);
3081
+ opt_str = base->ToString(options);
3082
+ ASSERT_NOK(Env::CreateFromString(options, opt_str, &env));
3083
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &guard));
3084
+ ASSERT_NE(env, nullptr);
3085
+ ASSERT_NE(env, Env::Default());
3086
+ ASSERT_NE(env->GetFileSystem(), FileSystem::Default());
3087
+ ASSERT_EQ(env->GetSystemClock(), SystemClock::Default());
3088
+
3089
+ env = nullptr;
3090
+ guard.reset(new CompositeEnvWrapper(wrapped.get(), timed_fs));
3091
+ opt_str = guard->ToString(options);
3092
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3093
+ ASSERT_NE(env, nullptr);
3094
+ ASSERT_NE(env, Env::Default());
3095
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3096
+
3097
+ env = nullptr;
3098
+ guard.reset(new CompositeEnvWrapper(wrapped.get(), clock));
3099
+ opt_str = guard->ToString(options);
3100
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3101
+ ASSERT_NE(env, nullptr);
3102
+ ASSERT_NE(env, Env::Default());
3103
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3104
+
3105
+ env = nullptr;
3106
+ guard.reset(new CompositeEnvWrapper(wrapped.get(), timed_fs, clock));
3107
+ opt_str = guard->ToString(options);
3108
+ ASSERT_OK(Env::CreateFromString(options, opt_str, &env, &copy));
3109
+ ASSERT_NE(env, nullptr);
3110
+ ASSERT_NE(env, Env::Default());
3111
+ ASSERT_TRUE(guard->AreEquivalent(options, copy.get(), &mismatch));
3112
+ }
3113
+ #endif // ROCKSDB_LITE
3114
+
3115
+ // Forward declaration
3116
+ class ReadAsyncFS;
3117
+
3118
+ struct MockIOHandle {
3119
+ std::function<void(const FSReadRequest&, void*)> cb;
3120
+ void* cb_arg;
3121
+ bool create_io_error;
3122
+ };
3123
+
3124
+ // ReadAsyncFS and ReadAsyncRandomAccessFile mocks the FS doing asynchronous
3125
+ // reads by creating threads that submit read requests and then calling Poll API
3126
+ // to obtain those results.
3127
+ class ReadAsyncRandomAccessFile : public FSRandomAccessFileOwnerWrapper {
3128
+ public:
3129
+ ReadAsyncRandomAccessFile(ReadAsyncFS& fs,
3130
+ std::unique_ptr<FSRandomAccessFile>& file)
3131
+ : FSRandomAccessFileOwnerWrapper(std::move(file)), fs_(fs) {}
3132
+
3133
+ IOStatus ReadAsync(FSReadRequest& req, const IOOptions& opts,
3134
+ std::function<void(const FSReadRequest&, void*)> cb,
3135
+ void* cb_arg, void** io_handle, IOHandleDeleter* del_fn,
3136
+ IODebugContext* dbg) override;
3137
+
3138
+ private:
3139
+ ReadAsyncFS& fs_;
3140
+ std::unique_ptr<FSRandomAccessFile> file_;
3141
+ int counter = 0;
3142
+ };
3143
+
3144
+ class ReadAsyncFS : public FileSystemWrapper {
3145
+ public:
3146
+ explicit ReadAsyncFS(const std::shared_ptr<FileSystem>& wrapped)
3147
+ : FileSystemWrapper(wrapped) {}
3148
+
3149
+ static const char* kClassName() { return "ReadAsyncFS"; }
3150
+ const char* Name() const override { return kClassName(); }
3151
+
3152
+ IOStatus NewRandomAccessFile(const std::string& fname,
3153
+ const FileOptions& opts,
3154
+ std::unique_ptr<FSRandomAccessFile>* result,
3155
+ IODebugContext* dbg) override {
3156
+ std::unique_ptr<FSRandomAccessFile> file;
3157
+ IOStatus s = target()->NewRandomAccessFile(fname, opts, &file, dbg);
3158
+ EXPECT_OK(s);
3159
+ result->reset(new ReadAsyncRandomAccessFile(*this, file));
3160
+ return s;
3161
+ }
3162
+
3163
+ IOStatus Poll(std::vector<void*>& io_handles,
3164
+ size_t /*min_completions*/) override {
3165
+ // Wait for the threads completion.
3166
+ for (auto& t : workers) {
3167
+ t.join();
3168
+ }
3169
+
3170
+ for (size_t i = 0; i < io_handles.size(); i++) {
3171
+ MockIOHandle* handle = static_cast<MockIOHandle*>(io_handles[i]);
3172
+ if (handle->create_io_error) {
3173
+ FSReadRequest req;
3174
+ req.status = IOStatus::IOError();
3175
+ handle->cb(req, handle->cb_arg);
3176
+ }
3177
+ }
3178
+ return IOStatus::OK();
3179
+ }
3180
+
3181
+ std::vector<std::thread> workers;
3182
+ };
3183
+
3184
+ IOStatus ReadAsyncRandomAccessFile::ReadAsync(
3185
+ FSReadRequest& req, const IOOptions& opts,
3186
+ std::function<void(const FSReadRequest&, void*)> cb, void* cb_arg,
3187
+ void** io_handle, IOHandleDeleter* del_fn, IODebugContext* dbg) {
3188
+ IOHandleDeleter deletefn = [](void* args) -> void {
3189
+ delete (static_cast<MockIOHandle*>(args));
3190
+ args = nullptr;
3191
+ };
3192
+ *del_fn = deletefn;
3193
+
3194
+ // Allocate and populate io_handle.
3195
+ MockIOHandle* mock_handle = new MockIOHandle();
3196
+ bool create_io_error = false;
3197
+ if (counter % 2) {
3198
+ create_io_error = true;
3199
+ }
3200
+ mock_handle->create_io_error = create_io_error;
3201
+ mock_handle->cb = cb;
3202
+ mock_handle->cb_arg = cb_arg;
3203
+ *io_handle = static_cast<void*>(mock_handle);
3204
+ counter++;
3205
+
3206
+ // Submit read request asynchronously.
3207
+ std::function<void(FSReadRequest)> submit_request =
3208
+ [&opts, cb, cb_arg, dbg, create_io_error, this](FSReadRequest _req) {
3209
+ if (!create_io_error) {
3210
+ _req.status = target()->Read(_req.offset, _req.len, opts,
3211
+ &(_req.result), _req.scratch, dbg);
3212
+ cb(_req, cb_arg);
3213
+ }
3214
+ };
3215
+
3216
+ fs_.workers.emplace_back(submit_request, req);
3217
+ return IOStatus::OK();
3218
+ }
3219
+
3220
+ class TestAsyncRead : public testing::Test {
3221
+ public:
3222
+ TestAsyncRead() { env_ = Env::Default(); }
3223
+ Env* env_;
3224
+ };
3225
+
3226
+ // Tests the default implementation of ReadAsync API.
3227
+ TEST_F(TestAsyncRead, ReadAsync) {
3228
+ EnvOptions soptions;
3229
+ std::shared_ptr<ReadAsyncFS> fs =
3230
+ std::make_shared<ReadAsyncFS>(env_->GetFileSystem());
3231
+
3232
+ std::string fname = test::PerThreadDBPath(env_, "testfile");
3233
+
3234
+ const size_t kSectorSize = 4096;
3235
+ const size_t kNumSectors = 8;
3236
+
3237
+ // 1. create & write to a file.
3238
+ {
3239
+ std::unique_ptr<FSWritableFile> wfile;
3240
+ ASSERT_OK(
3241
+ fs->NewWritableFile(fname, FileOptions(), &wfile, nullptr /*dbg*/));
3242
+
3243
+ for (size_t i = 0; i < kNumSectors; ++i) {
3244
+ auto data = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
3245
+ Slice slice(data.get(), kSectorSize);
3246
+ ASSERT_OK(wfile->Append(slice, IOOptions(), nullptr));
3247
+ }
3248
+ ASSERT_OK(wfile->Close(IOOptions(), nullptr));
3249
+ }
3250
+ // 2. Read file
3251
+ {
3252
+ std::unique_ptr<FSRandomAccessFile> file;
3253
+ ASSERT_OK(fs->NewRandomAccessFile(fname, FileOptions(), &file, nullptr));
3254
+
3255
+ IOOptions opts;
3256
+ std::vector<void*> io_handles(kNumSectors);
3257
+ std::vector<FSReadRequest> reqs(kNumSectors);
3258
+ std::vector<std::unique_ptr<char, Deleter>> data;
3259
+ std::vector<size_t> vals;
3260
+ IOHandleDeleter del_fn;
3261
+ uint64_t offset = 0;
3262
+
3263
+ // Initialize read requests
3264
+ for (size_t i = 0; i < kNumSectors; i++) {
3265
+ reqs[i].offset = offset;
3266
+ reqs[i].len = kSectorSize;
3267
+ data.emplace_back(NewAligned(kSectorSize, 0));
3268
+ reqs[i].scratch = data.back().get();
3269
+ vals.push_back(i);
3270
+ offset += kSectorSize;
3271
+ }
3272
+
3273
+ // callback function passed to async read.
3274
+ std::function<void(const FSReadRequest&, void*)> callback =
3275
+ [&](const FSReadRequest& req, void* cb_arg) {
3276
+ assert(cb_arg != nullptr);
3277
+ size_t i = *(reinterpret_cast<size_t*>(cb_arg));
3278
+ reqs[i].offset = req.offset;
3279
+ reqs[i].result = req.result;
3280
+ reqs[i].status = req.status;
3281
+ };
3282
+
3283
+ // Submit asynchronous read requests.
3284
+ for (size_t i = 0; i < kNumSectors; i++) {
3285
+ void* cb_arg = static_cast<void*>(&(vals[i]));
3286
+ ASSERT_OK(file->ReadAsync(reqs[i], opts, callback, cb_arg,
3287
+ &(io_handles[i]), &del_fn, nullptr));
3288
+ }
3289
+
3290
+ // Poll for the submitted requests.
3291
+ fs->Poll(io_handles, kNumSectors);
3292
+
3293
+ // Check the status of read requests.
3294
+ for (size_t i = 0; i < kNumSectors; i++) {
3295
+ if (i % 2) {
3296
+ ASSERT_EQ(reqs[i].status, IOStatus::IOError());
3297
+ } else {
3298
+ auto buf = NewAligned(kSectorSize * 8, static_cast<char>(i + 1));
3299
+ Slice expected_data(buf.get(), kSectorSize);
3300
+
3301
+ ASSERT_EQ(reqs[i].offset, i * kSectorSize);
3302
+ ASSERT_OK(reqs[i].status);
3303
+ ASSERT_EQ(expected_data.ToString(), reqs[i].result.ToString());
3304
+ }
3305
+ }
3306
+
3307
+ // Delete io_handles.
3308
+ for (size_t i = 0; i < io_handles.size(); i++) {
3309
+ del_fn(io_handles[i]);
3310
+ }
3311
+ }
3312
+ }
2225
3313
  } // namespace ROCKSDB_NAMESPACE
2226
3314
 
2227
3315
  int main(int argc, char** argv) {
3316
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
2228
3317
  ::testing::InitGoogleTest(&argc, argv);
2229
3318
  return RUN_ALL_TESTS();
2230
3319
  }