@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
@@ -9,6 +9,7 @@
9
9
 
10
10
  #include <stdint.h>
11
11
 
12
+ #include "db/wide/wide_column_serialization.h"
12
13
  #include "file/random_access_file_reader.h"
13
14
  #include "port/stack_trace.h"
14
15
  #include "rocksdb/convenience.h"
@@ -24,10 +25,11 @@ namespace ROCKSDB_NAMESPACE {
24
25
  const uint32_t kOptLength = 1024;
25
26
 
26
27
  namespace {
27
- static std::string MakeKey(int i) {
28
+ static std::string MakeKey(int i,
29
+ ValueType value_type = ValueType::kTypeValue) {
28
30
  char buf[100];
29
31
  snprintf(buf, sizeof(buf), "k_%04d", i);
30
- InternalKey key(std::string(buf), 0, ValueType::kTypeValue);
32
+ InternalKey key(std::string(buf), 0, value_type);
31
33
  return key.Encode().ToString();
32
34
  }
33
35
 
@@ -44,6 +46,16 @@ static std::string MakeValue(int i) {
44
46
  return key.Encode().ToString();
45
47
  }
46
48
 
49
+ static std::string MakeWideColumn(int i) {
50
+ std::string val = MakeValue(i);
51
+ std::string val1 = "attr_1_val_" + val;
52
+ std::string val2 = "attr_2_val_" + val;
53
+ WideColumns columns{{"attr_1", val1}, {"attr_2", val2}};
54
+ std::string entity;
55
+ EXPECT_OK(WideColumnSerialization::Serialize(columns, entity));
56
+ return entity;
57
+ }
58
+
47
59
  void cleanup(const Options& opts, const std::string& file_name) {
48
60
  Env* env = opts.env;
49
61
  ASSERT_OK(env->DeleteFile(file_name));
@@ -94,7 +106,8 @@ class SSTDumpToolTest : public testing::Test {
94
106
  snprintf(usage[2], kOptLength, "--file=%s", file_path.c_str());
95
107
  }
96
108
 
97
- void createSST(const Options& opts, const std::string& file_name) {
109
+ void createSST(const Options& opts, const std::string& file_name,
110
+ uint32_t wide_column_one_in = 0) {
98
111
  Env* test_env = opts.env;
99
112
  FileOptions file_options(opts);
100
113
  ReadOptions read_options;
@@ -123,7 +136,12 @@ class SSTDumpToolTest : public testing::Test {
123
136
  const char* comparator_name = ikc.user_comparator()->Name();
124
137
  if (strcmp(comparator_name, ReverseBytewiseComparator()->Name()) == 0) {
125
138
  for (int32_t i = num_keys; i >= 0; i--) {
126
- tb->Add(MakeKey(i), MakeValue(i));
139
+ if (wide_column_one_in == 0 || i % wide_column_one_in != 0) {
140
+ tb->Add(MakeKey(i), MakeValue(i));
141
+ } else {
142
+ tb->Add(MakeKey(i, ValueType::kTypeWideColumnEntity),
143
+ MakeWideColumn(i));
144
+ }
127
145
  }
128
146
  } else if (strcmp(comparator_name,
129
147
  test::BytewiseComparatorWithU64TsWrapper()->Name()) ==
@@ -133,7 +151,12 @@ class SSTDumpToolTest : public testing::Test {
133
151
  }
134
152
  } else {
135
153
  for (uint32_t i = 0; i < num_keys; i++) {
136
- tb->Add(MakeKey(i), MakeValue(i));
154
+ if (wide_column_one_in == 0 || i % wide_column_one_in != 0) {
155
+ tb->Add(MakeKey(i), MakeValue(i));
156
+ } else {
157
+ tb->Add(MakeKey(i, ValueType::kTypeWideColumnEntity),
158
+ MakeWideColumn(i));
159
+ }
137
160
  }
138
161
  }
139
162
  ASSERT_OK(tb->Finish());
@@ -164,7 +187,7 @@ TEST_F(SSTDumpToolTest, EmptyFilter) {
164
187
  Options opts;
165
188
  opts.env = env();
166
189
  std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
167
- createSST(opts, file_path);
190
+ createSST(opts, file_path, 10);
168
191
 
169
192
  char* usage[3];
170
193
  PopulateCommandArgs(file_path, "--command=raw", usage);
@@ -212,7 +235,7 @@ TEST_F(SSTDumpToolTest, SstDumpComparatorWithU64Ts) {
212
235
  opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
213
236
  std::string file_path =
214
237
  MakeFilePath("rocksdb_sst_comparator_with_u64_ts.sst");
215
- createSST(opts, file_path);
238
+ createSST(opts, file_path, 10);
216
239
 
217
240
  char* usage[3];
218
241
  PopulateCommandArgs(file_path, "--command=raw", usage);
@@ -234,7 +257,7 @@ TEST_F(SSTDumpToolTest, FilterBlock) {
234
257
  ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10, true));
235
258
  opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
236
259
  std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
237
- createSST(opts, file_path);
260
+ createSST(opts, file_path, 10);
238
261
 
239
262
  char* usage[3];
240
263
  PopulateCommandArgs(file_path, "--command=raw", usage);
@@ -300,7 +323,7 @@ TEST_F(SSTDumpToolTest, CompressedSizes) {
300
323
  ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10, false));
301
324
  opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
302
325
  std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
303
- createSST(opts, file_path);
326
+ createSST(opts, file_path, 10);
304
327
 
305
328
  char* usage[3];
306
329
  PopulateCommandArgs(file_path, "--command=recompress", usage);
@@ -426,7 +449,7 @@ TEST_F(SSTDumpToolTest, RawOutput) {
426
449
  Options opts;
427
450
  opts.env = env();
428
451
  std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
429
- createSST(opts, file_path);
452
+ createSST(opts, file_path, 10);
430
453
 
431
454
  char* usage[3];
432
455
  PopulateCommandArgs(file_path, "--command=raw", usage);
@@ -23,6 +23,7 @@ int main() {
23
23
  #include "cache/cache_reservation_manager.h"
24
24
  #include "memory/arena.h"
25
25
  #include "port/jemalloc_helper.h"
26
+ #include "rocksdb/convenience.h"
26
27
  #include "rocksdb/filter_policy.h"
27
28
  #include "table/block_based/filter_policy_internal.h"
28
29
  #include "test_util/testharness.h"
@@ -1109,12 +1110,16 @@ static void SetTestingLevel(int levelish, FilterBuildingContext* ctx) {
1109
1110
  TEST(RibbonTest, RibbonTestLevelThreshold) {
1110
1111
  BlockBasedTableOptions opts;
1111
1112
  FilterBuildingContext ctx(opts);
1113
+
1114
+ std::shared_ptr<FilterPolicy> reused{NewRibbonFilterPolicy(10)};
1115
+
1112
1116
  // A few settings
1113
1117
  for (CompactionStyle cs : {kCompactionStyleLevel, kCompactionStyleUniversal,
1114
1118
  kCompactionStyleFIFO, kCompactionStyleNone}) {
1115
1119
  ctx.compaction_style = cs;
1116
- for (int bloom_before_level : {-1, 0, 1, 10}) {
1117
- std::vector<std::unique_ptr<const FilterPolicy> > policies;
1120
+ for (int bloom_before_level : {-1, 0, 1, 10, INT_MAX - 1, INT_MAX}) {
1121
+ SCOPED_TRACE("bloom_before_level=" + std::to_string(bloom_before_level));
1122
+ std::vector<std::shared_ptr<FilterPolicy> > policies;
1118
1123
  policies.emplace_back(NewRibbonFilterPolicy(10, bloom_before_level));
1119
1124
 
1120
1125
  if (bloom_before_level == 0) {
@@ -1122,16 +1127,22 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
1122
1127
  policies.emplace_back(NewRibbonFilterPolicy(10));
1123
1128
  }
1124
1129
 
1125
- for (std::unique_ptr<const FilterPolicy>& policy : policies) {
1126
- // Claim to be generating filter for this level
1127
- SetTestingLevel(bloom_before_level, &ctx);
1130
+ ASSERT_OK(reused->ConfigureOption({}, "bloom_before_level",
1131
+ std::to_string(bloom_before_level)));
1128
1132
 
1129
- std::unique_ptr<FilterBitsBuilder> builder{
1130
- policy->GetBuilderWithContext(ctx)};
1133
+ policies.push_back(reused);
1131
1134
 
1132
- // Must be Ribbon (more space efficient than 10 bits per key)
1133
- ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
1135
+ for (auto& policy : policies) {
1136
+ std::unique_ptr<FilterBitsBuilder> builder;
1137
+ if (bloom_before_level < INT_MAX) {
1138
+ // Claim to be generating filter for this level
1139
+ SetTestingLevel(bloom_before_level, &ctx);
1140
+
1141
+ builder.reset(policy->GetBuilderWithContext(ctx));
1134
1142
 
1143
+ // Must be Ribbon (more space efficient than 10 bits per key)
1144
+ ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
1145
+ }
1135
1146
  if (bloom_before_level >= 0) {
1136
1147
  // Claim to be generating filter for previous level
1137
1148
  SetTestingLevel(bloom_before_level - 1, &ctx);
@@ -1142,6 +1153,10 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
1142
1153
  // Level is considered.
1143
1154
  // Must be Bloom (~ 10 bits per key)
1144
1155
  ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
1156
+ } else if (bloom_before_level == INT_MAX) {
1157
+ // Force bloom option
1158
+ // Must be Bloom (~ 10 bits per key)
1159
+ ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
1145
1160
  } else {
1146
1161
  // Level is ignored under non-traditional compaction styles.
1147
1162
  // Must be Ribbon (more space efficient than 10 bits per key)
@@ -1155,8 +1170,14 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
1155
1170
 
1156
1171
  builder.reset(policy->GetBuilderWithContext(ctx));
1157
1172
 
1158
- // Must be Ribbon (more space efficient than 10 bits per key)
1159
- ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
1173
+ if (bloom_before_level < INT_MAX) {
1174
+ // Must be Ribbon (more space efficient than 10 bits per key)
1175
+ ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
1176
+ } else {
1177
+ // Force bloom option
1178
+ // Must be Bloom (~ 10 bits per key)
1179
+ ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
1180
+ }
1160
1181
  }
1161
1182
  }
1162
1183
  }
@@ -5,6 +5,7 @@
5
5
 
6
6
  #pragma once
7
7
 
8
+ #include <initializer_list>
8
9
  #include <memory>
9
10
  #include <type_traits>
10
11
 
@@ -53,4 +54,13 @@ inline To lossless_cast(From x) {
53
54
  return static_cast<To>(x);
54
55
  }
55
56
 
57
+ // For disambiguating a potentially heterogeneous aggregate as a homogeneous
58
+ // initializer list. E.g. might be able to write List({x, y}) in some cases
59
+ // instead of std::vector<const Widget&>({x, y}).
60
+ template <typename T>
61
+ inline const std::initializer_list<T>& List(
62
+ const std::initializer_list<T>& list) {
63
+ return list;
64
+ }
65
+
56
66
  } // namespace ROCKSDB_NAMESPACE
@@ -23,6 +23,7 @@
23
23
  #include "rocksdb/slice.h"
24
24
  #include "rocksdb/utilities/customizable_util.h"
25
25
  #include "rocksdb/utilities/object_registry.h"
26
+ #include "util/coding.h"
26
27
 
27
28
  namespace ROCKSDB_NAMESPACE {
28
29
 
@@ -230,7 +231,6 @@ class ReverseBytewiseComparatorImpl : public BytewiseComparatorImpl {
230
231
  }
231
232
  };
232
233
 
233
- // EXPERIMENTAL
234
234
  // Comparator with 64-bit integer timestamp.
235
235
  // We did not performance test this yet.
236
236
  template <typename TComparator>
@@ -328,6 +328,31 @@ const Comparator* ReverseBytewiseComparatorWithU64Ts() {
328
328
  return &comp_with_u64_ts;
329
329
  }
330
330
 
331
+ Status DecodeU64Ts(const Slice& ts, uint64_t* int_ts) {
332
+ if (ts.size() != sizeof(uint64_t)) {
333
+ return Status::InvalidArgument("U64Ts timestamp size mismatch.");
334
+ }
335
+ *int_ts = DecodeFixed64(ts.data());
336
+ return Status::OK();
337
+ }
338
+
339
+ Slice EncodeU64Ts(uint64_t ts, std::string* ts_buf) {
340
+ char buf[sizeof(ts)];
341
+ EncodeFixed64(buf, ts);
342
+ ts_buf->assign(buf, sizeof(buf));
343
+ return Slice(*ts_buf);
344
+ }
345
+
346
+ Slice MaxU64Ts() {
347
+ static constexpr char kTsMax[] = "\xff\xff\xff\xff\xff\xff\xff\xff";
348
+ return Slice(kTsMax, sizeof(uint64_t));
349
+ }
350
+
351
+ Slice MinU64Ts() {
352
+ static constexpr char kTsMin[] = "\x00\x00\x00\x00\x00\x00\x00\x00";
353
+ return Slice(kTsMin, sizeof(uint64_t));
354
+ }
355
+
331
356
  static int RegisterBuiltinComparators(ObjectLibrary& library,
332
357
  const std::string& /*arg*/) {
333
358
  library.AddFactory<const Comparator>(
@@ -1153,9 +1153,15 @@ inline bool LZ4_Compress(const CompressionInfo& info,
1153
1153
  static_cast<int>(compression_dict.size()));
1154
1154
  }
1155
1155
  #if LZ4_VERSION_NUMBER >= 10700 // r129+
1156
- outlen =
1157
- LZ4_compress_fast_continue(stream, input, &(*output)[output_header_len],
1158
- static_cast<int>(length), compress_bound, 1);
1156
+ int acceleration;
1157
+ if (info.options().level < 0) {
1158
+ acceleration = -info.options().level;
1159
+ } else {
1160
+ acceleration = 1;
1161
+ }
1162
+ outlen = LZ4_compress_fast_continue(
1163
+ stream, input, &(*output)[output_header_len], static_cast<int>(length),
1164
+ compress_bound, acceleration);
1159
1165
  #else // up to r128
1160
1166
  outlen = LZ4_compress_limitedOutput_continue(
1161
1167
  stream, input, &(*output)[output_header_len], static_cast<int>(length),
@@ -1117,7 +1117,13 @@ static inline Function Choose_Extend() {
1117
1117
  }
1118
1118
  #elif defined(__SSE4_2__) && defined(__PCLMUL__) && !defined NO_THREEWAY_CRC32C
1119
1119
  // NOTE: runtime detection no longer supported on x86
1120
- (void)ExtendImpl<DefaultCRC32>; // suppress unused warning
1120
+ #ifdef _MSC_VER
1121
+ #pragma warning(disable: 4551)
1122
+ #endif
1123
+ (void)ExtendImpl<DefaultCRC32>; // suppress unused warning
1124
+ #ifdef _MSC_VER
1125
+ #pragma warning(default: 4551)
1126
+ #endif
1121
1127
  return crc32c_3way;
1122
1128
  #else
1123
1129
  return ExtendImpl<DefaultCRC32>;
@@ -28,7 +28,7 @@ class DMutex : public folly::DistributedMutex {
28
28
  explicit DMutex(bool IGNORED_adaptive = false) { (void)IGNORED_adaptive; }
29
29
 
30
30
  // currently no-op
31
- void AssertHeld() {}
31
+ void AssertHeld() const {}
32
32
  };
33
33
  using DMutexLock = std::lock_guard<folly::DistributedMutex>;
34
34
 
@@ -0,0 +1,23 @@
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/rocksdb_namespace.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+
12
+ // A helper template that can combine multiple functors into a single one to be
13
+ // used with std::visit for example. It also works with lambdas, since it
14
+ // comes with an explicit deduction guide.
15
+ template <typename... Ts>
16
+ struct overload : Ts... {
17
+ using Ts::operator()...;
18
+ };
19
+
20
+ template <typename... Ts>
21
+ overload(Ts...) -> overload<Ts...>;
22
+
23
+ } // namespace ROCKSDB_NAMESPACE
@@ -107,6 +107,23 @@ void GenericRateLimiter::SetBytesPerSecondLocked(int64_t bytes_per_second) {
107
107
  std::memory_order_relaxed);
108
108
  }
109
109
 
110
+ Status GenericRateLimiter::SetSingleBurstBytes(int64_t single_burst_bytes) {
111
+ if (single_burst_bytes <= 0) {
112
+ return Status::InvalidArgument(
113
+ "`single_burst_bytes` must be greater than 0");
114
+ }
115
+
116
+ MutexLock g(&request_mutex_);
117
+ SetSingleBurstBytesLocked(single_burst_bytes);
118
+ return Status::OK();
119
+ }
120
+
121
+ void GenericRateLimiter::SetSingleBurstBytesLocked(int64_t single_burst_bytes) {
122
+ refill_bytes_per_period_.store(single_burst_bytes, std::memory_order_relaxed);
123
+ refill_period_us_.store(CalculateRefillPeriodUsLocked(single_burst_bytes),
124
+ std::memory_order_relaxed);
125
+ }
126
+
110
127
  void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
111
128
  Statistics* stats) {
112
129
  assert(bytes <= refill_bytes_per_period_.load(std::memory_order_relaxed));
@@ -120,7 +137,8 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
120
137
  static const int kRefillsPerTune = 100;
121
138
  std::chrono::microseconds now(NowMicrosMonotonicLocked());
122
139
  if (now - tuned_time_ >=
123
- kRefillsPerTune * std::chrono::microseconds(refill_period_us_)) {
140
+ kRefillsPerTune * std::chrono::microseconds(refill_period_us_.load(
141
+ std::memory_order_relaxed))) {
124
142
  Status s = TuneLocked();
125
143
  s.PermitUncheckedError(); //**TODO: What to do on error?
126
144
  }
@@ -170,7 +188,7 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
170
188
  RecordTick(stats, NUMBER_RATE_LIMITER_DRAINS);
171
189
  ++num_drains_;
172
190
  wait_until_refill_pending_ = true;
173
- r.cv.TimedWait(wait_until);
191
+ clock_->TimedWait(&r.cv, std::chrono::microseconds(wait_until));
174
192
  TEST_SYNC_POINT_CALLBACK("GenericRateLimiter::Request:PostTimedWait",
175
193
  &time_until_refill_us);
176
194
  wait_until_refill_pending_ = false;
@@ -179,16 +197,16 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
179
197
  // Whichever thread reaches here first performs duty (2) as described
180
198
  // above.
181
199
  RefillBytesAndGrantRequestsLocked();
182
- if (r.request_bytes == 0) {
183
- // If there is any remaining requests, make sure there exists at least
184
- // one candidate is awake for future duties by signaling a front request
185
- // of a queue.
186
- for (int i = Env::IO_TOTAL - 1; i >= Env::IO_LOW; --i) {
187
- std::deque<Req*> queue = queue_[i];
188
- if (!queue.empty()) {
189
- queue.front()->cv.Signal();
190
- break;
191
- }
200
+ }
201
+ if (r.request_bytes == 0) {
202
+ // If there is any remaining requests, make sure there exists at least
203
+ // one candidate is awake for future duties by signaling a front request
204
+ // of a queue.
205
+ for (int i = Env::IO_TOTAL - 1; i >= Env::IO_LOW; --i) {
206
+ auto& queue = queue_[i];
207
+ if (!queue.empty()) {
208
+ queue.front()->cv.Signal();
209
+ break;
192
210
  }
193
211
  }
194
212
  }
@@ -261,7 +279,8 @@ GenericRateLimiter::GeneratePriorityIterationOrderLocked() {
261
279
  void GenericRateLimiter::RefillBytesAndGrantRequestsLocked() {
262
280
  TEST_SYNC_POINT_CALLBACK(
263
281
  "GenericRateLimiter::RefillBytesAndGrantRequestsLocked", &request_mutex_);
264
- next_refill_us_ = NowMicrosMonotonicLocked() + refill_period_us_;
282
+ next_refill_us_ = NowMicrosMonotonicLocked() +
283
+ refill_period_us_.load(std::memory_order_relaxed);
265
284
  // Carry over the left over quota from the last period
266
285
  auto refill_bytes_per_period =
267
286
  refill_bytes_per_period_.load(std::memory_order_relaxed);
@@ -299,13 +318,28 @@ void GenericRateLimiter::RefillBytesAndGrantRequestsLocked() {
299
318
 
300
319
  int64_t GenericRateLimiter::CalculateRefillBytesPerPeriodLocked(
301
320
  int64_t rate_bytes_per_sec) {
321
+ int64_t refill_period_us = refill_period_us_.load(std::memory_order_relaxed);
302
322
  if (std::numeric_limits<int64_t>::max() / rate_bytes_per_sec <
303
- refill_period_us_) {
323
+ refill_period_us) {
324
+ // Avoid unexpected result in the overflow case. The result now is still
325
+ // inaccurate but is a number that is large enough.
326
+ return std::numeric_limits<int64_t>::max() / kMicrosecondsPerSecond;
327
+ } else {
328
+ return rate_bytes_per_sec * refill_period_us / kMicrosecondsPerSecond;
329
+ }
330
+ }
331
+
332
+ int64_t GenericRateLimiter::CalculateRefillPeriodUsLocked(
333
+ int64_t single_burst_bytes) {
334
+ int64_t rate_bytes_per_sec =
335
+ rate_bytes_per_sec_.load(std::memory_order_relaxed);
336
+ if (std::numeric_limits<int64_t>::max() / single_burst_bytes <
337
+ kMicrosecondsPerSecond) {
304
338
  // Avoid unexpected result in the overflow case. The result now is still
305
339
  // inaccurate but is a number that is large enough.
306
- return std::numeric_limits<int64_t>::max() / 1000000;
340
+ return std::numeric_limits<int64_t>::max() / rate_bytes_per_sec;
307
341
  } else {
308
- return rate_bytes_per_sec * refill_period_us_ / 1000000;
342
+ return single_burst_bytes * kMicrosecondsPerSecond / rate_bytes_per_sec;
309
343
  }
310
344
  }
311
345
 
@@ -320,10 +354,11 @@ Status GenericRateLimiter::TuneLocked() {
320
354
  std::chrono::microseconds prev_tuned_time = tuned_time_;
321
355
  tuned_time_ = std::chrono::microseconds(NowMicrosMonotonicLocked());
322
356
 
357
+ int64_t refill_period_us = refill_period_us_.load(std::memory_order_relaxed);
323
358
  int64_t elapsed_intervals = (tuned_time_ - prev_tuned_time +
324
- std::chrono::microseconds(refill_period_us_) -
359
+ std::chrono::microseconds(refill_period_us) -
325
360
  std::chrono::microseconds(1)) /
326
- std::chrono::microseconds(refill_period_us_);
361
+ std::chrono::microseconds(refill_period_us);
327
362
  // We tune every kRefillsPerTune intervals, so the overflow and division-by-
328
363
  // zero conditions should never happen.
329
364
  assert(num_drains_ <= std::numeric_limits<int64_t>::max() / 100);
@@ -36,6 +36,8 @@ class GenericRateLimiter : public RateLimiter {
36
36
  // This API allows user to dynamically change rate limiter's bytes per second.
37
37
  virtual void SetBytesPerSecond(int64_t bytes_per_second) override;
38
38
 
39
+ virtual Status SetSingleBurstBytes(int64_t single_burst_bytes) override;
40
+
39
41
  // Request for token to write bytes. If this request can not be satisfied,
40
42
  // the call is blocked. Caller is responsible to make sure
41
43
  // bytes <= GetSingleBurstBytes() and bytes >= 0. Negative bytes
@@ -102,11 +104,14 @@ class GenericRateLimiter : public RateLimiter {
102
104
  }
103
105
 
104
106
  private:
107
+ static constexpr int kMicrosecondsPerSecond = 1000000;
105
108
  void RefillBytesAndGrantRequestsLocked();
106
109
  std::vector<Env::IOPriority> GeneratePriorityIterationOrderLocked();
107
110
  int64_t CalculateRefillBytesPerPeriodLocked(int64_t rate_bytes_per_sec);
111
+ int64_t CalculateRefillPeriodUsLocked(int64_t single_burst_bytes);
108
112
  Status TuneLocked();
109
113
  void SetBytesPerSecondLocked(int64_t bytes_per_second);
114
+ void SetSingleBurstBytesLocked(int64_t single_burst_bytes);
110
115
 
111
116
  uint64_t NowMicrosMonotonicLocked() {
112
117
  return clock_->NowNanos() / std::milli::den;
@@ -115,7 +120,7 @@ class GenericRateLimiter : public RateLimiter {
115
120
  // This mutex guard all internal states
116
121
  mutable port::Mutex request_mutex_;
117
122
 
118
- const int64_t refill_period_us_;
123
+ std::atomic<int64_t> refill_period_us_;
119
124
 
120
125
  std::atomic<int64_t> rate_bytes_per_sec_;
121
126
  std::atomic<int64_t> refill_bytes_per_period_;
@@ -15,6 +15,7 @@
15
15
  #include "db/db_test_util.h"
16
16
  #include "port/port.h"
17
17
  #include "rocksdb/system_clock.h"
18
+ #include "test_util/mock_time_env.h"
18
19
  #include "test_util/sync_point.h"
19
20
  #include "test_util/testharness.h"
20
21
  #include "util/random.h"
@@ -464,31 +465,21 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
464
465
  const std::chrono::seconds kTimePerRefill(1);
465
466
  const int kRefillsPerTune = 100; // needs to match util/rate_limiter.cc
466
467
 
467
- SpecialEnv special_env(Env::Default(), /*time_elapse_only_sleep*/ true);
468
+ auto mock_clock =
469
+ std::make_shared<MockSystemClock>(Env::Default()->GetSystemClock());
468
470
 
469
471
  auto stats = CreateDBStatistics();
470
472
  std::unique_ptr<RateLimiter> rate_limiter(new GenericRateLimiter(
471
473
  1000 /* rate_bytes_per_sec */,
472
474
  std::chrono::microseconds(kTimePerRefill).count(), 10 /* fairness */,
473
- RateLimiter::Mode::kWritesOnly, special_env.GetSystemClock(),
474
- true /* auto_tuned */));
475
-
476
- // Rate limiter uses `CondVar::TimedWait()`, which does not have access to the
477
- // `Env` to advance its time according to the fake wait duration. The
478
- // workaround is to install a callback that advance the `Env`'s mock time.
479
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
480
- "GenericRateLimiter::Request:PostTimedWait", [&](void* arg) {
481
- int64_t time_waited_us = *static_cast<int64_t*>(arg);
482
- special_env.SleepForMicroseconds(static_cast<int>(time_waited_us));
483
- });
484
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
475
+ RateLimiter::Mode::kWritesOnly, mock_clock, true /* auto_tuned */));
485
476
 
486
477
  // verify rate limit increases after a sequence of periods where rate limiter
487
478
  // is always drained
488
479
  int64_t orig_bytes_per_sec = rate_limiter->GetSingleBurstBytes();
489
480
  rate_limiter->Request(orig_bytes_per_sec, Env::IO_HIGH, stats.get(),
490
481
  RateLimiter::OpType::kWrite);
491
- while (std::chrono::microseconds(special_env.NowMicros()) <=
482
+ while (std::chrono::microseconds(mock_clock->NowMicros()) <=
492
483
  kRefillsPerTune * kTimePerRefill) {
493
484
  rate_limiter->Request(orig_bytes_per_sec, Env::IO_HIGH, stats.get(),
494
485
  RateLimiter::OpType::kWrite);
@@ -496,13 +487,9 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
496
487
  int64_t new_bytes_per_sec = rate_limiter->GetSingleBurstBytes();
497
488
  ASSERT_GT(new_bytes_per_sec, orig_bytes_per_sec);
498
489
 
499
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
500
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearCallBack(
501
- "GenericRateLimiter::Request:PostTimedWait");
502
-
503
490
  // decreases after a sequence of periods where rate limiter is not drained
504
491
  orig_bytes_per_sec = new_bytes_per_sec;
505
- special_env.SleepForMicroseconds(static_cast<int>(
492
+ mock_clock->SleepForMicroseconds(static_cast<int>(
506
493
  kRefillsPerTune * std::chrono::microseconds(kTimePerRefill).count()));
507
494
  // make a request so tuner can be triggered
508
495
  rate_limiter->Request(1 /* bytes */, Env::IO_HIGH, stats.get(),
@@ -511,6 +498,90 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
511
498
  ASSERT_LT(new_bytes_per_sec, orig_bytes_per_sec);
512
499
  }
513
500
 
501
+ TEST_F(RateLimiterTest, WaitHangingBug) {
502
+ // At t=0: Threads 0 and 1 request `kBytesPerRefill` bytes at low-pri. One
503
+ // will be granted immediately and the other will enter `TimedWait()`.
504
+ //
505
+ // At t=`kMicrosPerRefill`: Thread 2 requests `kBytesPerRefill` bytes at
506
+ // low-pri. Thread 2's request enters the queue. To expose the bug scenario,
507
+ // `SyncPoint`s ensure this happens while the lock is temporarily released in
508
+ // `TimedWait()`. Before the bug fix, Thread 2's request would then hang in
509
+ // `Wait()` interminably.
510
+ const int kBytesPerSecond = 100;
511
+ const int kMicrosPerSecond = 1000 * 1000;
512
+ const int kMicrosPerRefill = kMicrosPerSecond;
513
+ const int kBytesPerRefill =
514
+ kBytesPerSecond * kMicrosPerRefill / kMicrosPerSecond;
515
+
516
+ auto mock_clock =
517
+ std::make_shared<MockSystemClock>(Env::Default()->GetSystemClock());
518
+ std::unique_ptr<RateLimiter> limiter(new GenericRateLimiter(
519
+ kBytesPerSecond, kMicrosPerRefill, 10 /* fairness */,
520
+ RateLimiter::Mode::kWritesOnly, mock_clock, false /* auto_tuned */));
521
+ std::array<std::thread, 3> request_threads;
522
+
523
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
524
+ {{"RateLimiterTest::WaitHangingBug:InitialRequestsReady",
525
+ "MockSystemClock::TimedWait:UnlockedPreSleep"},
526
+ {"MockSystemClock::TimedWait:UnlockedPostSleep1",
527
+ "RateLimiterTest::WaitHangingBug:TestThreadRequestBegin"},
528
+ {"RateLimiterTest::WaitHangingBug:TestThreadRequestEnd",
529
+ "MockSystemClock::TimedWait:UnlockedPostSleep2"}});
530
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
531
+
532
+ for (int i = 0; i < 2; i++) {
533
+ request_threads[i] = std::thread([&]() {
534
+ limiter->Request(kBytesPerRefill /* bytes */, Env::IOPriority::IO_LOW,
535
+ nullptr /* stats */, RateLimiter::OpType::kWrite);
536
+ });
537
+ }
538
+ while (limiter->GetTotalRequests() < 2) {
539
+ }
540
+ TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:InitialRequestsReady");
541
+
542
+ TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:TestThreadRequestBegin");
543
+ request_threads[2] = std::thread([&]() {
544
+ limiter->Request(kBytesPerRefill /* bytes */, Env::IOPriority::IO_LOW,
545
+ nullptr /* stats */, RateLimiter::OpType::kWrite);
546
+ });
547
+ while (limiter->GetTotalRequests() < 3) {
548
+ }
549
+ TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:TestThreadRequestEnd");
550
+
551
+ for (int i = 0; i < 3; i++) {
552
+ request_threads[i].join();
553
+ }
554
+ }
555
+
556
+ TEST_F(RateLimiterTest, RuntimeSingleBurstBytesChange) {
557
+ constexpr int kMicrosecondsPerSecond = 1000000;
558
+
559
+ const int64_t kRateBytesPerSec = 400;
560
+
561
+ const int64_t kOldSingleBurstBytes = 100;
562
+ const int64_t kOldRefillPeriodUs =
563
+ kOldSingleBurstBytes * kMicrosecondsPerSecond / kRateBytesPerSec;
564
+ const int64_t kNewSingleBurstBytes = kOldSingleBurstBytes * 2;
565
+
566
+ SpecialEnv special_env(Env::Default(), /*time_elapse_only_sleep*/ true);
567
+ std::unique_ptr<RateLimiter> limiter(new GenericRateLimiter(
568
+ kRateBytesPerSec, kOldRefillPeriodUs, 10 /* fairness */,
569
+ RateLimiter::Mode::kWritesOnly, special_env.GetSystemClock(),
570
+ false /* auto_tuned */));
571
+
572
+ ASSERT_EQ(kOldSingleBurstBytes, limiter->GetSingleBurstBytes());
573
+
574
+ ASSERT_TRUE(limiter->SetSingleBurstBytes(0).IsInvalidArgument());
575
+ ASSERT_OK(limiter->SetSingleBurstBytes(kNewSingleBurstBytes));
576
+ ASSERT_EQ(kNewSingleBurstBytes, limiter->GetSingleBurstBytes());
577
+
578
+ // If the updated single burst bytes is not reflected in the bytes
579
+ // granting process, this request will hang forever.
580
+ limiter->Request(limiter->GetSingleBurstBytes() /* bytes */,
581
+ Env::IOPriority::IO_USER, nullptr /* stats */,
582
+ RateLimiter::OpType::kWrite);
583
+ }
584
+
514
585
  } // namespace ROCKSDB_NAMESPACE
515
586
 
516
587
  int main(int argc, char** argv) {