@nxtedition/rocksdb 9.0.0 → 9.0.1

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 (304) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
  3. package/deps/rocksdb/rocksdb/Makefile +15 -6
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +17 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +182 -7
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
  19. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +293 -17
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +21 -5
  22. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
  24. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  27. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  28. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
  29. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  30. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
  32. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  34. package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
  35. package/deps/rocksdb/rocksdb/db/c.cc +64 -0
  36. package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
  37. package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
  38. package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
  39. package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
  51. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
  52. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  53. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
  54. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
  55. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
  58. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
  71. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  72. package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
  73. package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
  74. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  75. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  76. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  77. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
  78. package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
  79. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
  80. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  82. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  83. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  84. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
  85. package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
  86. package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
  87. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
  88. package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
  89. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
  90. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
  91. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
  92. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  93. package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
  94. package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
  95. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
  96. package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
  98. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
  99. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
  100. package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
  101. package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
  102. package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
  103. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
  104. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  105. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  106. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  107. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  108. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
  109. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  110. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  112. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  113. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  114. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  115. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
  116. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  117. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  118. package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
  119. package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
  121. package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
  122. package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
  123. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  124. package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
  125. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  126. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  127. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  128. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  129. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  130. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  131. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
  149. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
  150. package/deps/rocksdb/rocksdb/env/env.cc +5 -0
  151. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
  152. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
  153. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
  154. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
  155. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
  157. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
  158. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
  160. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
  162. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
  163. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
  164. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
  165. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  166. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  167. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
  168. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  169. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  170. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
  171. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  173. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
  174. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
  175. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  176. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  177. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
  178. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
  186. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  188. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  189. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  190. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  191. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  192. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
  193. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
  194. package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
  195. package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
  196. package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
  197. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  198. package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
  199. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  200. package/deps/rocksdb/rocksdb/port/README +10 -0
  201. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  202. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  203. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  204. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
  205. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  206. package/deps/rocksdb/rocksdb/src.mk +7 -1
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
  208. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
  209. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
  210. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
  211. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
  212. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
  213. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  214. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
  215. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  217. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
  218. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
  219. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
  220. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  221. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  222. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  224. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
  225. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
  226. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  228. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
  229. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  230. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
  231. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  232. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  233. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  234. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  235. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
  236. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
  237. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
  239. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  240. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  241. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  242. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  243. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
  244. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  246. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
  247. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
  248. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  249. package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
  250. package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
  251. package/deps/rocksdb/rocksdb/util/compression.h +9 -3
  252. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  253. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  254. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  255. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  256. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  257. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  258. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  259. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  260. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  261. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  262. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
  263. package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
  264. package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
  265. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
  266. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  267. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  268. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
  269. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  270. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
  271. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  272. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
  273. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  274. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
  275. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  276. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  277. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
  278. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  279. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
  280. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
  281. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  282. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
  283. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
  284. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
  285. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
  286. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
  287. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
  288. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  289. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  290. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
  291. package/deps/rocksdb/rocksdb.gyp +4 -2
  292. package/index.js +0 -8
  293. package/package.json +1 -1
  294. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  295. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  296. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  297. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  298. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  299. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  300. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  301. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  302. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  303. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  304. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -88,11 +88,11 @@ int db_stress_tool(int argc, char** argv) {
88
88
  FaultInjectionTestFS* fs =
89
89
  new FaultInjectionTestFS(raw_env->GetFileSystem());
90
90
  fault_fs_guard.reset(fs);
91
- if (FLAGS_write_fault_one_in) {
92
- fault_fs_guard->SetFilesystemDirectWritable(false);
93
- } else {
94
- fault_fs_guard->SetFilesystemDirectWritable(true);
95
- }
91
+ // Set it to direct writable here to not lose files created during DB open
92
+ // when no open fault injection is not enabled.
93
+ // This will be overwritten in StressTest::Open() for open fault injection
94
+ // and in RunStressTestImpl() for proper write fault injection setup.
95
+ fault_fs_guard->SetFilesystemDirectWritable(true);
96
96
  fault_env_guard =
97
97
  std::make_shared<CompositeEnvWrapper>(raw_env, fault_fs_guard);
98
98
  raw_env = fault_env_guard.get();
@@ -240,10 +240,10 @@ int db_stress_tool(int argc, char** argv) {
240
240
  FLAGS_secondaries_base = default_secondaries_path;
241
241
  }
242
242
 
243
- if (FLAGS_best_efforts_recovery && !FLAGS_skip_verifydb &&
244
- !FLAGS_disable_wal) {
243
+ if (FLAGS_best_efforts_recovery &&
244
+ !(FLAGS_skip_verifydb && FLAGS_disable_wal)) {
245
245
  fprintf(stderr,
246
- "With best-efforts recovery, either skip_verifydb or disable_wal "
246
+ "With best-efforts recovery, skip_verifydb and disable_wal "
247
247
  "should be set to true.\n");
248
248
  exit(1);
249
249
  }
@@ -308,11 +308,11 @@ int db_stress_tool(int argc, char** argv) {
308
308
  }
309
309
 
310
310
  if (FLAGS_use_put_entity_one_in > 0 &&
311
- (FLAGS_use_merge || FLAGS_use_full_merge_v1 || FLAGS_use_txn ||
312
- FLAGS_test_multi_ops_txns || FLAGS_user_timestamp_size > 0)) {
311
+ (FLAGS_use_full_merge_v1 || FLAGS_use_txn || FLAGS_test_multi_ops_txns ||
312
+ FLAGS_user_timestamp_size > 0)) {
313
313
  fprintf(stderr,
314
- "PutEntity is currently incompatible with Merge,"
315
- " transactions, and user-defined timestamps\n");
314
+ "Wide columns are incompatible with V1 Merge, transactions, and "
315
+ "user-defined timestamps\n");
316
316
  exit(1);
317
317
  }
318
318
 
@@ -0,0 +1,51 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #ifdef GFLAGS
7
+
8
+ #include "db_stress_tool/db_stress_wide_merge_operator.h"
9
+
10
+ #include "db_stress_tool/db_stress_common.h"
11
+
12
+ namespace ROCKSDB_NAMESPACE {
13
+
14
+ bool DBStressWideMergeOperator::FullMergeV3(
15
+ const MergeOperationInputV3& merge_in,
16
+ MergeOperationOutputV3* merge_out) const {
17
+ assert(!merge_in.operand_list.empty());
18
+ assert(merge_out);
19
+
20
+ const Slice& latest = merge_in.operand_list.back();
21
+
22
+ if (latest.size() < sizeof(uint32_t)) {
23
+ return false;
24
+ }
25
+
26
+ const uint32_t value_base = GetValueBase(latest);
27
+
28
+ if (FLAGS_use_put_entity_one_in == 0 ||
29
+ (value_base % FLAGS_use_put_entity_one_in) != 0) {
30
+ merge_out->new_value = latest;
31
+ return true;
32
+ }
33
+
34
+ const auto columns = GenerateWideColumns(value_base, latest);
35
+
36
+ merge_out->new_value = MergeOperationOutputV3::NewColumns();
37
+ auto& new_columns =
38
+ std::get<MergeOperationOutputV3::NewColumns>(merge_out->new_value);
39
+ new_columns.reserve(columns.size());
40
+
41
+ for (const auto& column : columns) {
42
+ new_columns.emplace_back(column.name().ToString(),
43
+ column.value().ToString());
44
+ }
45
+
46
+ return true;
47
+ }
48
+
49
+ } // namespace ROCKSDB_NAMESPACE
50
+
51
+ #endif // GFLAGS
@@ -0,0 +1,27 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #pragma once
7
+
8
+ #include "rocksdb/merge_operator.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+
12
+ // A test merge operator that implements the wide-column aware FullMergeV3
13
+ // interface. Similarly to the simple "put" type merge operators, the merge
14
+ // result is based on the last merge operand; however, the merge result can
15
+ // potentially be a wide-column entity, depending on the value base encoded into
16
+ // the merge operand and the value of the "use_put_entity_one_in" stress test
17
+ // option. Following the same rule as for writes ensures that the queries
18
+ // issued by the validation logic receive the expected results.
19
+ class DBStressWideMergeOperator : public MergeOperator {
20
+ public:
21
+ bool FullMergeV3(const MergeOperationInputV3& merge_in,
22
+ MergeOperationOutputV3* merge_out) const override;
23
+
24
+ const char* Name() const override { return "DBStressWideMergeOperator"; }
25
+ };
26
+
27
+ } // namespace ROCKSDB_NAMESPACE
@@ -6,8 +6,8 @@
6
6
  #include <atomic>
7
7
  #ifdef GFLAGS
8
8
 
9
-
10
9
  #include "db/wide/wide_column_serialization.h"
10
+ #include "db/wide/wide_columns_helper.h"
11
11
  #include "db_stress_tool/db_stress_common.h"
12
12
  #include "db_stress_tool/db_stress_shared_state.h"
13
13
  #include "db_stress_tool/expected_state.h"
@@ -363,7 +363,6 @@ bool FileExpectedStateManager::HasHistory() {
363
363
  return saved_seqno_ != kMaxSequenceNumber;
364
364
  }
365
365
 
366
-
367
366
  namespace {
368
367
 
369
368
  // An `ExpectedStateTraceRecordHandler` applies a configurable number of
@@ -462,10 +461,8 @@ class ExpectedStateTraceRecordHandler : public TraceRecord::Handler,
462
461
  column_family_id, key, columns);
463
462
  }
464
463
 
465
- assert(!columns.empty());
466
- assert(columns.front().name() == kDefaultWideColumnName);
467
-
468
- const uint32_t value_base = GetValueBase(columns.front().value());
464
+ const uint32_t value_base =
465
+ GetValueBase(WideColumnsHelper::GetDefaultColumn(columns));
469
466
 
470
467
  state_->SyncPut(column_family_id, static_cast<int64_t>(key_id), value_base);
471
468
 
@@ -1104,8 +1104,9 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1104
1104
  Status s = record.DecodePrimaryIndexEntry(it->key(), it->value());
1105
1105
  if (!s.ok()) {
1106
1106
  oss << "Cannot decode primary index entry " << it->key().ToString(true)
1107
- << "=>" << it->value().ToString(true);
1108
- VerificationAbort(thread->shared, oss.str(), s);
1107
+ << "=>" << it->value().ToString(true) << ". Status is "
1108
+ << s.ToString();
1109
+ VerificationAbort(thread->shared, oss.str());
1109
1110
  assert(false);
1110
1111
  return;
1111
1112
  }
@@ -1125,8 +1126,9 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1125
1126
  std::string value;
1126
1127
  s = db_->Get(ropts, sk, &value);
1127
1128
  if (!s.ok()) {
1128
- oss << "Cannot find secondary index entry " << sk.ToString(true);
1129
- VerificationAbort(thread->shared, oss.str(), s);
1129
+ oss << "Cannot find secondary index entry " << sk.ToString(true)
1130
+ << ". Status is " << s.ToString();
1131
+ VerificationAbort(thread->shared, oss.str());
1130
1132
  assert(false);
1131
1133
  return;
1132
1134
  }
@@ -1153,8 +1155,9 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1153
1155
  Status s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
1154
1156
  if (!s.ok()) {
1155
1157
  oss << "Cannot decode secondary index entry "
1156
- << it->key().ToString(true) << "=>" << it->value().ToString(true);
1157
- VerificationAbort(thread->shared, oss.str(), s);
1158
+ << it->key().ToString(true) << "=>" << it->value().ToString(true)
1159
+ << ". Status is " << s.ToString();
1160
+ VerificationAbort(thread->shared, oss.str());
1158
1161
  assert(false);
1159
1162
  return;
1160
1163
  }
@@ -1168,7 +1171,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1168
1171
  if (!s.ok()) {
1169
1172
  oss << "Error searching pk " << Slice(pk).ToString(true) << ". "
1170
1173
  << s.ToString() << ". sk " << it->key().ToString(true);
1171
- VerificationAbort(thread->shared, oss.str(), s);
1174
+ VerificationAbort(thread->shared, oss.str());
1172
1175
  assert(false);
1173
1176
  return;
1174
1177
  }
@@ -1176,8 +1179,8 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1176
1179
  s = std::get<0>(result);
1177
1180
  if (!s.ok()) {
1178
1181
  oss << "Error decoding primary index value "
1179
- << Slice(value).ToString(true) << ". " << s.ToString();
1180
- VerificationAbort(thread->shared, oss.str(), s);
1182
+ << Slice(value).ToString(true) << ". Status is " << s.ToString();
1183
+ VerificationAbort(thread->shared, oss.str());
1181
1184
  assert(false);
1182
1185
  return;
1183
1186
  }
@@ -1187,7 +1190,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1187
1190
  << Slice(value).ToString(true) << " (a=" << record.a_value()
1188
1191
  << ", c=" << c_in_primary << "), sk: " << it->key().ToString(true)
1189
1192
  << " (c=" << record.c_value() << ")";
1190
- VerificationAbort(thread->shared, oss.str(), s);
1193
+ VerificationAbort(thread->shared, oss.str());
1191
1194
  assert(false);
1192
1195
  return;
1193
1196
  }
@@ -1198,7 +1201,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
1198
1201
  oss << "Pk/sk mismatch: primary index has " << primary_index_entries_count
1199
1202
  << " entries. Secondary index has " << secondary_index_entries_count
1200
1203
  << " entries.";
1201
- VerificationAbort(thread->shared, oss.str(), Status::OK());
1204
+ VerificationAbort(thread->shared, oss.str());
1202
1205
  assert(false);
1203
1206
  return;
1204
1207
  }
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include "db_stress_tool/expected_state.h"
11
11
  #ifdef GFLAGS
12
+ #include "db/wide/wide_columns_helper.h"
12
13
  #include "db_stress_tool/db_stress_common.h"
13
14
  #include "rocksdb/utilities/transaction_db.h"
14
15
  #include "utilities/fault_injection_fs.h"
@@ -165,9 +166,8 @@ class NonBatchedOpsStressTest : public StressTest {
165
166
  if (s.ok()) {
166
167
  const WideColumns& columns = result.columns();
167
168
 
168
- if (!columns.empty() &&
169
- columns.front().name() == kDefaultWideColumnName) {
170
- from_db = columns.front().value().ToString();
169
+ if (WideColumnsHelper::HasDefaultColumn(columns)) {
170
+ from_db = WideColumnsHelper::GetDefaultColumn(columns).ToString();
171
171
  }
172
172
 
173
173
  if (!VerifyWideColumns(columns)) {
@@ -251,9 +251,9 @@ class NonBatchedOpsStressTest : public StressTest {
251
251
  if (statuses[j].ok()) {
252
252
  const WideColumns& columns = results[j].columns();
253
253
 
254
- if (!columns.empty() &&
255
- columns.front().name() == kDefaultWideColumnName) {
256
- from_db = columns.front().value().ToString();
254
+ if (WideColumnsHelper::HasDefaultColumn(columns)) {
255
+ from_db =
256
+ WideColumnsHelper::GetDefaultColumn(columns).ToString();
257
257
  }
258
258
 
259
259
  if (!VerifyWideColumns(columns)) {
@@ -1067,7 +1067,8 @@ class NonBatchedOpsStressTest : public StressTest {
1067
1067
  is_consistent = false;
1068
1068
  } else if (check_get_entity && (s.ok() || s.IsNotFound())) {
1069
1069
  PinnableWideColumns cmp_result;
1070
-
1070
+ ThreadStatusUtil::SetThreadOperation(
1071
+ ThreadStatus::OperationType::OP_GETENTITY);
1071
1072
  const Status cmp_s =
1072
1073
  db_->GetEntity(read_opts_copy, cfh, key_slices[i], &cmp_result);
1073
1074
 
@@ -1276,10 +1277,13 @@ class NonBatchedOpsStressTest : public StressTest {
1276
1277
  const size_t sz = GenerateValue(value_base, value, sizeof(value));
1277
1278
  const Slice v(value, sz);
1278
1279
 
1279
-
1280
1280
  Status s;
1281
1281
 
1282
- if (FLAGS_use_merge) {
1282
+ if (FLAGS_use_put_entity_one_in > 0 &&
1283
+ (value_base % FLAGS_use_put_entity_one_in) == 0) {
1284
+ s = db_->PutEntity(write_opts, cfh, k,
1285
+ GenerateWideColumns(value_base, v));
1286
+ } else if (FLAGS_use_merge) {
1283
1287
  if (!FLAGS_use_txn) {
1284
1288
  if (FLAGS_user_timestamp_size == 0) {
1285
1289
  s = db_->Merge(write_opts, cfh, k, v);
@@ -1291,10 +1295,6 @@ class NonBatchedOpsStressTest : public StressTest {
1291
1295
  return txn.Merge(cfh, k, v);
1292
1296
  });
1293
1297
  }
1294
- } else if (FLAGS_use_put_entity_one_in > 0 &&
1295
- (value_base % FLAGS_use_put_entity_one_in) == 0) {
1296
- s = db_->PutEntity(write_opts, cfh, k,
1297
- GenerateWideColumns(value_base, v));
1298
1298
  } else {
1299
1299
  if (!FLAGS_use_txn) {
1300
1300
  if (FLAGS_user_timestamp_size == 0) {
@@ -1309,10 +1309,8 @@ class NonBatchedOpsStressTest : public StressTest {
1309
1309
  }
1310
1310
  }
1311
1311
 
1312
- pending_expected_value.Commit();
1313
-
1314
1312
  if (!s.ok()) {
1315
- if (FLAGS_injest_error_severity >= 2) {
1313
+ if (FLAGS_inject_error_severity >= 2) {
1316
1314
  if (!is_db_stopped_ && s.severity() >= Status::Severity::kFatalError) {
1317
1315
  is_db_stopped_ = true;
1318
1316
  } else if (!is_db_stopped_ ||
@@ -1325,7 +1323,7 @@ class NonBatchedOpsStressTest : public StressTest {
1325
1323
  thread->shared->SafeTerminate();
1326
1324
  }
1327
1325
  }
1328
-
1326
+ pending_expected_value.Commit();
1329
1327
  thread->stats.AddBytesForWrites(1, sz);
1330
1328
  PrintKeyValue(rand_column_family, static_cast<uint32_t>(rand_key), value,
1331
1329
  sz);
@@ -1367,11 +1365,9 @@ class NonBatchedOpsStressTest : public StressTest {
1367
1365
  return txn.Delete(cfh, key);
1368
1366
  });
1369
1367
  }
1370
- pending_expected_value.Commit();
1371
1368
 
1372
- thread->stats.AddDeletes(1);
1373
1369
  if (!s.ok()) {
1374
- if (FLAGS_injest_error_severity >= 2) {
1370
+ if (FLAGS_inject_error_severity >= 2) {
1375
1371
  if (!is_db_stopped_ &&
1376
1372
  s.severity() >= Status::Severity::kFatalError) {
1377
1373
  is_db_stopped_ = true;
@@ -1385,6 +1381,8 @@ class NonBatchedOpsStressTest : public StressTest {
1385
1381
  thread->shared->SafeTerminate();
1386
1382
  }
1387
1383
  }
1384
+ pending_expected_value.Commit();
1385
+ thread->stats.AddDeletes(1);
1388
1386
  } else {
1389
1387
  PendingExpectedValue pending_expected_value =
1390
1388
  shared->PrepareSingleDelete(rand_column_family, rand_key);
@@ -1399,10 +1397,9 @@ class NonBatchedOpsStressTest : public StressTest {
1399
1397
  return txn.SingleDelete(cfh, key);
1400
1398
  });
1401
1399
  }
1402
- pending_expected_value.Commit();
1403
- thread->stats.AddSingleDeletes(1);
1400
+
1404
1401
  if (!s.ok()) {
1405
- if (FLAGS_injest_error_severity >= 2) {
1402
+ if (FLAGS_inject_error_severity >= 2) {
1406
1403
  if (!is_db_stopped_ &&
1407
1404
  s.severity() >= Status::Severity::kFatalError) {
1408
1405
  is_db_stopped_ = true;
@@ -1416,6 +1413,8 @@ class NonBatchedOpsStressTest : public StressTest {
1416
1413
  thread->shared->SafeTerminate();
1417
1414
  }
1418
1415
  }
1416
+ pending_expected_value.Commit();
1417
+ thread->stats.AddSingleDeletes(1);
1419
1418
  }
1420
1419
  return s;
1421
1420
  }
@@ -1464,7 +1463,7 @@ class NonBatchedOpsStressTest : public StressTest {
1464
1463
  s = db_->DeleteRange(write_opts, cfh, key, end_key);
1465
1464
  }
1466
1465
  if (!s.ok()) {
1467
- if (FLAGS_injest_error_severity >= 2) {
1466
+ if (FLAGS_inject_error_severity >= 2) {
1468
1467
  if (!is_db_stopped_ && s.severity() >= Status::Severity::kFatalError) {
1469
1468
  is_db_stopped_ = true;
1470
1469
  } else if (!is_db_stopped_ ||
@@ -1543,11 +1542,8 @@ class NonBatchedOpsStressTest : public StressTest {
1543
1542
  const Slice k(key_str);
1544
1543
  const Slice v(value, value_len);
1545
1544
 
1546
- const bool use_put_entity =
1547
- !FLAGS_use_merge && FLAGS_use_put_entity_one_in > 0 &&
1548
- (value_base % FLAGS_use_put_entity_one_in) == 0;
1549
-
1550
- if (use_put_entity) {
1545
+ if (FLAGS_use_put_entity_one_in > 0 &&
1546
+ (value_base % FLAGS_use_put_entity_one_in) == 0) {
1551
1547
  WideColumns columns = GenerateWideColumns(value_base, v);
1552
1548
  s = sst_file_writer.PutEntity(k, columns);
1553
1549
  } else {
@@ -1567,12 +1563,16 @@ class NonBatchedOpsStressTest : public StressTest {
1567
1563
  {sst_filename}, IngestExternalFileOptions());
1568
1564
  }
1569
1565
  if (!s.ok()) {
1570
- fprintf(stderr, "file ingestion error: %s\n", s.ToString().c_str());
1571
- thread->shared->SafeTerminate();
1572
- }
1573
-
1574
- for (size_t i = 0; i < pending_expected_values.size(); ++i) {
1575
- pending_expected_values[i].Commit();
1566
+ if (!s.IsIOError() || !std::strstr(s.getState(), "injected")) {
1567
+ fprintf(stderr, "file ingestion error: %s\n", s.ToString().c_str());
1568
+ thread->shared->SafeTerminate();
1569
+ } else {
1570
+ fprintf(stdout, "file ingestion error: %s\n", s.ToString().c_str());
1571
+ }
1572
+ } else {
1573
+ for (size_t i = 0; i < pending_expected_values.size(); ++i) {
1574
+ pending_expected_values[i].Commit();
1575
+ }
1576
1576
  }
1577
1577
  }
1578
1578
 
@@ -2035,9 +2035,7 @@ class NonBatchedOpsStressTest : public StressTest {
2035
2035
  const Slice slice(value_from_db);
2036
2036
  const uint32_t value_base_from_db = GetValueBase(slice);
2037
2037
  if (ExpectedValueHelper::MustHaveNotExisted(expected_value,
2038
- expected_value) ||
2039
- !ExpectedValueHelper::InExpectedValueBaseRange(
2040
- value_base_from_db, expected_value, expected_value)) {
2038
+ expected_value)) {
2041
2039
  VerificationAbort(shared, msg_prefix + ": Unexpected value found", cf,
2042
2040
  key, value_from_db, "");
2043
2041
  return false;
@@ -2046,6 +2044,14 @@ class NonBatchedOpsStressTest : public StressTest {
2046
2044
  size_t expected_value_data_size =
2047
2045
  GenerateValue(expected_value.GetValueBase(), expected_value_data,
2048
2046
  sizeof(expected_value_data));
2047
+ if (!ExpectedValueHelper::InExpectedValueBaseRange(
2048
+ value_base_from_db, expected_value, expected_value)) {
2049
+ VerificationAbort(shared, msg_prefix + ": Unexpected value found", cf,
2050
+ key, value_from_db,
2051
+ Slice(expected_value_data, expected_value_data_size));
2052
+ return false;
2053
+ }
2054
+ // TODO: are the length/memcmp() checks repetitive?
2049
2055
  if (value_from_db.length() != expected_value_data_size) {
2050
2056
  VerificationAbort(shared,
2051
2057
  msg_prefix + ": Length of value read is not equal",
@@ -1229,4 +1229,9 @@ Status SystemClock::CreateFromString(const ConfigOptions& config_options,
1229
1229
  return LoadSharedObject<SystemClock>(config_options, value, result);
1230
1230
  }
1231
1231
  }
1232
+
1233
+ bool SystemClock::TimedWait(port::CondVar* cv,
1234
+ std::chrono::microseconds deadline) {
1235
+ return cv->TimedWait(deadline.count());
1236
+ }
1232
1237
  } // namespace ROCKSDB_NAMESPACE
@@ -21,6 +21,7 @@
21
21
  #ifdef __SSE4_2__
22
22
  #ifdef _WIN32
23
23
  #include <intrin.h>
24
+ #define _rdtsc() __rdtsc()
24
25
  #else
25
26
  #include <x86intrin.h>
26
27
  #endif
@@ -98,6 +98,9 @@ Status FilePrefetchBuffer::Read(const IOOptions& opts,
98
98
  return s;
99
99
  }
100
100
 
101
+ if (usage_ == FilePrefetchBufferUsage::kUserScanPrefetch) {
102
+ RecordTick(stats_, PREFETCH_BYTES, read_len);
103
+ }
101
104
  // Update the buffer offset and size.
102
105
  bufs_[index].offset_ = rounddown_start;
103
106
  bufs_[index].buffer_.Size(static_cast<size_t>(chunk_len) + result.size());
@@ -364,8 +367,11 @@ Status FilePrefetchBuffer::HandleOverlappingData(
364
367
  size_t second_size = bufs_[second].async_read_in_progress_
365
368
  ? bufs_[second].async_req_len_
366
369
  : bufs_[second].buffer_.CurrentSize();
367
- if (tmp_offset + tmp_length <= bufs_[second].offset_ + second_size) {
368
- uint64_t rounddown_start = bufs_[second].offset_ + second_size;
370
+ uint64_t rounddown_start = bufs_[second].offset_ + second_size;
371
+ // Second buffer might be out of bound if first buffer already prefetched
372
+ // that data.
373
+ if (tmp_offset + tmp_length <= bufs_[second].offset_ + second_size &&
374
+ !IsOffsetOutOfBound(rounddown_start)) {
369
375
  uint64_t roundup_end =
370
376
  Roundup(rounddown_start + readahead_size, alignment);
371
377
  uint64_t roundup_len = roundup_end - rounddown_start;
@@ -562,20 +568,24 @@ Status FilePrefetchBuffer::PrefetchAsyncInternal(const IOOptions& opts,
562
568
  roundup_end2 = Roundup(rounddown_start2 + prefetch_size, alignment);
563
569
  }
564
570
 
565
- uint64_t roundup_len2 = roundup_end2 - rounddown_start2;
566
- uint64_t chunk_len2 = 0;
567
- CalculateOffsetAndLen(alignment, rounddown_start2, roundup_len2, second,
568
- false /*refit_tail*/, chunk_len2);
569
- assert(chunk_len2 == 0);
570
- // Update the buffer offset.
571
- bufs_[second].offset_ = rounddown_start2;
572
- assert(roundup_len2 >= chunk_len2);
573
- uint64_t read_len2 = static_cast<size_t>(roundup_len2 - chunk_len2);
574
- s = ReadAsync(opts, reader, read_len2, rounddown_start2, second);
575
- if (!s.ok()) {
576
- DestroyAndClearIOHandle(second);
577
- bufs_[second].buffer_.Clear();
578
- return s;
571
+ // Second buffer might be out of bound if first buffer already prefetched
572
+ // that data.
573
+ if (!IsOffsetOutOfBound(rounddown_start2)) {
574
+ uint64_t roundup_len2 = roundup_end2 - rounddown_start2;
575
+ uint64_t chunk_len2 = 0;
576
+ CalculateOffsetAndLen(alignment, rounddown_start2, roundup_len2, second,
577
+ false /*refit_tail*/, chunk_len2);
578
+ assert(chunk_len2 == 0);
579
+ // Update the buffer offset.
580
+ bufs_[second].offset_ = rounddown_start2;
581
+ assert(roundup_len2 >= chunk_len2);
582
+ uint64_t read_len2 = static_cast<size_t>(roundup_len2 - chunk_len2);
583
+ s = ReadAsync(opts, reader, read_len2, rounddown_start2, second);
584
+ if (!s.ok()) {
585
+ DestroyAndClearIOHandle(second);
586
+ bufs_[second].buffer_.Clear();
587
+ return s;
588
+ }
579
589
  }
580
590
  }
581
591
 
@@ -646,6 +656,11 @@ bool FilePrefetchBuffer::TryReadFromCacheUntracked(
646
656
  if (for_compaction) {
647
657
  s = Prefetch(opts, reader, offset, std::max(n, readahead_size_));
648
658
  } else {
659
+ if (IsOffsetInBuffer(offset, curr_)) {
660
+ RecordTick(stats_, PREFETCH_BYTES_USEFUL,
661
+ bufs_[curr_].offset_ + bufs_[curr_].buffer_.CurrentSize() -
662
+ offset);
663
+ }
649
664
  if (implicit_auto_readahead_) {
650
665
  if (!IsEligibleForPrefetch(offset, n)) {
651
666
  // Ignore status as Prefetch is not called.
@@ -653,8 +668,8 @@ bool FilePrefetchBuffer::TryReadFromCacheUntracked(
653
668
  return false;
654
669
  }
655
670
  }
656
- UpdateReadAheadSizeForUpperBound(offset, n);
657
- s = Prefetch(opts, reader, offset, n + readahead_size_);
671
+ size_t current_readahead_size = ReadAheadSizeTuning(offset, n);
672
+ s = Prefetch(opts, reader, offset, n + current_readahead_size);
658
673
  }
659
674
  if (!s.ok()) {
660
675
  if (status) {
@@ -669,6 +684,9 @@ bool FilePrefetchBuffer::TryReadFromCacheUntracked(
669
684
  } else {
670
685
  return false;
671
686
  }
687
+ } else if (!for_compaction) {
688
+ RecordTick(stats_, PREFETCH_HITS);
689
+ RecordTick(stats_, PREFETCH_BYTES_USEFUL, n);
672
690
  }
673
691
  UpdateReadPattern(offset, n, false /*decrease_readaheadsize*/);
674
692
 
@@ -925,17 +943,20 @@ Status FilePrefetchBuffer::PrefetchAsync(const IOOptions& opts,
925
943
  rounddown_start2 = roundup_end1;
926
944
  }
927
945
 
928
- roundup_end2 = Roundup(rounddown_start2 + prefetch_size, alignment);
929
- uint64_t roundup_len2 = roundup_end2 - rounddown_start2;
930
-
931
- assert(roundup_len2 >= alignment);
932
- CalculateOffsetAndLen(alignment, rounddown_start2, roundup_len2, second,
933
- false, chunk_len2);
934
- assert(chunk_len2 == 0);
935
- assert(roundup_len2 >= chunk_len2);
936
- read_len2 = static_cast<size_t>(roundup_len2 - chunk_len2);
937
- // Update the buffer offset.
938
- bufs_[second].offset_ = rounddown_start2;
946
+ // Second buffer might be out of bound if first buffer already prefetched
947
+ // that data.
948
+ if (!IsOffsetOutOfBound(rounddown_start2)) {
949
+ roundup_end2 = Roundup(rounddown_start2 + prefetch_size, alignment);
950
+ uint64_t roundup_len2 = roundup_end2 - rounddown_start2;
951
+
952
+ CalculateOffsetAndLen(alignment, rounddown_start2, roundup_len2, second,
953
+ false, chunk_len2);
954
+ assert(chunk_len2 == 0);
955
+ assert(roundup_len2 >= chunk_len2);
956
+ read_len2 = static_cast<size_t>(roundup_len2 - chunk_len2);
957
+ // Update the buffer offset.
958
+ bufs_[second].offset_ = rounddown_start2;
959
+ }
939
960
  }
940
961
 
941
962
  if (read_len1) {
@@ -56,6 +56,7 @@ struct BufferInfo {
56
56
 
57
57
  enum class FilePrefetchBufferUsage {
58
58
  kTableOpenPrefetchTail,
59
+ kUserScanPrefetch,
59
60
  kUnknown,
60
61
  };
61
62
 
@@ -90,6 +91,7 @@ class FilePrefetchBuffer {
90
91
  uint64_t num_file_reads_for_auto_readahead = 0,
91
92
  uint64_t upper_bound_offset = 0, FileSystem* fs = nullptr,
92
93
  SystemClock* clock = nullptr, Statistics* stats = nullptr,
94
+ const std::function<void(uint64_t, size_t, size_t&)>& cb = nullptr,
93
95
  FilePrefetchBufferUsage usage = FilePrefetchBufferUsage::kUnknown)
94
96
  : curr_(0),
95
97
  readahead_size_(readahead_size),
@@ -108,7 +110,8 @@ class FilePrefetchBuffer {
108
110
  clock_(clock),
109
111
  stats_(stats),
110
112
  usage_(usage),
111
- upper_bound_offset_(upper_bound_offset) {
113
+ upper_bound_offset_(upper_bound_offset),
114
+ readaheadsize_cb_(cb) {
112
115
  assert((num_file_reads_ >= num_file_reads_for_auto_readahead_ + 1) ||
113
116
  (num_file_reads_ == 0));
114
117
  // If ReadOptions.async_io is enabled, data is asynchronously filled in
@@ -279,6 +282,11 @@ class FilePrefetchBuffer {
279
282
  // Callback function passed to underlying FS in case of asynchronous reads.
280
283
  void PrefetchAsyncCallback(const FSReadRequest& req, void* cb_arg);
281
284
 
285
+ void ResetUpperBoundOffset(uint64_t upper_bound_offset) {
286
+ upper_bound_offset_ = upper_bound_offset;
287
+ readahead_size_ = initial_auto_readahead_size_;
288
+ }
289
+
282
290
  private:
283
291
  // Calculates roundoff offset and length to be prefetched based on alignment
284
292
  // and data present in buffer_. It also allocates new buffer or refit tail if
@@ -321,7 +329,6 @@ class FilePrefetchBuffer {
321
329
  void ResetValues() {
322
330
  num_file_reads_ = 1;
323
331
  readahead_size_ = initial_auto_readahead_size_;
324
- upper_bound_offset_ = 0;
325
332
  }
326
333
 
327
334
  // Called in case of implicit auto prefetching.
@@ -437,6 +444,28 @@ class FilePrefetchBuffer {
437
444
  }
438
445
  }
439
446
 
447
+ inline bool IsOffsetOutOfBound(uint64_t offset) {
448
+ if (upper_bound_offset_ > 0) {
449
+ return (offset >= upper_bound_offset_);
450
+ }
451
+ return false;
452
+ }
453
+
454
+ // Performs tuning to calculate readahead_size.
455
+ size_t ReadAheadSizeTuning(uint64_t offset, size_t n) {
456
+ UpdateReadAheadSizeForUpperBound(offset, n);
457
+
458
+ if (readaheadsize_cb_ != nullptr && readahead_size_ > 0) {
459
+ size_t updated_readahead_size = 0;
460
+ readaheadsize_cb_(offset, readahead_size_, updated_readahead_size);
461
+ if (readahead_size_ != updated_readahead_size) {
462
+ RecordTick(stats_, READAHEAD_TRIMMED);
463
+ }
464
+ return updated_readahead_size;
465
+ }
466
+ return readahead_size_;
467
+ }
468
+
440
469
  std::vector<BufferInfo> bufs_;
441
470
  // curr_ represents the index for bufs_ indicating which buffer is being
442
471
  // consumed currently.
@@ -483,5 +512,6 @@ class FilePrefetchBuffer {
483
512
  // ReadOptions.auto_readahead_size are set to trim readahead_size upto
484
513
  // upper_bound_offset_ during prefetching.
485
514
  uint64_t upper_bound_offset_ = 0;
515
+ std::function<void(uint64_t, size_t, size_t&)> readaheadsize_cb_;
486
516
  };
487
517
  } // namespace ROCKSDB_NAMESPACE