@nxtedition/rocksdb 8.2.8 → 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 (483) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +20 -10
  3. package/deps/rocksdb/rocksdb/Makefile +37 -25
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +25 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
  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 +58 -95
  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 +2683 -496
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
  18. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  19. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
  22. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -3
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  27. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  28. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  29. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  30. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  33. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  41. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  42. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  43. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  44. package/deps/rocksdb/rocksdb/db/builder.cc +35 -10
  45. package/deps/rocksdb/rocksdb/db/c.cc +233 -6
  46. package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
  47. package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
  48. package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
  49. package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
  50. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
  60. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
  61. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
  62. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  63. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  64. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
  65. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
  66. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
  68. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
  69. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  70. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  71. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  72. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  73. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
  74. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
  75. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
  76. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  77. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
  78. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  79. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
  80. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
  81. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  87. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
  88. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
  89. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
  90. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
  91. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
  92. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
  93. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
  94. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  95. package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
  96. package/deps/rocksdb/rocksdb/db/db_iter.h +11 -2
  97. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  98. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  99. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  100. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  101. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
  102. package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
  103. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  104. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
  105. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
  106. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  107. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  108. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  109. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  111. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
  112. package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
  113. package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
  114. package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
  115. package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
  116. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
  117. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
  118. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
  119. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  121. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  122. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  123. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  124. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  125. package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
  126. package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
  127. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  128. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  129. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  130. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  131. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  132. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
  133. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  134. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  135. package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
  136. package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
  137. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
  138. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  139. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  140. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  141. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  142. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  143. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  144. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  145. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  146. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  147. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  149. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
  150. package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
  151. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  152. package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
  153. package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
  154. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
  155. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  156. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  157. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  158. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  159. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -2
  160. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  161. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -0
  162. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  164. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  165. package/deps/rocksdb/rocksdb/db/repair.cc +25 -7
  166. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  167. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
  168. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  169. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  170. package/deps/rocksdb/rocksdb/db/table_cache.cc +76 -54
  171. package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
  172. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  173. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  174. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  175. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  176. package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
  177. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  178. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  179. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  180. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
  181. package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
  182. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  183. package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
  184. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  185. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  186. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  187. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  188. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  189. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  190. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  191. package/deps/rocksdb/rocksdb/db/write_batch.cc +55 -20
  192. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  193. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  194. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  195. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  196. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  197. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  198. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +37 -13
  199. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
  200. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  201. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
  202. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  203. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -1
  204. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
  205. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
  206. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
  207. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  208. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  209. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  210. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  211. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
  212. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
  213. package/deps/rocksdb/rocksdb/env/env.cc +6 -2
  214. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  215. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  216. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  217. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  218. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  219. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
  220. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  221. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  222. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  223. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
  224. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
  225. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  226. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  227. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
  228. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
  229. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  230. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  231. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  232. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
  233. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
  234. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
  235. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
  236. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  238. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
  239. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  240. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
  241. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
  242. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  243. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
  244. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  245. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  246. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  248. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  249. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +130 -22
  250. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  251. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  252. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +92 -9
  253. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  254. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  255. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  257. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  259. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
  260. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -0
  261. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  268. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  269. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  270. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -2
  271. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  272. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
  273. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  274. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  275. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  276. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  277. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
  278. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  279. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  280. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  281. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  282. package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
  283. package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
  284. package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
  285. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  286. package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
  287. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
  288. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
  289. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  290. package/deps/rocksdb/rocksdb/port/README +10 -0
  291. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  292. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  293. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  294. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  295. package/deps/rocksdb/rocksdb/port/stack_trace.cc +32 -12
  296. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  297. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  298. package/deps/rocksdb/rocksdb/src.mk +10 -1
  299. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  300. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  301. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  302. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
  303. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
  304. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
  305. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
  306. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
  307. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
  308. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  309. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +52 -24
  310. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  311. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  312. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  313. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  314. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  315. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -18
  316. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
  317. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
  318. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  319. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  320. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  321. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  322. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  323. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  324. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
  325. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  326. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
  327. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  328. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  329. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  330. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
  331. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  332. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  333. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  334. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
  335. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  336. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
  337. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  338. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  339. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  340. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  341. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  342. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  343. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  344. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  345. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  346. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  347. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +22 -2
  348. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  349. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  350. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  351. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  352. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  353. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  354. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  355. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
  356. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  357. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
  358. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  359. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  360. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  361. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  362. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  363. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  364. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  365. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  366. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  367. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  368. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  369. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
  370. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
  371. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  372. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  373. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  374. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
  375. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  376. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  377. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  378. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  379. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  380. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  381. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  382. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  383. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  384. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  385. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  386. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  387. package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
  388. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  389. package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
  390. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  391. package/deps/rocksdb/rocksdb/util/compression.h +119 -35
  392. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  393. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  394. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  395. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  396. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  397. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  398. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  399. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  400. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  401. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  402. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  403. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  404. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  405. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  406. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  407. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  408. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  409. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +10 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
  415. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
  416. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  417. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  418. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  419. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  420. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  427. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  428. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  429. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
  430. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  431. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  432. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
  433. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  434. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +12 -3
  435. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  436. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  437. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  438. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  439. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  440. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  441. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  442. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  443. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  444. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
  445. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  446. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
  447. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  448. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  449. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
  450. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
  451. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
  452. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  453. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
  454. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  455. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
  456. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  457. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  458. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
  459. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  460. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
  461. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  462. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  463. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  464. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  465. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
  466. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  467. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  468. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +111 -14
  469. package/deps/rocksdb/rocksdb.gyp +6 -2
  470. package/index.js +0 -8
  471. package/package.json +1 -1
  472. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  473. package/prebuilds/linux-x64/node.napi.node +0 -0
  474. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  475. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  476. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  477. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  478. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  479. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  480. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  481. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  482. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  483. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -9,6 +9,9 @@
9
9
  #ifdef _MSC_VER
10
10
  #include <intrin.h>
11
11
  #endif
12
+ #ifdef __BMI2__
13
+ #include <immintrin.h>
14
+ #endif
12
15
 
13
16
  #include <cstdint>
14
17
  #include <type_traits>
@@ -20,11 +23,33 @@ ASSERT_FEATURE_COMPAT_HEADER();
20
23
 
21
24
  namespace ROCKSDB_NAMESPACE {
22
25
 
26
+ // Fast implementation of extracting the bottom n bits of an integer.
27
+ // To ensure fast implementation, undefined if n bits is full width or more.
28
+ template <typename T>
29
+ inline T BottomNBits(T v, int nbits) {
30
+ static_assert(std::is_integral_v<T>, "non-integral type");
31
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
32
+ assert(nbits >= 0);
33
+ assert(nbits < int{8 * sizeof(T)});
34
+ #ifdef __BMI2__
35
+ if constexpr (sizeof(T) <= 4) {
36
+ return static_cast<T>(_bzhi_u32(static_cast<uint32_t>(v), nbits));
37
+ }
38
+ if constexpr (sizeof(T) <= 8) {
39
+ return static_cast<T>(_bzhi_u64(static_cast<uint64_t>(v), nbits));
40
+ }
41
+ #endif
42
+ // Newer compilers compile this down to bzhi on x86, but some older
43
+ // ones don't, thus the need for the intrinsic above.
44
+ return static_cast<T>(v & ((T{1} << nbits) - 1));
45
+ }
46
+
23
47
  // Fast implementation of floor(log2(v)). Undefined for 0 or negative
24
48
  // numbers (in case of signed type).
25
49
  template <typename T>
26
50
  inline int FloorLog2(T v) {
27
- static_assert(std::is_integral<T>::value, "non-integral type");
51
+ static_assert(std::is_integral_v<T>, "non-integral type");
52
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
28
53
  assert(v > 0);
29
54
  #ifdef _MSC_VER
30
55
  static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
@@ -63,6 +88,8 @@ inline int FloorLog2(T v) {
63
88
  // Constexpr version of FloorLog2
64
89
  template <typename T>
65
90
  constexpr int ConstexprFloorLog2(T v) {
91
+ // NOTE: not checking is_integral so that this works with Unsigned128
92
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
66
93
  int rv = 0;
67
94
  while (v > T{1}) {
68
95
  ++rv;
@@ -74,7 +101,8 @@ constexpr int ConstexprFloorLog2(T v) {
74
101
  // Number of low-order zero bits before the first 1 bit. Undefined for 0.
75
102
  template <typename T>
76
103
  inline int CountTrailingZeroBits(T v) {
77
- static_assert(std::is_integral<T>::value, "non-integral type");
104
+ static_assert(std::is_integral_v<T>, "non-integral type");
105
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
78
106
  assert(v != 0);
79
107
  #ifdef _MSC_VER
80
108
  static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
@@ -115,6 +143,9 @@ namespace detail {
115
143
 
116
144
  template <typename T>
117
145
  int BitsSetToOneFallback(T v) {
146
+ static_assert(std::is_integral_v<T>, "non-integral type");
147
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
148
+
118
149
  const int kBits = static_cast<int>(sizeof(T)) * 8;
119
150
  static_assert((kBits & (kBits - 1)) == 0, "must be power of two bits");
120
151
  // we static_cast these bit patterns in order to truncate them to the correct
@@ -140,7 +171,9 @@ int BitsSetToOneFallback(T v) {
140
171
  // Number of bits set to 1. Also known as "population count".
141
172
  template <typename T>
142
173
  inline int BitsSetToOne(T v) {
143
- static_assert(std::is_integral<T>::value, "non-integral type");
174
+ static_assert(std::is_integral_v<T>, "non-integral type");
175
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
176
+
144
177
  #ifdef _MSC_VER
145
178
  static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
146
179
  if (sizeof(T) < sizeof(uint32_t)) {
@@ -192,7 +225,9 @@ inline int BitsSetToOne(T v) {
192
225
 
193
226
  template <typename T>
194
227
  inline int BitParity(T v) {
195
- static_assert(std::is_integral<T>::value, "non-integral type");
228
+ static_assert(std::is_integral_v<T>, "non-integral type");
229
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
230
+
196
231
  #ifdef _MSC_VER
197
232
  // bit parity == oddness of popcount
198
233
  return BitsSetToOne(v) & 1;
@@ -214,7 +249,8 @@ inline int BitParity(T v) {
214
249
  // encode/decode big endian.
215
250
  template <typename T>
216
251
  inline T EndianSwapValue(T v) {
217
- static_assert(std::is_integral<T>::value, "non-integral type");
252
+ static_assert(std::is_integral_v<T>, "non-integral type");
253
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
218
254
 
219
255
  #ifdef _MSC_VER
220
256
  if (sizeof(T) == 2) {
@@ -244,6 +280,9 @@ inline T EndianSwapValue(T v) {
244
280
  // Reverses the order of bits in an integral value
245
281
  template <typename T>
246
282
  inline T ReverseBits(T v) {
283
+ static_assert(std::is_integral_v<T>, "non-integral type");
284
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
285
+
247
286
  T r = EndianSwapValue(v);
248
287
  const T kHighestByte = T{1} << ((sizeof(T) - 1) * 8);
249
288
  const T kEveryByte = kHighestByte | (kHighestByte / 255);
@@ -277,7 +316,8 @@ inline T ReverseBits(T v) {
277
316
  // is that all square sub-matrices that include the top row are invertible.
278
317
  template <typename T>
279
318
  inline T DownwardInvolution(T v) {
280
- static_assert(std::is_integral<T>::value, "non-integral type");
319
+ static_assert(std::is_integral_v<T>, "non-integral type");
320
+ static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
281
321
  static_assert(sizeof(T) <= 8, "only supported up to 64 bits");
282
322
 
283
323
  uint64_t r = static_cast<uint64_t>(v);
@@ -296,4 +336,16 @@ inline T DownwardInvolution(T v) {
296
336
  return static_cast<T>(r);
297
337
  }
298
338
 
339
+ // Bitwise-And with typing that allows you to avoid writing an explicit cast
340
+ // to the smaller type, or the type of the right parameter if same size.
341
+ template <typename A, typename B>
342
+ inline std::conditional_t<sizeof(A) < sizeof(B), A, B> BitwiseAnd(A a, B b) {
343
+ static_assert(std::is_integral_v<A>, "non-integral type");
344
+ static_assert(std::is_integral_v<B>, "non-integral type");
345
+ static_assert(!std::is_reference_v<A>, "use std::remove_reference_t");
346
+ static_assert(!std::is_reference_v<B>, "use std::remove_reference_t");
347
+ using Smaller = std::conditional_t<sizeof(A) < sizeof(B), A, B>;
348
+ return static_cast<Smaller>(a & b);
349
+ }
350
+
299
351
  } // namespace ROCKSDB_NAMESPACE
@@ -41,13 +41,13 @@ struct Unsigned128 {
41
41
  hi = upper;
42
42
  }
43
43
 
44
- explicit operator uint64_t() { return lo; }
45
-
46
- explicit operator uint32_t() { return static_cast<uint32_t>(lo); }
47
-
48
- explicit operator uint16_t() { return static_cast<uint16_t>(lo); }
49
-
50
- explicit operator uint8_t() { return static_cast<uint8_t>(lo); }
44
+ // Convert to any integer 64 bits or less.
45
+ template <typename T,
46
+ typename = std::enable_if_t<std::is_integral_v<T> &&
47
+ sizeof(T) <= sizeof(uint64_t)> >
48
+ explicit operator T() {
49
+ return static_cast<T>(lo);
50
+ }
51
51
  };
52
52
 
53
53
  inline Unsigned128 operator<<(const Unsigned128& lhs, unsigned shift) {
@@ -190,6 +190,16 @@ inline Unsigned128 Multiply64to128(uint64_t a, uint64_t b) {
190
190
  #endif
191
191
  }
192
192
 
193
+ template <>
194
+ inline Unsigned128 BottomNBits(Unsigned128 v, int nbits) {
195
+ if (nbits < 64) {
196
+ return BottomNBits(Lower64of128(v), nbits);
197
+ } else {
198
+ return (Unsigned128{BottomNBits(Upper64of128(v), nbits - 64)} << 64) |
199
+ Lower64of128(v);
200
+ }
201
+ }
202
+
193
203
  template <>
194
204
  inline int FloorLog2(Unsigned128 v) {
195
205
  if (Upper64of128(v) == 0) {
@@ -236,6 +246,18 @@ inline Unsigned128 DownwardInvolution(Unsigned128 v) {
236
246
  DownwardInvolution(Upper64of128(v) ^ Lower64of128(v));
237
247
  }
238
248
 
249
+ template <typename A>
250
+ inline std::remove_reference_t<A> BitwiseAnd(A a, Unsigned128 b) {
251
+ static_assert(sizeof(A) <= sizeof(Unsigned128));
252
+ return static_cast<A>(a & b);
253
+ }
254
+
255
+ template <typename B>
256
+ inline std::remove_reference_t<B> BitwiseAnd(Unsigned128 a, B b) {
257
+ static_assert(sizeof(B) <= sizeof(Unsigned128));
258
+ return static_cast<B>(a & b);
259
+ }
260
+
239
261
  template <typename T>
240
262
  struct IsUnsignedUpTo128
241
263
  : std::integral_constant<bool, std::is_unsigned<T>::value ||
@@ -12,10 +12,13 @@
12
12
 
13
13
  #include <atomic>
14
14
  #include <functional>
15
+ #include <memory>
15
16
  #include <mutex>
16
17
  #include <thread>
17
18
 
18
19
  #include "port/port.h"
20
+ #include "util/fastrange.h"
21
+ #include "util/hash.h"
19
22
 
20
23
  namespace ROCKSDB_NAMESPACE {
21
24
 
@@ -129,10 +132,25 @@ class SpinMutex {
129
132
  std::atomic<bool> locked_;
130
133
  };
131
134
 
132
- // We want to prevent false sharing
135
+ // For preventing false sharing, especially for mutexes.
136
+ // NOTE: if a mutex is less than half the size of a cache line, it would
137
+ // make more sense for Striped structure below to pack more than one mutex
138
+ // into each cache line, as this would only reduce contention for the same
139
+ // amount of space and cache sharing. However, a mutex is often 40 bytes out
140
+ // of a 64 byte cache line.
133
141
  template <class T>
134
- struct ALIGN_AS(CACHE_LINE_SIZE) LockData {
135
- T lock_;
142
+ struct ALIGN_AS(CACHE_LINE_SIZE) CacheAlignedWrapper {
143
+ T obj_;
144
+ };
145
+ template <class T>
146
+ struct Unwrap {
147
+ using type = T;
148
+ static type &Go(T &t) { return t; }
149
+ };
150
+ template <class T>
151
+ struct Unwrap<CacheAlignedWrapper<T>> {
152
+ using type = T;
153
+ static type &Go(CacheAlignedWrapper<T> &t) { return t.obj_; }
136
154
  };
137
155
 
138
156
  //
@@ -144,38 +162,28 @@ struct ALIGN_AS(CACHE_LINE_SIZE) LockData {
144
162
  // single lock and allowing independent operations to lock different stripes and
145
163
  // proceed concurrently, instead of creating contention for a single lock.
146
164
  //
147
- template <class T, class P>
165
+ template <class T, class Key = Slice, class Hash = SliceNPHasher64>
148
166
  class Striped {
149
167
  public:
150
- Striped(size_t stripes, std::function<uint64_t(const P &)> hash)
151
- : stripes_(stripes), hash_(hash) {
152
- locks_ = reinterpret_cast<LockData<T> *>(
153
- port::cacheline_aligned_alloc(sizeof(LockData<T>) * stripes));
154
- for (size_t i = 0; i < stripes; i++) {
155
- new (&locks_[i]) LockData<T>();
156
- }
157
- }
168
+ explicit Striped(size_t stripe_count)
169
+ : stripe_count_(stripe_count), data_(new T[stripe_count]) {}
158
170
 
159
- virtual ~Striped() {
160
- if (locks_ != nullptr) {
161
- assert(stripes_ > 0);
162
- for (size_t i = 0; i < stripes_; i++) {
163
- locks_[i].~LockData<T>();
164
- }
165
- port::cacheline_aligned_free(locks_);
166
- }
171
+ using Unwrapped = typename Unwrap<T>::type;
172
+ Unwrapped &Get(const Key &key, uint64_t seed = 0) {
173
+ size_t index = FastRangeGeneric(hash_(key, seed), stripe_count_);
174
+ return Unwrap<T>::Go(data_[index]);
167
175
  }
168
176
 
169
- T *get(const P &key) {
170
- uint64_t h = hash_(key);
171
- size_t index = h % stripes_;
172
- return &reinterpret_cast<LockData<T> *>(&locks_[index])->lock_;
177
+ size_t ApproximateMemoryUsage() const {
178
+ // NOTE: could use malloc_usable_size() here, but that could count unmapped
179
+ // pages and could mess up unit test OccLockBucketsTest::CacheAligned
180
+ return sizeof(*this) + stripe_count_ * sizeof(T);
173
181
  }
174
182
 
175
183
  private:
176
- size_t stripes_;
177
- LockData<T> *locks_;
178
- std::function<uint64_t(const P &)> hash_;
184
+ size_t stripe_count_;
185
+ std::unique_ptr<T[]> data_;
186
+ Hash hash_;
179
187
  };
180
188
 
181
189
  } // namespace ROCKSDB_NAMESPACE
@@ -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) {
@@ -8,6 +8,7 @@
8
8
 
9
9
  #if USE_COROUTINES
10
10
  #include <atomic>
11
+ #include <queue>
11
12
 
12
13
  #include "folly/CPortability.h"
13
14
  #include "folly/CppAttributes.h"
@@ -243,6 +243,36 @@ TEST_F(SmallEnumSetTest, SmallEnumSetTest2) {
243
243
  }
244
244
  }
245
245
 
246
+ // ***************************************************************** //
247
+ // Unit test for Status
248
+ TEST(StatusTest, Update) {
249
+ const Status ok = Status::OK();
250
+ const Status inc = Status::Incomplete("blah");
251
+ const Status notf = Status::NotFound("meow");
252
+
253
+ Status s = ok;
254
+ ASSERT_TRUE(s.UpdateIfOk(Status::Corruption("bad")).IsCorruption());
255
+ ASSERT_TRUE(s.IsCorruption());
256
+
257
+ s = ok;
258
+ ASSERT_TRUE(s.UpdateIfOk(Status::OK()).ok());
259
+ ASSERT_TRUE(s.UpdateIfOk(ok).ok());
260
+ ASSERT_TRUE(s.ok());
261
+
262
+ ASSERT_TRUE(s.UpdateIfOk(inc).IsIncomplete());
263
+ ASSERT_TRUE(s.IsIncomplete());
264
+
265
+ ASSERT_TRUE(s.UpdateIfOk(notf).IsIncomplete());
266
+ ASSERT_TRUE(s.UpdateIfOk(ok).IsIncomplete());
267
+ ASSERT_TRUE(s.IsIncomplete());
268
+
269
+ // Keeps left-most non-OK status
270
+ s = ok;
271
+ ASSERT_TRUE(
272
+ s.UpdateIfOk(Status()).UpdateIfOk(notf).UpdateIfOk(inc).IsNotFound());
273
+ ASSERT_TRUE(s.IsNotFound());
274
+ }
275
+
246
276
  } // namespace ROCKSDB_NAMESPACE
247
277
 
248
278
  int main(int argc, char** argv) {