@nxtedition/rocksdb 9.0.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
  3. package/deps/rocksdb/rocksdb/Makefile +15 -6
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +17 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +182 -7
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
  19. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +293 -17
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +21 -5
  22. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
  24. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  27. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  28. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
  29. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  30. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
  32. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  34. package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
  35. package/deps/rocksdb/rocksdb/db/c.cc +64 -0
  36. package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
  37. package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
  38. package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
  39. package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
  51. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
  52. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  53. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
  54. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
  55. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
  56. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  57. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
  58. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
  59. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
  71. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  72. package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
  73. package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
  74. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  75. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  76. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  77. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
  78. package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
  79. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
  80. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  82. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  83. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  84. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
  85. package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
  86. package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
  87. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
  88. package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
  89. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
  90. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
  91. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
  92. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  93. package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
  94. package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
  95. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
  96. package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
  98. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
  99. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
  100. package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
  101. package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
  102. package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
  103. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
  104. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  105. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  106. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  107. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  108. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
  109. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  110. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  112. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  113. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  114. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  115. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
  116. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  117. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  118. package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
  119. package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
  121. package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
  122. package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
  123. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  124. package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
  125. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  126. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  127. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  128. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  129. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  130. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  131. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
  133. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  134. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  135. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  147. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  148. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
  149. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
  150. package/deps/rocksdb/rocksdb/env/env.cc +5 -0
  151. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
  152. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
  153. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
  154. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
  155. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
  157. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
  158. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
  160. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
  162. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
  163. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
  164. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
  165. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  166. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  167. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
  168. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  169. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  170. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
  171. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  172. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  173. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
  174. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
  175. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  176. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  177. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
  178. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  180. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  181. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  182. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  185. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
  186. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
  187. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  188. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  189. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  190. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  191. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  192. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
  193. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
  194. package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
  195. package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
  196. package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
  197. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  198. package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
  199. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  200. package/deps/rocksdb/rocksdb/port/README +10 -0
  201. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  202. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  203. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  204. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
  205. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  206. package/deps/rocksdb/rocksdb/src.mk +7 -1
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
  208. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
  209. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
  210. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
  211. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
  212. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
  213. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  214. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
  215. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  217. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
  218. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
  219. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
  220. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  221. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  222. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  224. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
  225. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
  226. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
  227. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  228. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
  229. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  230. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
  231. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  232. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  233. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  234. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  235. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
  236. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
  237. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
  239. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  240. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  241. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  242. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  243. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
  244. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  246. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
  247. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
  248. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  249. package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
  250. package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
  251. package/deps/rocksdb/rocksdb/util/compression.h +9 -3
  252. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  253. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  254. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  255. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  256. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  257. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  258. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  259. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  260. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  261. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  262. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
  263. package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
  264. package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
  265. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
  266. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  267. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  268. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
  269. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  270. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
  271. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  272. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
  273. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  274. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
  275. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  276. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  277. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
  278. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  279. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
  280. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
  281. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
  282. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
  283. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
  284. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
  285. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
  286. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
  287. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
  288. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  289. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  290. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
  291. package/deps/rocksdb/rocksdb.gyp +4 -2
  292. package/index.js +0 -8
  293. package/package.json +1 -1
  294. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  295. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  296. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  297. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  298. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  299. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  300. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  301. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  302. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  303. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  304. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -0,0 +1,711 @@
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
+ #include "cache/compressed_secondary_cache.h"
7
+ #include "cache/secondary_cache_adapter.h"
8
+ #include "db/db_test_util.h"
9
+ #include "rocksdb/cache.h"
10
+ #include "rocksdb/secondary_cache.h"
11
+ #include "typed_cache.h"
12
+ #include "util/random.h"
13
+
14
+ namespace ROCKSDB_NAMESPACE {
15
+
16
+ class TestSecondaryCache : public SecondaryCache {
17
+ public:
18
+ explicit TestSecondaryCache(size_t capacity)
19
+ : cache_(NewLRUCache(capacity, 0, false, 0.5 /* high_pri_pool_ratio */,
20
+ nullptr, kDefaultToAdaptiveMutex,
21
+ kDontChargeCacheMetadata)),
22
+ num_insert_saved_(0),
23
+ num_hits_(0),
24
+ num_misses_(0) {}
25
+
26
+ const char* Name() const override { return "TestSecondaryCache"; }
27
+
28
+ Status Insert(const Slice& /*key*/, Cache::ObjectPtr /*value*/,
29
+ const Cache::CacheItemHelper* /*helper*/,
30
+ bool /*force_insert*/) override {
31
+ assert(false);
32
+ return Status::NotSupported();
33
+ }
34
+
35
+ Status InsertSaved(const Slice& key, const Slice& saved,
36
+ CompressionType type = kNoCompression,
37
+ CacheTier source = CacheTier::kVolatileTier) override {
38
+ CheckCacheKeyCommonPrefix(key);
39
+ size_t size;
40
+ char* buf;
41
+ Status s;
42
+
43
+ num_insert_saved_++;
44
+ size = saved.size();
45
+ buf = new char[size + sizeof(uint64_t) + 2 * sizeof(uint16_t)];
46
+ EncodeFixed64(buf, size);
47
+ buf += sizeof(uint64_t);
48
+ EncodeFixed16(buf, type);
49
+ buf += sizeof(uint16_t);
50
+ EncodeFixed16(buf, (uint16_t)source);
51
+ buf += sizeof(uint16_t);
52
+ memcpy(buf, saved.data(), size);
53
+ buf -= sizeof(uint64_t) + 2 * sizeof(uint16_t);
54
+ if (!s.ok()) {
55
+ delete[] buf;
56
+ return s;
57
+ }
58
+ return cache_.Insert(key, buf, size);
59
+ }
60
+
61
+ std::unique_ptr<SecondaryCacheResultHandle> Lookup(
62
+ const Slice& key, const Cache::CacheItemHelper* helper,
63
+ Cache::CreateContext* create_context, bool wait, bool /*advise_erase*/,
64
+ bool& kept_in_sec_cache) override {
65
+ std::string key_str = key.ToString();
66
+ TEST_SYNC_POINT_CALLBACK("TestSecondaryCache::Lookup", &key_str);
67
+
68
+ std::unique_ptr<SecondaryCacheResultHandle> secondary_handle;
69
+ kept_in_sec_cache = false;
70
+
71
+ TypedHandle* handle = cache_.Lookup(key);
72
+ if (handle) {
73
+ num_hits_++;
74
+ Cache::ObjectPtr value = nullptr;
75
+ size_t charge = 0;
76
+ Status s;
77
+ char* ptr = cache_.Value(handle);
78
+ CompressionType type;
79
+ CacheTier source;
80
+ size_t size = DecodeFixed64(ptr);
81
+ ptr += sizeof(uint64_t);
82
+ type = static_cast<CompressionType>(DecodeFixed16(ptr));
83
+ ptr += sizeof(uint16_t);
84
+ source = static_cast<CacheTier>(DecodeFixed16(ptr));
85
+ assert(source == CacheTier::kVolatileTier);
86
+ ptr += sizeof(uint16_t);
87
+ s = helper->create_cb(Slice(ptr, size), type, source, create_context,
88
+ /*alloc*/ nullptr, &value, &charge);
89
+ if (s.ok()) {
90
+ secondary_handle.reset(new TestSecondaryCacheResultHandle(
91
+ cache_.get(), handle, value, charge, /*ready=*/wait));
92
+ kept_in_sec_cache = true;
93
+ } else {
94
+ cache_.Release(handle);
95
+ }
96
+ } else {
97
+ num_misses_++;
98
+ }
99
+ return secondary_handle;
100
+ }
101
+
102
+ bool SupportForceErase() const override { return false; }
103
+
104
+ void Erase(const Slice& /*key*/) override {}
105
+
106
+ void WaitAll(std::vector<SecondaryCacheResultHandle*> handles) override {
107
+ for (SecondaryCacheResultHandle* handle : handles) {
108
+ TestSecondaryCacheResultHandle* sec_handle =
109
+ static_cast<TestSecondaryCacheResultHandle*>(handle);
110
+ EXPECT_FALSE(sec_handle->IsReady());
111
+ sec_handle->SetReady();
112
+ }
113
+ }
114
+
115
+ std::string GetPrintableOptions() const override { return ""; }
116
+
117
+ uint32_t num_insert_saved() { return num_insert_saved_; }
118
+
119
+ uint32_t num_hits() { return num_hits_; }
120
+
121
+ uint32_t num_misses() { return num_misses_; }
122
+
123
+ void CheckCacheKeyCommonPrefix(const Slice& key) {
124
+ Slice current_prefix(key.data(), OffsetableCacheKey::kCommonPrefixSize);
125
+ if (ckey_prefix_.empty()) {
126
+ ckey_prefix_ = current_prefix.ToString();
127
+ } else {
128
+ EXPECT_EQ(ckey_prefix_, current_prefix.ToString());
129
+ }
130
+ }
131
+
132
+ private:
133
+ class TestSecondaryCacheResultHandle : public SecondaryCacheResultHandle {
134
+ public:
135
+ TestSecondaryCacheResultHandle(Cache* cache, Cache::Handle* handle,
136
+ Cache::ObjectPtr value, size_t size,
137
+ bool ready)
138
+ : cache_(cache),
139
+ handle_(handle),
140
+ value_(value),
141
+ size_(size),
142
+ is_ready_(ready) {}
143
+
144
+ ~TestSecondaryCacheResultHandle() override { cache_->Release(handle_); }
145
+
146
+ bool IsReady() override { return is_ready_; }
147
+
148
+ void Wait() override {}
149
+
150
+ Cache::ObjectPtr Value() override {
151
+ assert(is_ready_);
152
+ return value_;
153
+ }
154
+
155
+ size_t Size() override { return Value() ? size_ : 0; }
156
+
157
+ void SetReady() { is_ready_ = true; }
158
+
159
+ private:
160
+ Cache* cache_;
161
+ Cache::Handle* handle_;
162
+ Cache::ObjectPtr value_;
163
+ size_t size_;
164
+ bool is_ready_;
165
+ };
166
+
167
+ using SharedCache =
168
+ BasicTypedSharedCacheInterface<char[], CacheEntryRole::kMisc>;
169
+ using TypedHandle = SharedCache::TypedHandle;
170
+ SharedCache cache_;
171
+ uint32_t num_insert_saved_;
172
+ uint32_t num_hits_;
173
+ uint32_t num_misses_;
174
+ std::string ckey_prefix_;
175
+ };
176
+
177
+ class DBTieredSecondaryCacheTest : public DBTestBase {
178
+ public:
179
+ DBTieredSecondaryCacheTest()
180
+ : DBTestBase("db_tiered_secondary_cache_test", /*env_do_fsync=*/true) {}
181
+
182
+ std::shared_ptr<Cache> NewCache(size_t pri_capacity,
183
+ size_t compressed_capacity,
184
+ size_t nvm_capacity,
185
+ TieredAdmissionPolicy adm_policy =
186
+ TieredAdmissionPolicy::kAdmPolicyAuto) {
187
+ LRUCacheOptions lru_opts;
188
+ TieredCacheOptions opts;
189
+ lru_opts.capacity = 0;
190
+ lru_opts.num_shard_bits = 0;
191
+ lru_opts.high_pri_pool_ratio = 0;
192
+ opts.cache_opts = &lru_opts;
193
+ opts.cache_type = PrimaryCacheType::kCacheTypeLRU;
194
+ opts.comp_cache_opts.capacity = 0;
195
+ opts.comp_cache_opts.num_shard_bits = 0;
196
+ opts.total_capacity = pri_capacity + compressed_capacity;
197
+ opts.compressed_secondary_ratio =
198
+ (double)compressed_capacity / opts.total_capacity;
199
+ if (nvm_capacity > 0) {
200
+ nvm_sec_cache_.reset(new TestSecondaryCache(nvm_capacity));
201
+ opts.nvm_sec_cache = nvm_sec_cache_;
202
+ }
203
+ opts.adm_policy = adm_policy;
204
+ cache_ = NewTieredCache(opts);
205
+ assert(cache_ != nullptr);
206
+
207
+ return cache_;
208
+ }
209
+
210
+ TestSecondaryCache* nvm_sec_cache() { return nvm_sec_cache_.get(); }
211
+
212
+ CompressedSecondaryCache* compressed_secondary_cache() {
213
+ return static_cast<CompressedSecondaryCache*>(
214
+ static_cast<CacheWithSecondaryAdapter*>(cache_.get())
215
+ ->TEST_GetSecondaryCache());
216
+ }
217
+
218
+ private:
219
+ std::shared_ptr<Cache> cache_;
220
+ std::shared_ptr<TestSecondaryCache> nvm_sec_cache_;
221
+ };
222
+
223
+ // In this test, the block size is set to 4096. Each value is 1007 bytes, so
224
+ // each data block contains exactly 4 KV pairs. Metadata blocks are not
225
+ // cached, so we can accurately estimate the cache usage.
226
+ TEST_F(DBTieredSecondaryCacheTest, BasicTest) {
227
+ if (!LZ4_Supported()) {
228
+ ROCKSDB_GTEST_SKIP("This test requires LZ4 support.");
229
+ return;
230
+ }
231
+
232
+ BlockBasedTableOptions table_options;
233
+ // We want a block cache of size 5KB, and a compressed secondary cache of
234
+ // size 5KB. However, we specify a block cache size of 256KB here in order
235
+ // to take into account the cache reservation in the block cache on
236
+ // behalf of the compressed cache. The unit of cache reservation is 256KB.
237
+ // The effective block cache capacity will be calculated as 256 + 5 = 261KB,
238
+ // and 256KB will be reserved for the compressed cache, leaving 5KB for
239
+ // the primary block cache. We only have to worry about this here because
240
+ // the cache size is so small.
241
+ table_options.block_cache = NewCache(256 * 1024, 5 * 1024, 256 * 1024);
242
+ table_options.block_size = 4 * 1024;
243
+ table_options.cache_index_and_filter_blocks = false;
244
+ Options options = GetDefaultOptions();
245
+ options.create_if_missing = true;
246
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
247
+
248
+ // Disable paranoid_file_checks so that flush will not read back the newly
249
+ // written file
250
+ options.paranoid_file_checks = false;
251
+ DestroyAndReopen(options);
252
+ Random rnd(301);
253
+ const int N = 256;
254
+ for (int i = 0; i < N; i++) {
255
+ std::string p_v;
256
+ test::CompressibleString(&rnd, 0.5, 1007, &p_v);
257
+ ASSERT_OK(Put(Key(i), p_v));
258
+ }
259
+
260
+ ASSERT_OK(Flush());
261
+
262
+ // The first 2 Gets, for keys 0 and 5, will load the corresponding data
263
+ // blocks as they will be cache misses. The nvm secondary cache will be
264
+ // warmed up with the compressed blocks
265
+ std::string v = Get(Key(0));
266
+ ASSERT_EQ(1007, v.size());
267
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 1u);
268
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 1u);
269
+
270
+ v = Get(Key(5));
271
+ ASSERT_EQ(1007, v.size());
272
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
273
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
274
+
275
+ // At this point, the nvm cache is warmed up with the data blocks for 0
276
+ // and 5. The next Get will lookup the block in nvm and will be a hit.
277
+ // It will be created as a standalone entry in memory, and a placeholder
278
+ // will be inserted in the primary and compressed caches.
279
+ v = Get(Key(0));
280
+ ASSERT_EQ(1007, v.size());
281
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
282
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
283
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 1u);
284
+
285
+ // For this Get, the primary and compressed only have placeholders for
286
+ // the required data block. So we will lookup the nvm cache and find the
287
+ // block there. This time, the block will be promoted to the primary
288
+ // block cache. No promotion to the compressed secondary cache happens,
289
+ // and it will retain the placeholder.
290
+ v = Get(Key(0));
291
+ ASSERT_EQ(1007, v.size());
292
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
293
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
294
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 2u);
295
+
296
+ // This Get will find the data block in the primary cache.
297
+ v = Get(Key(0));
298
+ ASSERT_EQ(1007, v.size());
299
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
300
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
301
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 2u);
302
+
303
+ // We repeat the sequence for key 5. This will end up evicting the block
304
+ // for 0 from the in-memory cache.
305
+ v = Get(Key(5));
306
+ ASSERT_EQ(1007, v.size());
307
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
308
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
309
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 3u);
310
+
311
+ v = Get(Key(5));
312
+ ASSERT_EQ(1007, v.size());
313
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
314
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
315
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 4u);
316
+
317
+ v = Get(Key(5));
318
+ ASSERT_EQ(1007, v.size());
319
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
320
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
321
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 4u);
322
+
323
+ // This Get for key 0 will find the data block in nvm. Since the compressed
324
+ // cache still has the placeholder, the block (compressed) will be
325
+ // admitted. It is theh inserted into the primary as a standalone entry.
326
+ v = Get(Key(0));
327
+ ASSERT_EQ(1007, v.size());
328
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
329
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
330
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 5u);
331
+
332
+ // This Get for key 0 will find the data block in the compressed secondary
333
+ // cache.
334
+ v = Get(Key(0));
335
+ ASSERT_EQ(1007, v.size());
336
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 2u);
337
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 2u);
338
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 5u);
339
+
340
+ Destroy(options);
341
+ }
342
+
343
+ // This test is very similar to BasicTest, except it calls MultiGet rather
344
+ // than Get, in order to exercise the async lookup and WaitAll path.
345
+ TEST_F(DBTieredSecondaryCacheTest, BasicMultiGetTest) {
346
+ if (!LZ4_Supported()) {
347
+ ROCKSDB_GTEST_SKIP("This test requires LZ4 support.");
348
+ return;
349
+ }
350
+
351
+ BlockBasedTableOptions table_options;
352
+ table_options.block_cache = NewCache(260 * 1024, 10 * 1024, 256 * 1024);
353
+ table_options.block_size = 4 * 1024;
354
+ table_options.cache_index_and_filter_blocks = false;
355
+ Options options = GetDefaultOptions();
356
+ options.create_if_missing = true;
357
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
358
+
359
+ options.paranoid_file_checks = false;
360
+ DestroyAndReopen(options);
361
+ Random rnd(301);
362
+ const int N = 256;
363
+ for (int i = 0; i < N; i++) {
364
+ std::string p_v;
365
+ test::CompressibleString(&rnd, 0.5, 1007, &p_v);
366
+ ASSERT_OK(Put(Key(i), p_v));
367
+ }
368
+
369
+ ASSERT_OK(Flush());
370
+
371
+ std::vector<std::string> keys;
372
+ std::vector<std::string> values;
373
+
374
+ keys.push_back(Key(0));
375
+ keys.push_back(Key(4));
376
+ keys.push_back(Key(8));
377
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
378
+ ASSERT_EQ(values.size(), keys.size());
379
+ for (auto value : values) {
380
+ ASSERT_EQ(1007, value.size());
381
+ }
382
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 3u);
383
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 3u);
384
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 0u);
385
+
386
+ keys.clear();
387
+ values.clear();
388
+ keys.push_back(Key(12));
389
+ keys.push_back(Key(16));
390
+ keys.push_back(Key(20));
391
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
392
+ ASSERT_EQ(values.size(), keys.size());
393
+ for (auto value : values) {
394
+ ASSERT_EQ(1007, value.size());
395
+ }
396
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
397
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
398
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 0u);
399
+
400
+ keys.clear();
401
+ values.clear();
402
+ keys.push_back(Key(0));
403
+ keys.push_back(Key(4));
404
+ keys.push_back(Key(8));
405
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
406
+ ASSERT_EQ(values.size(), keys.size());
407
+ for (auto value : values) {
408
+ ASSERT_EQ(1007, value.size());
409
+ }
410
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
411
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
412
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 3u);
413
+
414
+ keys.clear();
415
+ values.clear();
416
+ keys.push_back(Key(0));
417
+ keys.push_back(Key(4));
418
+ keys.push_back(Key(8));
419
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
420
+ ASSERT_EQ(values.size(), keys.size());
421
+ for (auto value : values) {
422
+ ASSERT_EQ(1007, value.size());
423
+ }
424
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
425
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
426
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 6u);
427
+
428
+ keys.clear();
429
+ values.clear();
430
+ keys.push_back(Key(0));
431
+ keys.push_back(Key(4));
432
+ keys.push_back(Key(8));
433
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
434
+ ASSERT_EQ(values.size(), keys.size());
435
+ for (auto value : values) {
436
+ ASSERT_EQ(1007, value.size());
437
+ }
438
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
439
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
440
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 6u);
441
+
442
+ keys.clear();
443
+ values.clear();
444
+ keys.push_back(Key(12));
445
+ keys.push_back(Key(16));
446
+ keys.push_back(Key(20));
447
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
448
+ ASSERT_EQ(values.size(), keys.size());
449
+ for (auto value : values) {
450
+ ASSERT_EQ(1007, value.size());
451
+ }
452
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
453
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
454
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 9u);
455
+
456
+ keys.clear();
457
+ values.clear();
458
+ keys.push_back(Key(12));
459
+ keys.push_back(Key(16));
460
+ keys.push_back(Key(20));
461
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
462
+ ASSERT_EQ(values.size(), keys.size());
463
+ for (auto value : values) {
464
+ ASSERT_EQ(1007, value.size());
465
+ }
466
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
467
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
468
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 12u);
469
+
470
+ keys.clear();
471
+ values.clear();
472
+ keys.push_back(Key(12));
473
+ keys.push_back(Key(16));
474
+ keys.push_back(Key(20));
475
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
476
+ ASSERT_EQ(values.size(), keys.size());
477
+ for (auto value : values) {
478
+ ASSERT_EQ(1007, value.size());
479
+ }
480
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
481
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
482
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 12u);
483
+
484
+ Destroy(options);
485
+ }
486
+
487
+ TEST_F(DBTieredSecondaryCacheTest, WaitAllTest) {
488
+ if (!LZ4_Supported()) {
489
+ ROCKSDB_GTEST_SKIP("This test requires LZ4 support.");
490
+ return;
491
+ }
492
+
493
+ BlockBasedTableOptions table_options;
494
+ table_options.block_cache = NewCache(250 * 1024, 20 * 1024, 256 * 1024);
495
+ table_options.block_size = 4 * 1024;
496
+ table_options.cache_index_and_filter_blocks = false;
497
+ Options options = GetDefaultOptions();
498
+ options.create_if_missing = true;
499
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
500
+
501
+ options.paranoid_file_checks = false;
502
+ DestroyAndReopen(options);
503
+ Random rnd(301);
504
+ const int N = 256;
505
+ for (int i = 0; i < N; i++) {
506
+ std::string p_v;
507
+ test::CompressibleString(&rnd, 0.5, 1007, &p_v);
508
+ ASSERT_OK(Put(Key(i), p_v));
509
+ }
510
+
511
+ ASSERT_OK(Flush());
512
+
513
+ std::vector<std::string> keys;
514
+ std::vector<std::string> values;
515
+
516
+ keys.push_back(Key(0));
517
+ keys.push_back(Key(4));
518
+ keys.push_back(Key(8));
519
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
520
+ ASSERT_EQ(values.size(), keys.size());
521
+ for (auto value : values) {
522
+ ASSERT_EQ(1007, value.size());
523
+ }
524
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 3u);
525
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 3u);
526
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 0u);
527
+
528
+ keys.clear();
529
+ values.clear();
530
+ keys.push_back(Key(12));
531
+ keys.push_back(Key(16));
532
+ keys.push_back(Key(20));
533
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
534
+ ASSERT_EQ(values.size(), keys.size());
535
+ for (auto value : values) {
536
+ ASSERT_EQ(1007, value.size());
537
+ }
538
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 6u);
539
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 6u);
540
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 0u);
541
+
542
+ // Insert placeholders for 4 in primary and compressed
543
+ std::string val = Get(Key(4));
544
+
545
+ // Force placeholder 4 out of primary
546
+ keys.clear();
547
+ values.clear();
548
+ keys.push_back(Key(24));
549
+ keys.push_back(Key(28));
550
+ keys.push_back(Key(32));
551
+ keys.push_back(Key(36));
552
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
553
+ ASSERT_EQ(values.size(), keys.size());
554
+ for (auto value : values) {
555
+ ASSERT_EQ(1007, value.size());
556
+ }
557
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 10u);
558
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 10u);
559
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 1u);
560
+
561
+ // Now read 4 again. This will create a placeholder in primary, and insert
562
+ // in compressed secondary since it already has a placeholder
563
+ val = Get(Key(4));
564
+
565
+ // Now read 0, 4 and 8. While 4 is already in the compressed secondary
566
+ // cache, 0 and 8 will be read asynchronously from the nvm tier. The
567
+ // WaitAll will be called for all 3 blocks.
568
+ keys.clear();
569
+ values.clear();
570
+ keys.push_back(Key(0));
571
+ keys.push_back(Key(4));
572
+ keys.push_back(Key(8));
573
+ values = MultiGet(keys, /*snapshot=*/nullptr, /*async=*/true);
574
+ ASSERT_EQ(values.size(), keys.size());
575
+ for (auto value : values) {
576
+ ASSERT_EQ(1007, value.size());
577
+ }
578
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 10u);
579
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 10u);
580
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 4u);
581
+
582
+ Destroy(options);
583
+ }
584
+
585
+ // This test is for iteration. It iterates through a set of keys in two
586
+ // passes. First pass loads the compressed blocks into the nvm tier, and
587
+ // the second pass should hit all of those blocks.
588
+ TEST_F(DBTieredSecondaryCacheTest, IterateTest) {
589
+ if (!LZ4_Supported()) {
590
+ ROCKSDB_GTEST_SKIP("This test requires LZ4 support.");
591
+ return;
592
+ }
593
+
594
+ BlockBasedTableOptions table_options;
595
+ table_options.block_cache = NewCache(250 * 1024, 10 * 1024, 256 * 1024);
596
+ table_options.block_size = 4 * 1024;
597
+ table_options.cache_index_and_filter_blocks = false;
598
+ Options options = GetDefaultOptions();
599
+ options.create_if_missing = true;
600
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
601
+
602
+ options.paranoid_file_checks = false;
603
+ DestroyAndReopen(options);
604
+ Random rnd(301);
605
+ const int N = 256;
606
+ for (int i = 0; i < N; i++) {
607
+ std::string p_v;
608
+ test::CompressibleString(&rnd, 0.5, 1007, &p_v);
609
+ ASSERT_OK(Put(Key(i), p_v));
610
+ }
611
+
612
+ ASSERT_OK(Flush());
613
+
614
+ ReadOptions ro;
615
+ ro.readahead_size = 256 * 1024;
616
+ auto iter = dbfull()->NewIterator(ro);
617
+ iter->SeekToFirst();
618
+ for (int i = 0; i < 31; ++i) {
619
+ ASSERT_EQ(Key(i), iter->key().ToString());
620
+ ASSERT_EQ(1007, iter->value().size());
621
+ iter->Next();
622
+ }
623
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 8u);
624
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 8u);
625
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 0u);
626
+ delete iter;
627
+
628
+ iter = dbfull()->NewIterator(ro);
629
+ iter->SeekToFirst();
630
+ for (int i = 0; i < 31; ++i) {
631
+ ASSERT_EQ(Key(i), iter->key().ToString());
632
+ ASSERT_EQ(1007, iter->value().size());
633
+ iter->Next();
634
+ }
635
+ ASSERT_EQ(nvm_sec_cache()->num_insert_saved(), 8u);
636
+ ASSERT_EQ(nvm_sec_cache()->num_misses(), 8u);
637
+ ASSERT_EQ(nvm_sec_cache()->num_hits(), 8u);
638
+ delete iter;
639
+
640
+ Destroy(options);
641
+ }
642
+
643
+ class DBTieredAdmPolicyTest
644
+ : public DBTieredSecondaryCacheTest,
645
+ public testing::WithParamInterface<TieredAdmissionPolicy> {};
646
+
647
+ TEST_P(DBTieredAdmPolicyTest, CompressedOnlyTest) {
648
+ if (!LZ4_Supported()) {
649
+ ROCKSDB_GTEST_SKIP("This test requires LZ4 support.");
650
+ return;
651
+ }
652
+
653
+ BlockBasedTableOptions table_options;
654
+ // We want a block cache of size 10KB, and a compressed secondary cache of
655
+ // size 10KB. However, we specify a block cache size of 256KB here in order
656
+ // to take into account the cache reservation in the block cache on
657
+ // behalf of the compressed cache. The unit of cache reservation is 256KB.
658
+ // The effective block cache capacity will be calculated as 256 + 10 = 266KB,
659
+ // and 256KB will be reserved for the compressed cache, leaving 10KB for
660
+ // the primary block cache. We only have to worry about this here because
661
+ // the cache size is so small.
662
+ table_options.block_cache = NewCache(256 * 1024, 10 * 1024, 0, GetParam());
663
+ table_options.block_size = 4 * 1024;
664
+ table_options.cache_index_and_filter_blocks = false;
665
+ Options options = GetDefaultOptions();
666
+ options.create_if_missing = true;
667
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
668
+
669
+ size_t comp_cache_usage = compressed_secondary_cache()->TEST_GetUsage();
670
+ // Disable paranoid_file_checks so that flush will not read back the newly
671
+ // written file
672
+ options.paranoid_file_checks = false;
673
+ DestroyAndReopen(options);
674
+ Random rnd(301);
675
+ const int N = 256;
676
+ for (int i = 0; i < N; i++) {
677
+ std::string p_v;
678
+ test::CompressibleString(&rnd, 0.5, 1007, &p_v);
679
+ ASSERT_OK(Put(Key(i), p_v));
680
+ }
681
+
682
+ ASSERT_OK(Flush());
683
+
684
+ // The first 2 Gets, for keys 0 and 5, will load the corresponding data
685
+ // blocks as they will be cache misses. Since this is a 2-tier cache (
686
+ // primary and compressed), no warm-up should happen with the compressed
687
+ // blocks.
688
+ std::string v = Get(Key(0));
689
+ ASSERT_EQ(1007, v.size());
690
+
691
+ v = Get(Key(5));
692
+ ASSERT_EQ(1007, v.size());
693
+
694
+ ASSERT_EQ(compressed_secondary_cache()->TEST_GetUsage(), comp_cache_usage);
695
+
696
+ Destroy(options);
697
+ }
698
+
699
+ INSTANTIATE_TEST_CASE_P(
700
+ DBTieredAdmPolicyTest, DBTieredAdmPolicyTest,
701
+ ::testing::Values(TieredAdmissionPolicy::kAdmPolicyAuto,
702
+ TieredAdmissionPolicy::kAdmPolicyPlaceholder,
703
+ TieredAdmissionPolicy::kAdmPolicyAllowCacheHits));
704
+
705
+ } // namespace ROCKSDB_NAMESPACE
706
+
707
+ int main(int argc, char** argv) {
708
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
709
+ ::testing::InitGoogleTest(&argc, argv);
710
+ return RUN_ALL_TESTS();
711
+ }