@nxtedition/rocksdb 9.0.0 → 10.0.0

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 (307) hide show
  1. package/binding.cc +244 -177
  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 +202 -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 +314 -25
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +29 -4
  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 +38 -55
  293. package/package.json +4 -4
  294. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  295. package/util.h +7 -1
  296. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  297. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  298. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  299. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  300. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  301. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  302. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  303. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  304. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  305. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
  306. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  307. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -534,7 +534,7 @@ TYPED_TEST(ClockCacheTest, Limits) {
534
534
  // (Cleverly using mostly zero-charge entries, but some non-zero to
535
535
  // verify usage tracking on detached entries.)
536
536
  {
537
- size_t n = shard.GetTableAddressCount() + 1;
537
+ size_t n = kCapacity * 5 + 1;
538
538
  std::unique_ptr<HandleImpl* []> ha { new HandleImpl* [n] {} };
539
539
  Status s;
540
540
  for (size_t i = 0; i < n && s.ok(); ++i) {
@@ -560,6 +560,8 @@ TYPED_TEST(ClockCacheTest, Limits) {
560
560
  EXPECT_OK(s);
561
561
  }
562
562
 
563
+ EXPECT_EQ(shard.GetOccupancyCount(), shard.GetOccupancyLimit());
564
+
563
565
  // Regardless, we didn't allow table to actually get full
564
566
  EXPECT_LT(shard.GetOccupancyCount(), shard.GetTableAddressCount());
565
567
 
@@ -981,13 +983,14 @@ class TestSecondaryCache : public SecondaryCache {
981
983
 
982
984
  using ResultMap = std::unordered_map<std::string, ResultType>;
983
985
 
984
- explicit TestSecondaryCache(size_t capacity)
986
+ explicit TestSecondaryCache(size_t capacity, bool insert_saved = false)
985
987
  : cache_(NewLRUCache(capacity, 0, false, 0.5 /* high_pri_pool_ratio */,
986
988
  nullptr, kDefaultToAdaptiveMutex,
987
989
  kDontChargeCacheMetadata)),
988
990
  num_inserts_(0),
989
991
  num_lookups_(0),
990
- inject_failure_(false) {}
992
+ inject_failure_(false),
993
+ insert_saved_(insert_saved) {}
991
994
 
992
995
  const char* Name() const override { return "TestSecondaryCache"; }
993
996
 
@@ -1018,6 +1021,17 @@ class TestSecondaryCache : public SecondaryCache {
1018
1021
  return cache_.Insert(key, buf, size);
1019
1022
  }
1020
1023
 
1024
+ Status InsertSaved(const Slice& key, const Slice& saved,
1025
+ CompressionType /*type*/ = kNoCompression,
1026
+ CacheTier /*source*/ = CacheTier::kVolatileTier) override {
1027
+ if (insert_saved_) {
1028
+ return Insert(key, const_cast<Slice*>(&saved), &kSliceCacheItemHelper,
1029
+ /*force_insert=*/true);
1030
+ } else {
1031
+ return Status::OK();
1032
+ }
1033
+ }
1034
+
1021
1035
  std::unique_ptr<SecondaryCacheResultHandle> Lookup(
1022
1036
  const Slice& key, const Cache::CacheItemHelper* helper,
1023
1037
  Cache::CreateContext* create_context, bool /*wait*/,
@@ -1046,7 +1060,8 @@ class TestSecondaryCache : public SecondaryCache {
1046
1060
  char* ptr = cache_.Value(handle);
1047
1061
  size_t size = DecodeFixed64(ptr);
1048
1062
  ptr += sizeof(uint64_t);
1049
- s = helper->create_cb(Slice(ptr, size), create_context,
1063
+ s = helper->create_cb(Slice(ptr, size), kNoCompression,
1064
+ CacheTier::kVolatileTier, create_context,
1050
1065
  /*alloc*/ nullptr, &value, &charge);
1051
1066
  }
1052
1067
  if (s.ok()) {
@@ -1135,6 +1150,7 @@ class TestSecondaryCache : public SecondaryCache {
1135
1150
  uint32_t num_inserts_;
1136
1151
  uint32_t num_lookups_;
1137
1152
  bool inject_failure_;
1153
+ bool insert_saved_;
1138
1154
  std::string ckey_prefix_;
1139
1155
  ResultMap result_map_;
1140
1156
  };
@@ -1165,7 +1181,7 @@ INSTANTIATE_TEST_CASE_P(DBSecondaryCacheTest, DBSecondaryCacheTest,
1165
1181
 
1166
1182
  TEST_P(BasicSecondaryCacheTest, BasicTest) {
1167
1183
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1168
- std::make_shared<TestSecondaryCache>(4096);
1184
+ std::make_shared<TestSecondaryCache>(4096, true);
1169
1185
  std::shared_ptr<Cache> cache =
1170
1186
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1171
1187
  false /* strict_capacity_limit */, secondary_cache);
@@ -1222,7 +1238,7 @@ TEST_P(BasicSecondaryCacheTest, BasicTest) {
1222
1238
 
1223
1239
  TEST_P(BasicSecondaryCacheTest, StatsTest) {
1224
1240
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1225
- std::make_shared<TestSecondaryCache>(4096);
1241
+ std::make_shared<TestSecondaryCache>(4096, true);
1226
1242
  std::shared_ptr<Cache> cache =
1227
1243
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1228
1244
  false /* strict_capacity_limit */, secondary_cache);
@@ -1276,7 +1292,7 @@ TEST_P(BasicSecondaryCacheTest, StatsTest) {
1276
1292
 
1277
1293
  TEST_P(BasicSecondaryCacheTest, BasicFailTest) {
1278
1294
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1279
- std::make_shared<TestSecondaryCache>(2048);
1295
+ std::make_shared<TestSecondaryCache>(2048, true);
1280
1296
  std::shared_ptr<Cache> cache =
1281
1297
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1282
1298
  false /* strict_capacity_limit */, secondary_cache);
@@ -1318,7 +1334,7 @@ TEST_P(BasicSecondaryCacheTest, BasicFailTest) {
1318
1334
 
1319
1335
  TEST_P(BasicSecondaryCacheTest, SaveFailTest) {
1320
1336
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1321
- std::make_shared<TestSecondaryCache>(2048);
1337
+ std::make_shared<TestSecondaryCache>(2048, true);
1322
1338
  std::shared_ptr<Cache> cache =
1323
1339
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1324
1340
  false /* strict_capacity_limit */, secondary_cache);
@@ -1359,7 +1375,7 @@ TEST_P(BasicSecondaryCacheTest, SaveFailTest) {
1359
1375
 
1360
1376
  TEST_P(BasicSecondaryCacheTest, CreateFailTest) {
1361
1377
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1362
- std::make_shared<TestSecondaryCache>(2048);
1378
+ std::make_shared<TestSecondaryCache>(2048, true);
1363
1379
  std::shared_ptr<Cache> cache =
1364
1380
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1365
1381
  false /* strict_capacity_limit */, secondary_cache);
@@ -1400,7 +1416,7 @@ TEST_P(BasicSecondaryCacheTest, CreateFailTest) {
1400
1416
  TEST_P(BasicSecondaryCacheTest, FullCapacityTest) {
1401
1417
  for (bool strict_capacity_limit : {false, true}) {
1402
1418
  std::shared_ptr<TestSecondaryCache> secondary_cache =
1403
- std::make_shared<TestSecondaryCache>(2048);
1419
+ std::make_shared<TestSecondaryCache>(2048, true);
1404
1420
  std::shared_ptr<Cache> cache =
1405
1421
  NewCache(1024 /* capacity */, 0 /* num_shard_bits */,
1406
1422
  strict_capacity_limit, secondary_cache);
@@ -2019,8 +2035,9 @@ class CacheWithStats : public CacheWrapper {
2019
2035
 
2020
2036
  Status Insert(const Slice& key, Cache::ObjectPtr value,
2021
2037
  const CacheItemHelper* helper, size_t charge,
2022
- Handle** handle = nullptr,
2023
- Priority priority = Priority::LOW) override {
2038
+ Handle** handle = nullptr, Priority priority = Priority::LOW,
2039
+ const Slice& /*compressed*/ = Slice(),
2040
+ CompressionType /*type*/ = kNoCompression) override {
2024
2041
  insert_count_++;
2025
2042
  return target_->Insert(key, value, helper, charge, handle, priority);
2026
2043
  }
@@ -2113,7 +2130,7 @@ TEST_P(DBSecondaryCacheTest, LRUCacheDumpLoadBasic) {
2113
2130
  // we have a new cache it is empty, then, before we do the Get, we do the
2114
2131
  // dumpload
2115
2132
  std::shared_ptr<TestSecondaryCache> secondary_cache =
2116
- std::make_shared<TestSecondaryCache>(2048 * 1024);
2133
+ std::make_shared<TestSecondaryCache>(2048 * 1024, true);
2117
2134
  // This time with secondary cache
2118
2135
  base_cache = NewCache(1024 * 1024 /* capacity */, 0 /* num_shard_bits */,
2119
2136
  false /* strict_capacity_limit */, secondary_cache);
@@ -2269,7 +2286,7 @@ TEST_P(DBSecondaryCacheTest, LRUCacheDumpLoadWithFilter) {
2269
2286
  // we have a new cache it is empty, then, before we do the Get, we do the
2270
2287
  // dumpload
2271
2288
  std::shared_ptr<TestSecondaryCache> secondary_cache =
2272
- std::make_shared<TestSecondaryCache>(2048 * 1024);
2289
+ std::make_shared<TestSecondaryCache>(2048 * 1024, true);
2273
2290
  // This time with secondary_cache
2274
2291
  base_cache = NewCache(1024 * 1024 /* capacity */, 0 /* num_shard_bits */,
2275
2292
  false /* strict_capacity_limit */, secondary_cache);
@@ -9,37 +9,4 @@
9
9
 
10
10
  namespace ROCKSDB_NAMESPACE {
11
11
 
12
- namespace {
13
-
14
- void NoopDelete(Cache::ObjectPtr, MemoryAllocator*) {}
15
-
16
- size_t SliceSize(Cache::ObjectPtr obj) {
17
- return static_cast<Slice*>(obj)->size();
18
- }
19
-
20
- Status SliceSaveTo(Cache::ObjectPtr from_obj, size_t from_offset, size_t length,
21
- char* out) {
22
- const Slice& slice = *static_cast<Slice*>(from_obj);
23
- std::memcpy(out, slice.data() + from_offset, length);
24
- return Status::OK();
25
- }
26
-
27
- Status FailCreate(const Slice&, Cache::CreateContext*, MemoryAllocator*,
28
- Cache::ObjectPtr*, size_t*) {
29
- return Status::NotSupported("Only for dumping data into SecondaryCache");
30
- }
31
-
32
- } // namespace
33
-
34
- Status SecondaryCache::InsertSaved(const Slice& key, const Slice& saved) {
35
- static Cache::CacheItemHelper helper_no_secondary{CacheEntryRole::kMisc,
36
- &NoopDelete};
37
- static Cache::CacheItemHelper helper{
38
- CacheEntryRole::kMisc, &NoopDelete, &SliceSize,
39
- &SliceSaveTo, &FailCreate, &helper_no_secondary};
40
- // NOTE: depends on Insert() being synchronous, not keeping pointer `&saved`
41
- return Insert(key, const_cast<Slice*>(&saved), &helper,
42
- /*force_insert=*/true);
43
- }
44
-
45
12
  } // namespace ROCKSDB_NAMESPACE
@@ -5,7 +5,11 @@
5
5
 
6
6
  #include "cache/secondary_cache_adapter.h"
7
7
 
8
+ #include <atomic>
9
+
10
+ #include "cache/tiered_secondary_cache.h"
8
11
  #include "monitoring/perf_context_imp.h"
12
+ #include "test_util/sync_point.h"
9
13
  #include "util/cast_util.h"
10
14
 
11
15
  namespace ROCKSDB_NAMESPACE {
@@ -17,6 +21,7 @@ struct Dummy {
17
21
  };
18
22
  const Dummy kDummy{};
19
23
  Cache::ObjectPtr const kDummyObj = const_cast<Dummy*>(&kDummy);
24
+ const char* kTieredCacheName = "TieredCache";
20
25
  } // namespace
21
26
 
22
27
  // When CacheWithSecondaryAdapter is constructed with the distribute_cache_res
@@ -78,7 +83,10 @@ CacheWithSecondaryAdapter::CacheWithSecondaryAdapter(
78
83
  : CacheWrapper(std::move(target)),
79
84
  secondary_cache_(std::move(secondary_cache)),
80
85
  adm_policy_(adm_policy),
81
- distribute_cache_res_(distribute_cache_res) {
86
+ distribute_cache_res_(distribute_cache_res),
87
+ placeholder_usage_(0),
88
+ reserved_usage_(0),
89
+ sec_reserved_(0) {
82
90
  target_->SetEvictionCallback(
83
91
  [this](const Slice& key, Handle* handle, bool was_hit) {
84
92
  return EvictionHandler(key, handle, was_hit);
@@ -111,7 +119,7 @@ CacheWithSecondaryAdapter::~CacheWithSecondaryAdapter() {
111
119
  size_t sec_capacity = 0;
112
120
  Status s = secondary_cache_->GetCapacity(sec_capacity);
113
121
  assert(s.ok());
114
- assert(pri_cache_res_->GetTotalReservedCacheSize() == sec_capacity);
122
+ assert(pri_cache_res_->GetTotalMemoryUsed() == sec_capacity);
115
123
  }
116
124
  #endif // NDEBUG
117
125
  }
@@ -119,7 +127,8 @@ CacheWithSecondaryAdapter::~CacheWithSecondaryAdapter() {
119
127
  bool CacheWithSecondaryAdapter::EvictionHandler(const Slice& key,
120
128
  Handle* handle, bool was_hit) {
121
129
  auto helper = GetCacheItemHelper(handle);
122
- if (helper->IsSecondaryCacheCompatible()) {
130
+ if (helper->IsSecondaryCacheCompatible() &&
131
+ adm_policy_ != TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
123
132
  auto obj = target_->Value(handle);
124
133
  // Ignore dummy entry
125
134
  if (obj != kDummyObj) {
@@ -225,14 +234,42 @@ Cache::Handle* CacheWithSecondaryAdapter::Promote(
225
234
  Status CacheWithSecondaryAdapter::Insert(const Slice& key, ObjectPtr value,
226
235
  const CacheItemHelper* helper,
227
236
  size_t charge, Handle** handle,
228
- Priority priority) {
237
+ Priority priority,
238
+ const Slice& compressed_value,
239
+ CompressionType type) {
229
240
  Status s = target_->Insert(key, value, helper, charge, handle, priority);
230
- if (s.ok() && value == nullptr && distribute_cache_res_) {
231
- size_t sec_charge = static_cast<size_t>(charge * (sec_cache_res_ratio_));
232
- s = secondary_cache_->Deflate(sec_charge);
233
- assert(s.ok());
234
- s = pri_cache_res_->UpdateCacheReservation(sec_charge, /*increase=*/false);
235
- assert(s.ok());
241
+ if (s.ok() && value == nullptr && distribute_cache_res_ && handle) {
242
+ charge = target_->GetCharge(*handle);
243
+
244
+ MutexLock l(&cache_res_mutex_);
245
+ placeholder_usage_ += charge;
246
+ // Check if total placeholder reservation is more than the overall
247
+ // cache capacity. If it is, then we don't try to charge the
248
+ // secondary cache because we don't want to overcharge it (beyond
249
+ // its capacity).
250
+ // In order to make this a bit more lightweight, we also check if
251
+ // the difference between placeholder_usage_ and reserved_usage_ is
252
+ // atleast kReservationChunkSize and avoid any adjustments if not.
253
+ if ((placeholder_usage_ <= target_->GetCapacity()) &&
254
+ ((placeholder_usage_ - reserved_usage_) >= kReservationChunkSize)) {
255
+ reserved_usage_ = placeholder_usage_ & ~(kReservationChunkSize - 1);
256
+ size_t new_sec_reserved =
257
+ static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
258
+ size_t sec_charge = new_sec_reserved - sec_reserved_;
259
+ s = secondary_cache_->Deflate(sec_charge);
260
+ assert(s.ok());
261
+ s = pri_cache_res_->UpdateCacheReservation(sec_charge,
262
+ /*increase=*/false);
263
+ assert(s.ok());
264
+ sec_reserved_ += sec_charge;
265
+ }
266
+ }
267
+ // Warm up the secondary cache with the compressed block. The secondary
268
+ // cache may choose to ignore it based on the admission policy.
269
+ if (value != nullptr && !compressed_value.empty() &&
270
+ adm_policy_ == TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
271
+ Status status = secondary_cache_->InsertSaved(key, compressed_value, type);
272
+ assert(status.ok() || status.IsNotSupported());
236
273
  }
237
274
 
238
275
  return s;
@@ -270,11 +307,27 @@ bool CacheWithSecondaryAdapter::Release(Handle* handle,
270
307
  ObjectPtr v = target_->Value(handle);
271
308
  if (v == nullptr && distribute_cache_res_) {
272
309
  size_t charge = target_->GetCharge(handle);
273
- size_t sec_charge = static_cast<size_t>(charge * (sec_cache_res_ratio_));
274
- Status s = secondary_cache_->Inflate(sec_charge);
275
- assert(s.ok());
276
- s = pri_cache_res_->UpdateCacheReservation(sec_charge, /*increase=*/true);
277
- assert(s.ok());
310
+
311
+ MutexLock l(&cache_res_mutex_);
312
+ placeholder_usage_ -= charge;
313
+ // Check if total placeholder reservation is more than the overall
314
+ // cache capacity. If it is, then we do nothing as reserved_usage_ must
315
+ // be already maxed out
316
+ if ((placeholder_usage_ <= target_->GetCapacity()) &&
317
+ (placeholder_usage_ < reserved_usage_)) {
318
+ // Adjust reserved_usage_ in chunks of kReservationChunkSize, so
319
+ // we don't hit this slow path too often.
320
+ reserved_usage_ = placeholder_usage_ & ~(kReservationChunkSize - 1);
321
+ size_t new_sec_reserved =
322
+ static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
323
+ size_t sec_charge = sec_reserved_ - new_sec_reserved;
324
+ Status s = secondary_cache_->Inflate(sec_charge);
325
+ assert(s.ok());
326
+ s = pri_cache_res_->UpdateCacheReservation(sec_charge,
327
+ /*increase=*/true);
328
+ assert(s.ok());
329
+ sec_reserved_ -= sec_charge;
330
+ }
278
331
  }
279
332
  }
280
333
  return target_->Release(handle, erase_if_last_ref);
@@ -406,41 +459,277 @@ std::string CacheWithSecondaryAdapter::GetPrintableOptions() const {
406
459
  }
407
460
 
408
461
  const char* CacheWithSecondaryAdapter::Name() const {
409
- // To the user, at least for now, configure the underlying cache with
410
- // a secondary cache. So we pretend to be that cache
411
- return target_->Name();
462
+ if (distribute_cache_res_) {
463
+ return kTieredCacheName;
464
+ } else {
465
+ // To the user, at least for now, configure the underlying cache with
466
+ // a secondary cache. So we pretend to be that cache
467
+ return target_->Name();
468
+ }
412
469
  }
413
470
 
414
- std::shared_ptr<Cache> NewTieredVolatileCache(
415
- TieredVolatileCacheOptions& opts) {
416
- if (!opts.cache_opts) {
417
- return nullptr;
471
+ // Update the total cache capacity. If we're distributing cache reservations
472
+ // to both primary and secondary, then update the pri_cache_res_reservation
473
+ // as well. At the moment, we don't have a good way of handling the case
474
+ // where the new capacity < total cache reservations.
475
+ void CacheWithSecondaryAdapter::SetCapacity(size_t capacity) {
476
+ size_t sec_capacity = static_cast<size_t>(
477
+ capacity * (distribute_cache_res_ ? sec_cache_res_ratio_ : 0.0));
478
+ size_t old_sec_capacity = 0;
479
+
480
+ if (distribute_cache_res_) {
481
+ MutexLock m(&cache_res_mutex_);
482
+
483
+ Status s = secondary_cache_->GetCapacity(old_sec_capacity);
484
+ if (!s.ok()) {
485
+ return;
486
+ }
487
+ if (old_sec_capacity > sec_capacity) {
488
+ // We're shrinking the cache. We do things in the following order to
489
+ // avoid a temporary spike in usage over the configured capacity -
490
+ // 1. Lower the secondary cache capacity
491
+ // 2. Credit an equal amount (by decreasing pri_cache_res_) to the
492
+ // primary cache
493
+ // 3. Decrease the primary cache capacity to the total budget
494
+ s = secondary_cache_->SetCapacity(sec_capacity);
495
+ if (s.ok()) {
496
+ if (placeholder_usage_ > capacity) {
497
+ // Adjust reserved_usage_ down
498
+ reserved_usage_ = capacity & ~(kReservationChunkSize - 1);
499
+ }
500
+ size_t new_sec_reserved =
501
+ static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
502
+ s = pri_cache_res_->UpdateCacheReservation(
503
+ (old_sec_capacity - sec_capacity) -
504
+ (sec_reserved_ - new_sec_reserved),
505
+ /*increase=*/false);
506
+ sec_reserved_ = new_sec_reserved;
507
+ assert(s.ok());
508
+ target_->SetCapacity(capacity);
509
+ }
510
+ } else {
511
+ // We're expanding the cache. Do it in the following order to avoid
512
+ // unnecessary evictions -
513
+ // 1. Increase the primary cache capacity to total budget
514
+ // 2. Reserve additional memory in primary on behalf of secondary (by
515
+ // increasing pri_cache_res_ reservation)
516
+ // 3. Increase secondary cache capacity
517
+ target_->SetCapacity(capacity);
518
+ s = pri_cache_res_->UpdateCacheReservation(
519
+ sec_capacity - old_sec_capacity,
520
+ /*increase=*/true);
521
+ assert(s.ok());
522
+ s = secondary_cache_->SetCapacity(sec_capacity);
523
+ assert(s.ok());
524
+ }
525
+ } else {
526
+ // No cache reservation distribution. Just set the primary cache capacity.
527
+ target_->SetCapacity(capacity);
528
+ }
529
+ }
530
+
531
+ Status CacheWithSecondaryAdapter::GetSecondaryCacheCapacity(
532
+ size_t& size) const {
533
+ return secondary_cache_->GetCapacity(size);
534
+ }
535
+
536
+ Status CacheWithSecondaryAdapter::GetSecondaryCachePinnedUsage(
537
+ size_t& size) const {
538
+ Status s;
539
+ if (distribute_cache_res_) {
540
+ MutexLock m(&cache_res_mutex_);
541
+ size_t capacity = 0;
542
+ s = secondary_cache_->GetCapacity(capacity);
543
+ if (s.ok()) {
544
+ size = capacity - pri_cache_res_->GetTotalMemoryUsed();
545
+ } else {
546
+ size = 0;
547
+ }
548
+ } else {
549
+ size = 0;
550
+ }
551
+ return s;
552
+ }
553
+
554
+ // Update the secondary/primary allocation ratio (remember, the primary
555
+ // capacity is the total memory budget when distribute_cache_res_ is true).
556
+ // When the ratio changes, we may accumulate some error in the calculations
557
+ // for secondary cache inflate/deflate and pri_cache_res_ reservations.
558
+ // This is due to the rounding of the reservation amount.
559
+ //
560
+ // We rely on the current pri_cache_res_ total memory used to estimate the
561
+ // new secondary cache reservation after the ratio change. For this reason,
562
+ // once the ratio is lowered to 0.0 (effectively disabling the secondary
563
+ // cache and pri_cache_res_ total mem used going down to 0), we cannot
564
+ // increase the ratio and re-enable it, We might remove this limitation
565
+ // in the future.
566
+ Status CacheWithSecondaryAdapter::UpdateCacheReservationRatio(
567
+ double compressed_secondary_ratio) {
568
+ if (!distribute_cache_res_) {
569
+ return Status::NotSupported();
570
+ }
571
+
572
+ MutexLock m(&cache_res_mutex_);
573
+ size_t pri_capacity = target_->GetCapacity();
574
+ size_t sec_capacity =
575
+ static_cast<size_t>(pri_capacity * compressed_secondary_ratio);
576
+ size_t old_sec_capacity;
577
+ Status s = secondary_cache_->GetCapacity(old_sec_capacity);
578
+ if (!s.ok()) {
579
+ return s;
418
580
  }
419
581
 
420
- if (opts.adm_policy >= TieredAdmissionPolicy::kAdmPolicyMax) {
582
+ // Calculate the new secondary cache reservation
583
+ // reserved_usage_ will never be > the cache capacity, so we don't
584
+ // have to worry about adjusting it here.
585
+ sec_cache_res_ratio_ = compressed_secondary_ratio;
586
+ size_t new_sec_reserved =
587
+ static_cast<size_t>(reserved_usage_ * sec_cache_res_ratio_);
588
+ if (sec_capacity > old_sec_capacity) {
589
+ // We're increasing the ratio, thus ending up with a larger secondary
590
+ // cache and a smaller usable primary cache capacity. Similar to
591
+ // SetCapacity(), we try to avoid a temporary increase in total usage
592
+ // beyond the configured capacity -
593
+ // 1. A higher secondary cache ratio means it gets a higher share of
594
+ // cache reservations. So first account for that by deflating the
595
+ // secondary cache
596
+ // 2. Increase pri_cache_res_ reservation to reflect the new secondary
597
+ // cache utilization (increase in capacity - increase in share of cache
598
+ // reservation)
599
+ // 3. Increase secondary cache capacity
600
+ s = secondary_cache_->Deflate(new_sec_reserved - sec_reserved_);
601
+ assert(s.ok());
602
+ s = pri_cache_res_->UpdateCacheReservation(
603
+ (sec_capacity - old_sec_capacity) - (new_sec_reserved - sec_reserved_),
604
+ /*increase=*/true);
605
+ assert(s.ok());
606
+ sec_reserved_ = new_sec_reserved;
607
+ s = secondary_cache_->SetCapacity(sec_capacity);
608
+ assert(s.ok());
609
+ } else {
610
+ // We're shrinking the ratio. Try to avoid unnecessary evictions -
611
+ // 1. Lower the secondary cache capacity
612
+ // 2. Decrease pri_cache_res_ reservation to relect lower secondary
613
+ // cache utilization (decrease in capacity - decrease in share of cache
614
+ // reservations)
615
+ // 3. Inflate the secondary cache to give it back the reduction in its
616
+ // share of cache reservations
617
+ s = secondary_cache_->SetCapacity(sec_capacity);
618
+ if (s.ok()) {
619
+ s = pri_cache_res_->UpdateCacheReservation(
620
+ (old_sec_capacity - sec_capacity) -
621
+ (sec_reserved_ - new_sec_reserved),
622
+ /*increase=*/false);
623
+ assert(s.ok());
624
+ s = secondary_cache_->Inflate(sec_reserved_ - new_sec_reserved);
625
+ assert(s.ok());
626
+ sec_reserved_ = new_sec_reserved;
627
+ }
628
+ }
629
+
630
+ return s;
631
+ }
632
+
633
+ Status CacheWithSecondaryAdapter::UpdateAdmissionPolicy(
634
+ TieredAdmissionPolicy adm_policy) {
635
+ adm_policy_ = adm_policy;
636
+ return Status::OK();
637
+ }
638
+
639
+ std::shared_ptr<Cache> NewTieredCache(const TieredCacheOptions& _opts) {
640
+ if (!_opts.cache_opts) {
421
641
  return nullptr;
422
642
  }
423
643
 
644
+ TieredCacheOptions opts = _opts;
645
+ {
646
+ bool valid_adm_policy = true;
647
+
648
+ switch (_opts.adm_policy) {
649
+ case TieredAdmissionPolicy::kAdmPolicyAuto:
650
+ // Select an appropriate default policy
651
+ if (opts.adm_policy == TieredAdmissionPolicy::kAdmPolicyAuto) {
652
+ if (opts.nvm_sec_cache) {
653
+ opts.adm_policy = TieredAdmissionPolicy::kAdmPolicyThreeQueue;
654
+ } else {
655
+ opts.adm_policy = TieredAdmissionPolicy::kAdmPolicyPlaceholder;
656
+ }
657
+ }
658
+ break;
659
+ case TieredAdmissionPolicy::kAdmPolicyPlaceholder:
660
+ case TieredAdmissionPolicy::kAdmPolicyAllowCacheHits:
661
+ if (opts.nvm_sec_cache) {
662
+ valid_adm_policy = false;
663
+ }
664
+ break;
665
+ case TieredAdmissionPolicy::kAdmPolicyThreeQueue:
666
+ if (!opts.nvm_sec_cache) {
667
+ valid_adm_policy = false;
668
+ }
669
+ break;
670
+ default:
671
+ valid_adm_policy = false;
672
+ }
673
+ if (!valid_adm_policy) {
674
+ return nullptr;
675
+ }
676
+ }
677
+
424
678
  std::shared_ptr<Cache> cache;
425
679
  if (opts.cache_type == PrimaryCacheType::kCacheTypeLRU) {
426
680
  LRUCacheOptions cache_opts =
427
681
  *(static_cast_with_check<LRUCacheOptions, ShardedCacheOptions>(
428
682
  opts.cache_opts));
429
- cache_opts.capacity += opts.comp_cache_opts.capacity;
683
+ cache_opts.capacity = opts.total_capacity;
430
684
  cache = cache_opts.MakeSharedCache();
431
685
  } else if (opts.cache_type == PrimaryCacheType::kCacheTypeHCC) {
432
686
  HyperClockCacheOptions cache_opts =
433
687
  *(static_cast_with_check<HyperClockCacheOptions, ShardedCacheOptions>(
434
688
  opts.cache_opts));
435
- cache_opts.capacity += opts.comp_cache_opts.capacity;
689
+ cache_opts.capacity = opts.total_capacity;
436
690
  cache = cache_opts.MakeSharedCache();
437
691
  } else {
438
692
  return nullptr;
439
693
  }
440
694
  std::shared_ptr<SecondaryCache> sec_cache;
695
+ opts.comp_cache_opts.capacity = static_cast<size_t>(
696
+ opts.total_capacity * opts.compressed_secondary_ratio);
441
697
  sec_cache = NewCompressedSecondaryCache(opts.comp_cache_opts);
442
698
 
699
+ if (opts.nvm_sec_cache) {
700
+ if (opts.adm_policy == TieredAdmissionPolicy::kAdmPolicyThreeQueue) {
701
+ sec_cache = std::make_shared<TieredSecondaryCache>(
702
+ sec_cache, opts.nvm_sec_cache,
703
+ TieredAdmissionPolicy::kAdmPolicyThreeQueue);
704
+ } else {
705
+ return nullptr;
706
+ }
707
+ }
708
+
443
709
  return std::make_shared<CacheWithSecondaryAdapter>(
444
710
  cache, sec_cache, opts.adm_policy, /*distribute_cache_res=*/true);
445
711
  }
712
+
713
+ Status UpdateTieredCache(const std::shared_ptr<Cache>& cache,
714
+ int64_t total_capacity,
715
+ double compressed_secondary_ratio,
716
+ TieredAdmissionPolicy adm_policy) {
717
+ if (!cache || strcmp(cache->Name(), kTieredCacheName)) {
718
+ return Status::InvalidArgument();
719
+ }
720
+ CacheWithSecondaryAdapter* tiered_cache =
721
+ static_cast<CacheWithSecondaryAdapter*>(cache.get());
722
+
723
+ Status s;
724
+ if (total_capacity > 0) {
725
+ tiered_cache->SetCapacity(total_capacity);
726
+ }
727
+ if (compressed_secondary_ratio >= 0.0 && compressed_secondary_ratio <= 1.0) {
728
+ s = tiered_cache->UpdateCacheReservationRatio(compressed_secondary_ratio);
729
+ }
730
+ if (adm_policy < TieredAdmissionPolicy::kAdmPolicyMax) {
731
+ s = tiered_cache->UpdateAdmissionPolicy(adm_policy);
732
+ }
733
+ return s;
734
+ }
446
735
  } // namespace ROCKSDB_NAMESPACE
@@ -20,10 +20,12 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
20
20
 
21
21
  ~CacheWithSecondaryAdapter() override;
22
22
 
23
- Status Insert(const Slice& key, ObjectPtr value,
24
- const CacheItemHelper* helper, size_t charge,
25
- Handle** handle = nullptr,
26
- Priority priority = Priority::LOW) override;
23
+ Status Insert(
24
+ const Slice& key, ObjectPtr value, const CacheItemHelper* helper,
25
+ size_t charge, Handle** handle = nullptr,
26
+ Priority priority = Priority::LOW,
27
+ const Slice& compressed_value = Slice(),
28
+ CompressionType type = CompressionType::kNoCompression) override;
27
29
 
28
30
  Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
29
31
  CreateContext* create_context,
@@ -43,11 +45,23 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
43
45
 
44
46
  const char* Name() const override;
45
47
 
48
+ void SetCapacity(size_t capacity) override;
49
+
50
+ Status GetSecondaryCacheCapacity(size_t& size) const override;
51
+
52
+ Status GetSecondaryCachePinnedUsage(size_t& size) const override;
53
+
54
+ Status UpdateCacheReservationRatio(double ratio);
55
+
56
+ Status UpdateAdmissionPolicy(TieredAdmissionPolicy adm_policy);
57
+
46
58
  Cache* TEST_GetCache() { return target_.get(); }
47
59
 
48
60
  SecondaryCache* TEST_GetSecondaryCache() { return secondary_cache_.get(); }
49
61
 
50
62
  private:
63
+ static constexpr size_t kReservationChunkSize = 1 << 20;
64
+
51
65
  bool EvictionHandler(const Slice& key, Handle* handle, bool was_hit);
52
66
 
53
67
  void StartAsyncLookupOnMySecondary(AsyncLookupHandle& async_handle);
@@ -73,6 +87,17 @@ class CacheWithSecondaryAdapter : public CacheWrapper {
73
87
  // Fraction of a cache memory reservation to be assigned to the secondary
74
88
  // cache
75
89
  double sec_cache_res_ratio_;
90
+ // Mutex for use when managing cache memory reservations. Should not be used
91
+ // for other purposes, as it may risk causing deadlocks.
92
+ mutable port::Mutex cache_res_mutex_;
93
+ // Total memory reserved by placeholder entriesin the cache
94
+ size_t placeholder_usage_;
95
+ // Total placeholoder memory charged to both the primary and secondary
96
+ // caches. Will be <= placeholder_usage_.
97
+ size_t reserved_usage_;
98
+ // Amount of memory reserved in the secondary cache. This should be
99
+ // reserved_usage_ * sec_cache_res_ratio_ in steady state.
100
+ size_t sec_reserved_;
76
101
  };
77
102
 
78
103
  } // namespace ROCKSDB_NAMESPACE
@@ -83,6 +83,16 @@ size_t ShardedCacheBase::GetCapacity() const {
83
83
  return capacity_;
84
84
  }
85
85
 
86
+ Status ShardedCacheBase::GetSecondaryCacheCapacity(size_t& size) const {
87
+ size = 0;
88
+ return Status::OK();
89
+ }
90
+
91
+ Status ShardedCacheBase::GetSecondaryCachePinnedUsage(size_t& size) const {
92
+ size = 0;
93
+ return Status::OK();
94
+ }
95
+
86
96
  bool ShardedCacheBase::HasStrictCapacityLimit() const {
87
97
  MutexLock l(&config_mutex_);
88
98
  return strict_capacity_limit_;