@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -7,8 +7,21 @@
7
7
 
8
8
  #include <string>
9
9
  #include <vector>
10
+
11
+ #include "cache/cache_key.h"
12
+ #include "db/db_test_util.h"
13
+ #include "file/sst_file_manager_impl.h"
10
14
  #include "port/port.h"
15
+ #include "port/stack_trace.h"
16
+ #include "rocksdb/cache.h"
17
+ #include "rocksdb/io_status.h"
18
+ #include "rocksdb/sst_file_manager.h"
19
+ #include "rocksdb/utilities/cache_dump_load.h"
11
20
  #include "test_util/testharness.h"
21
+ #include "util/coding.h"
22
+ #include "util/random.h"
23
+ #include "utilities/cache_dump_load_impl.h"
24
+ #include "utilities/fault_injection_fs.h"
12
25
 
13
26
  namespace ROCKSDB_NAMESPACE {
14
27
 
@@ -30,9 +43,10 @@ class LRUCacheTest : public testing::Test {
30
43
  DeleteCache();
31
44
  cache_ = reinterpret_cast<LRUCacheShard*>(
32
45
  port::cacheline_aligned_alloc(sizeof(LRUCacheShard)));
33
- new (cache_) LRUCacheShard(capacity, false /*strict_capcity_limit*/,
34
- high_pri_pool_ratio, use_adaptive_mutex,
35
- kDontChargeCacheMetadata);
46
+ new (cache_) LRUCacheShard(
47
+ capacity, false /*strict_capcity_limit*/, high_pri_pool_ratio,
48
+ use_adaptive_mutex, kDontChargeCacheMetadata,
49
+ 24 /*max_upper_hash_bits*/, nullptr /*secondary_cache*/);
36
50
  }
37
51
 
38
52
  void Insert(const std::string& key,
@@ -191,6 +205,1648 @@ TEST_F(LRUCacheTest, EntriesWithPriority) {
191
205
  ValidateLRUList({"e", "f", "g", "Z", "d"}, 2);
192
206
  }
193
207
 
208
+ class TestSecondaryCache : public SecondaryCache {
209
+ public:
210
+ // Specifies what action to take on a lookup for a particular key
211
+ enum ResultType {
212
+ SUCCESS,
213
+ // Fail lookup immediately
214
+ FAIL,
215
+ // Defer the result. It will returned after Wait/WaitAll is called
216
+ DEFER,
217
+ // Defer the result and eventually return failure
218
+ DEFER_AND_FAIL
219
+ };
220
+
221
+ using ResultMap = std::unordered_map<std::string, ResultType>;
222
+
223
+ explicit TestSecondaryCache(size_t capacity)
224
+ : num_inserts_(0), num_lookups_(0), inject_failure_(false) {
225
+ cache_ = NewLRUCache(capacity, 0, false, 0.5, nullptr,
226
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
227
+ }
228
+ ~TestSecondaryCache() override { cache_.reset(); }
229
+
230
+ const char* Name() const override { return "TestSecondaryCache"; }
231
+
232
+ void InjectFailure() { inject_failure_ = true; }
233
+
234
+ void ResetInjectFailure() { inject_failure_ = false; }
235
+
236
+ void SetDbSessionId(const std::string& db_session_id) {
237
+ // NOTE: we assume the file is smaller than kMaxFileSizeStandardEncoding
238
+ // for this to work, but that's safe in a test.
239
+ auto base = OffsetableCacheKey("unknown", db_session_id, 1, 1);
240
+ ckey_prefix_ = base.CommonPrefixSlice().ToString();
241
+ }
242
+
243
+ Status Insert(const Slice& key, void* value,
244
+ const Cache::CacheItemHelper* helper) override {
245
+ if (inject_failure_) {
246
+ return Status::Corruption("Insertion Data Corrupted");
247
+ }
248
+ EXPECT_TRUE(IsDbSessionLowerAsKeyPrefix(key));
249
+ size_t size;
250
+ char* buf;
251
+ Status s;
252
+
253
+ num_inserts_++;
254
+ size = (*helper->size_cb)(value);
255
+ buf = new char[size + sizeof(uint64_t)];
256
+ EncodeFixed64(buf, size);
257
+ s = (*helper->saveto_cb)(value, 0, size, buf + sizeof(uint64_t));
258
+ if (!s.ok()) {
259
+ delete[] buf;
260
+ return s;
261
+ }
262
+ return cache_->Insert(key, buf, size,
263
+ [](const Slice& /*key*/, void* val) -> void {
264
+ delete[] static_cast<char*>(val);
265
+ });
266
+ }
267
+
268
+ std::unique_ptr<SecondaryCacheResultHandle> Lookup(
269
+ const Slice& key, const Cache::CreateCallback& create_cb, bool /*wait*/,
270
+ bool& is_in_sec_cache) override {
271
+ std::string key_str = key.ToString();
272
+ TEST_SYNC_POINT_CALLBACK("TestSecondaryCache::Lookup", &key_str);
273
+
274
+ std::unique_ptr<SecondaryCacheResultHandle> secondary_handle;
275
+ is_in_sec_cache = false;
276
+ ResultType type = ResultType::SUCCESS;
277
+ auto iter = result_map_.find(key.ToString());
278
+ if (iter != result_map_.end()) {
279
+ type = iter->second;
280
+ }
281
+ if (type == ResultType::FAIL) {
282
+ return secondary_handle;
283
+ }
284
+
285
+ Cache::Handle* handle = cache_->Lookup(key);
286
+ num_lookups_++;
287
+ if (handle) {
288
+ void* value = nullptr;
289
+ size_t charge = 0;
290
+ Status s;
291
+ if (type != ResultType::DEFER_AND_FAIL) {
292
+ char* ptr = (char*)cache_->Value(handle);
293
+ size_t size = DecodeFixed64(ptr);
294
+ ptr += sizeof(uint64_t);
295
+ s = create_cb(ptr, size, &value, &charge);
296
+ }
297
+ if (s.ok()) {
298
+ secondary_handle.reset(new TestSecondaryCacheResultHandle(
299
+ cache_.get(), handle, value, charge, type));
300
+ is_in_sec_cache = true;
301
+ } else {
302
+ cache_->Release(handle);
303
+ }
304
+ }
305
+ return secondary_handle;
306
+ }
307
+
308
+ void Erase(const Slice& /*key*/) override {}
309
+
310
+ void WaitAll(std::vector<SecondaryCacheResultHandle*> handles) override {
311
+ for (SecondaryCacheResultHandle* handle : handles) {
312
+ TestSecondaryCacheResultHandle* sec_handle =
313
+ static_cast<TestSecondaryCacheResultHandle*>(handle);
314
+ sec_handle->SetReady();
315
+ }
316
+ }
317
+
318
+ std::string GetPrintableOptions() const override { return ""; }
319
+
320
+ void SetResultMap(ResultMap&& map) { result_map_ = std::move(map); }
321
+
322
+ uint32_t num_inserts() { return num_inserts_; }
323
+
324
+ uint32_t num_lookups() { return num_lookups_; }
325
+
326
+ bool IsDbSessionLowerAsKeyPrefix(const Slice& key) {
327
+ return key.starts_with(ckey_prefix_);
328
+ }
329
+
330
+ private:
331
+ class TestSecondaryCacheResultHandle : public SecondaryCacheResultHandle {
332
+ public:
333
+ TestSecondaryCacheResultHandle(Cache* cache, Cache::Handle* handle,
334
+ void* value, size_t size, ResultType type)
335
+ : cache_(cache),
336
+ handle_(handle),
337
+ value_(value),
338
+ size_(size),
339
+ is_ready_(true) {
340
+ if (type != ResultType::SUCCESS) {
341
+ is_ready_ = false;
342
+ }
343
+ }
344
+
345
+ ~TestSecondaryCacheResultHandle() override { cache_->Release(handle_); }
346
+
347
+ bool IsReady() override { return is_ready_; }
348
+
349
+ void Wait() override {}
350
+
351
+ void* Value() override {
352
+ assert(is_ready_);
353
+ return value_;
354
+ }
355
+
356
+ size_t Size() override { return Value() ? size_ : 0; }
357
+
358
+ void SetReady() { is_ready_ = true; }
359
+
360
+ private:
361
+ Cache* cache_;
362
+ Cache::Handle* handle_;
363
+ void* value_;
364
+ size_t size_;
365
+ bool is_ready_;
366
+ };
367
+
368
+ std::shared_ptr<Cache> cache_;
369
+ uint32_t num_inserts_;
370
+ uint32_t num_lookups_;
371
+ bool inject_failure_;
372
+ std::string ckey_prefix_;
373
+ ResultMap result_map_;
374
+ };
375
+
376
+ class DBSecondaryCacheTest : public DBTestBase {
377
+ public:
378
+ DBSecondaryCacheTest()
379
+ : DBTestBase("db_secondary_cache_test", /*env_do_fsync=*/true) {
380
+ fault_fs_.reset(new FaultInjectionTestFS(env_->GetFileSystem()));
381
+ fault_env_.reset(new CompositeEnvWrapper(env_, fault_fs_));
382
+ }
383
+
384
+ std::shared_ptr<FaultInjectionTestFS> fault_fs_;
385
+ std::unique_ptr<Env> fault_env_;
386
+ };
387
+
388
+ class LRUCacheSecondaryCacheTest : public LRUCacheTest {
389
+ public:
390
+ LRUCacheSecondaryCacheTest() : fail_create_(false) {}
391
+ ~LRUCacheSecondaryCacheTest() {}
392
+
393
+ protected:
394
+ class TestItem {
395
+ public:
396
+ TestItem(const char* buf, size_t size) : buf_(new char[size]), size_(size) {
397
+ memcpy(buf_.get(), buf, size);
398
+ }
399
+ ~TestItem() {}
400
+
401
+ char* Buf() { return buf_.get(); }
402
+ size_t Size() { return size_; }
403
+ std::string ToString() { return std::string(Buf(), Size()); }
404
+
405
+ private:
406
+ std::unique_ptr<char[]> buf_;
407
+ size_t size_;
408
+ };
409
+
410
+ static size_t SizeCallback(void* obj) {
411
+ return reinterpret_cast<TestItem*>(obj)->Size();
412
+ }
413
+
414
+ static Status SaveToCallback(void* from_obj, size_t from_offset,
415
+ size_t length, void* out) {
416
+ TestItem* item = reinterpret_cast<TestItem*>(from_obj);
417
+ char* buf = item->Buf();
418
+ EXPECT_EQ(length, item->Size());
419
+ EXPECT_EQ(from_offset, 0);
420
+ memcpy(out, buf, length);
421
+ return Status::OK();
422
+ }
423
+
424
+ static void DeletionCallback(const Slice& /*key*/, void* obj) {
425
+ delete reinterpret_cast<TestItem*>(obj);
426
+ }
427
+
428
+ static Cache::CacheItemHelper helper_;
429
+
430
+ static Status SaveToCallbackFail(void* /*obj*/, size_t /*offset*/,
431
+ size_t /*size*/, void* /*out*/) {
432
+ return Status::NotSupported();
433
+ }
434
+
435
+ static Cache::CacheItemHelper helper_fail_;
436
+
437
+ Cache::CreateCallback test_item_creator = [&](const void* buf, size_t size,
438
+ void** out_obj,
439
+ size_t* charge) -> Status {
440
+ if (fail_create_) {
441
+ return Status::NotSupported();
442
+ }
443
+ *out_obj = reinterpret_cast<void*>(new TestItem((char*)buf, size));
444
+ *charge = size;
445
+ return Status::OK();
446
+ };
447
+
448
+ void SetFailCreate(bool fail) { fail_create_ = fail; }
449
+
450
+ private:
451
+ bool fail_create_;
452
+ };
453
+
454
+ Cache::CacheItemHelper LRUCacheSecondaryCacheTest::helper_(
455
+ LRUCacheSecondaryCacheTest::SizeCallback,
456
+ LRUCacheSecondaryCacheTest::SaveToCallback,
457
+ LRUCacheSecondaryCacheTest::DeletionCallback);
458
+
459
+ Cache::CacheItemHelper LRUCacheSecondaryCacheTest::helper_fail_(
460
+ LRUCacheSecondaryCacheTest::SizeCallback,
461
+ LRUCacheSecondaryCacheTest::SaveToCallbackFail,
462
+ LRUCacheSecondaryCacheTest::DeletionCallback);
463
+
464
+ TEST_F(LRUCacheSecondaryCacheTest, BasicTest) {
465
+ LRUCacheOptions opts(1024, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
466
+ kDontChargeCacheMetadata);
467
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
468
+ std::make_shared<TestSecondaryCache>(2048);
469
+ opts.secondary_cache = secondary_cache;
470
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
471
+ std::shared_ptr<Statistics> stats = CreateDBStatistics();
472
+
473
+ Random rnd(301);
474
+ std::string str1 = rnd.RandomString(1020);
475
+ TestItem* item1 = new TestItem(str1.data(), str1.length());
476
+ ASSERT_OK(cache->Insert("k1", item1, &LRUCacheSecondaryCacheTest::helper_,
477
+ str1.length()));
478
+ std::string str2 = rnd.RandomString(1020);
479
+ TestItem* item2 = new TestItem(str2.data(), str2.length());
480
+ // k1 should be demoted to NVM
481
+ ASSERT_OK(cache->Insert("k2", item2, &LRUCacheSecondaryCacheTest::helper_,
482
+ str2.length()));
483
+
484
+ get_perf_context()->Reset();
485
+ Cache::Handle* handle;
486
+ handle =
487
+ cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
488
+ test_item_creator, Cache::Priority::LOW, true, stats.get());
489
+ ASSERT_NE(handle, nullptr);
490
+ cache->Release(handle);
491
+ // This lookup should promote k1 and demote k2
492
+ handle =
493
+ cache->Lookup("k1", &LRUCacheSecondaryCacheTest::helper_,
494
+ test_item_creator, Cache::Priority::LOW, true, stats.get());
495
+ ASSERT_NE(handle, nullptr);
496
+ cache->Release(handle);
497
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
498
+ ASSERT_EQ(secondary_cache->num_lookups(), 1u);
499
+ ASSERT_EQ(stats->getTickerCount(SECONDARY_CACHE_HITS),
500
+ secondary_cache->num_lookups());
501
+ PerfContext perf_ctx = *get_perf_context();
502
+ ASSERT_EQ(perf_ctx.secondary_cache_hit_count, secondary_cache->num_lookups());
503
+
504
+ cache.reset();
505
+ secondary_cache.reset();
506
+ }
507
+
508
+ TEST_F(LRUCacheSecondaryCacheTest, BasicFailTest) {
509
+ LRUCacheOptions opts(1024, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
510
+ kDontChargeCacheMetadata);
511
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
512
+ std::make_shared<TestSecondaryCache>(2048);
513
+ opts.secondary_cache = secondary_cache;
514
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
515
+
516
+ Random rnd(301);
517
+ std::string str1 = rnd.RandomString(1020);
518
+ auto item1 = std::make_unique<TestItem>(str1.data(), str1.length());
519
+ ASSERT_TRUE(cache->Insert("k1", item1.get(), nullptr, str1.length())
520
+ .IsInvalidArgument());
521
+ ASSERT_OK(cache->Insert("k1", item1.get(),
522
+ &LRUCacheSecondaryCacheTest::helper_, str1.length()));
523
+ item1.release(); // Appease clang-analyze "potential memory leak"
524
+
525
+ Cache::Handle* handle;
526
+ handle = cache->Lookup("k2", nullptr, test_item_creator, Cache::Priority::LOW,
527
+ true);
528
+ ASSERT_EQ(handle, nullptr);
529
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
530
+ test_item_creator, Cache::Priority::LOW, false);
531
+ ASSERT_EQ(handle, nullptr);
532
+
533
+ cache.reset();
534
+ secondary_cache.reset();
535
+ }
536
+
537
+ TEST_F(LRUCacheSecondaryCacheTest, SaveFailTest) {
538
+ LRUCacheOptions opts(1024, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
539
+ kDontChargeCacheMetadata);
540
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
541
+ std::make_shared<TestSecondaryCache>(2048);
542
+ opts.secondary_cache = secondary_cache;
543
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
544
+
545
+ Random rnd(301);
546
+ std::string str1 = rnd.RandomString(1020);
547
+ TestItem* item1 = new TestItem(str1.data(), str1.length());
548
+ ASSERT_OK(cache->Insert(
549
+ "k1", item1, &LRUCacheSecondaryCacheTest::helper_fail_, str1.length()));
550
+ std::string str2 = rnd.RandomString(1020);
551
+ TestItem* item2 = new TestItem(str2.data(), str2.length());
552
+ // k1 should be demoted to NVM
553
+ ASSERT_OK(cache->Insert(
554
+ "k2", item2, &LRUCacheSecondaryCacheTest::helper_fail_, str2.length()));
555
+
556
+ Cache::Handle* handle;
557
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_fail_,
558
+ test_item_creator, Cache::Priority::LOW, true);
559
+ ASSERT_NE(handle, nullptr);
560
+ cache->Release(handle);
561
+ // This lookup should fail, since k1 demotion would have failed
562
+ handle = cache->Lookup("k1", &LRUCacheSecondaryCacheTest::helper_fail_,
563
+ test_item_creator, Cache::Priority::LOW, true);
564
+ ASSERT_EQ(handle, nullptr);
565
+ // Since k1 didn't get promoted, k2 should still be in cache
566
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_fail_,
567
+ test_item_creator, Cache::Priority::LOW, true);
568
+ ASSERT_NE(handle, nullptr);
569
+ cache->Release(handle);
570
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
571
+ ASSERT_EQ(secondary_cache->num_lookups(), 1u);
572
+
573
+ cache.reset();
574
+ secondary_cache.reset();
575
+ }
576
+
577
+ TEST_F(LRUCacheSecondaryCacheTest, CreateFailTest) {
578
+ LRUCacheOptions opts(1024, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
579
+ kDontChargeCacheMetadata);
580
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
581
+ std::make_shared<TestSecondaryCache>(2048);
582
+ opts.secondary_cache = secondary_cache;
583
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
584
+
585
+ Random rnd(301);
586
+ std::string str1 = rnd.RandomString(1020);
587
+ TestItem* item1 = new TestItem(str1.data(), str1.length());
588
+ ASSERT_OK(cache->Insert("k1", item1, &LRUCacheSecondaryCacheTest::helper_,
589
+ str1.length()));
590
+ std::string str2 = rnd.RandomString(1020);
591
+ TestItem* item2 = new TestItem(str2.data(), str2.length());
592
+ // k1 should be demoted to NVM
593
+ ASSERT_OK(cache->Insert("k2", item2, &LRUCacheSecondaryCacheTest::helper_,
594
+ str2.length()));
595
+
596
+ Cache::Handle* handle;
597
+ SetFailCreate(true);
598
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
599
+ test_item_creator, Cache::Priority::LOW, true);
600
+ ASSERT_NE(handle, nullptr);
601
+ cache->Release(handle);
602
+ // This lookup should fail, since k1 creation would have failed
603
+ handle = cache->Lookup("k1", &LRUCacheSecondaryCacheTest::helper_,
604
+ test_item_creator, Cache::Priority::LOW, true);
605
+ ASSERT_EQ(handle, nullptr);
606
+ // Since k1 didn't get promoted, k2 should still be in cache
607
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
608
+ test_item_creator, Cache::Priority::LOW, true);
609
+ ASSERT_NE(handle, nullptr);
610
+ cache->Release(handle);
611
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
612
+ ASSERT_EQ(secondary_cache->num_lookups(), 1u);
613
+
614
+ cache.reset();
615
+ secondary_cache.reset();
616
+ }
617
+
618
+ TEST_F(LRUCacheSecondaryCacheTest, FullCapacityTest) {
619
+ LRUCacheOptions opts(1024, 0, /*_strict_capacity_limit=*/true, 0.5, nullptr,
620
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
621
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
622
+ std::make_shared<TestSecondaryCache>(2048);
623
+ opts.secondary_cache = secondary_cache;
624
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
625
+
626
+ Random rnd(301);
627
+ std::string str1 = rnd.RandomString(1020);
628
+ TestItem* item1 = new TestItem(str1.data(), str1.length());
629
+ ASSERT_OK(cache->Insert("k1", item1, &LRUCacheSecondaryCacheTest::helper_,
630
+ str1.length()));
631
+ std::string str2 = rnd.RandomString(1020);
632
+ TestItem* item2 = new TestItem(str2.data(), str2.length());
633
+ // k1 should be demoted to NVM
634
+ ASSERT_OK(cache->Insert("k2", item2, &LRUCacheSecondaryCacheTest::helper_,
635
+ str2.length()));
636
+
637
+ Cache::Handle* handle;
638
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
639
+ test_item_creator, Cache::Priority::LOW, true);
640
+ ASSERT_NE(handle, nullptr);
641
+ // k1 promotion should fail due to the block cache being at capacity,
642
+ // but the lookup should still succeed
643
+ Cache::Handle* handle2;
644
+ handle2 = cache->Lookup("k1", &LRUCacheSecondaryCacheTest::helper_,
645
+ test_item_creator, Cache::Priority::LOW, true);
646
+ ASSERT_NE(handle2, nullptr);
647
+ // Since k1 didn't get inserted, k2 should still be in cache
648
+ cache->Release(handle);
649
+ cache->Release(handle2);
650
+ handle = cache->Lookup("k2", &LRUCacheSecondaryCacheTest::helper_,
651
+ test_item_creator, Cache::Priority::LOW, true);
652
+ ASSERT_NE(handle, nullptr);
653
+ cache->Release(handle);
654
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
655
+ ASSERT_EQ(secondary_cache->num_lookups(), 1u);
656
+
657
+ cache.reset();
658
+ secondary_cache.reset();
659
+ }
660
+
661
+ // In this test, the block cache size is set to 4096, after insert 6 KV-pairs
662
+ // and flush, there are 5 blocks in this SST file, 2 data blocks and 3 meta
663
+ // blocks. block_1 size is 4096 and block_2 size is 2056. The total size
664
+ // of the meta blocks are about 900 to 1000. Therefore, in any situation,
665
+ // if we try to insert block_1 to the block cache, it will always fails. Only
666
+ // block_2 will be successfully inserted into the block cache.
667
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheCorrectness1) {
668
+ LRUCacheOptions opts(4 * 1024, 0, false, 0.5, nullptr,
669
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
670
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
671
+ new TestSecondaryCache(2048 * 1024));
672
+ opts.secondary_cache = secondary_cache;
673
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
674
+ BlockBasedTableOptions table_options;
675
+ table_options.block_cache = cache;
676
+ table_options.block_size = 4 * 1024;
677
+ Options options = GetDefaultOptions();
678
+ options.create_if_missing = true;
679
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
680
+ options.env = fault_env_.get();
681
+ fault_fs_->SetFailGetUniqueId(true);
682
+
683
+ // Set the file paranoid check, so after flush, the file will be read
684
+ // all the blocks will be accessed.
685
+ options.paranoid_file_checks = true;
686
+ DestroyAndReopen(options);
687
+ std::string session_id;
688
+ ASSERT_OK(db_->GetDbSessionId(session_id));
689
+ secondary_cache->SetDbSessionId(session_id);
690
+ Random rnd(301);
691
+ const int N = 6;
692
+ for (int i = 0; i < N; i++) {
693
+ std::string p_v = rnd.RandomString(1007);
694
+ ASSERT_OK(Put(Key(i), p_v));
695
+ }
696
+
697
+ ASSERT_OK(Flush());
698
+ // After Flush is successful, RocksDB will do the paranoid check for the new
699
+ // SST file. Meta blocks are always cached in the block cache and they
700
+ // will not be evicted. When block_2 is cache miss and read out, it is
701
+ // inserted to the block cache. Note that, block_1 is never successfully
702
+ // inserted to the block cache. Here are 2 lookups in the secondary cache
703
+ // for block_1 and block_2
704
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
705
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
706
+
707
+ Compact("a", "z");
708
+ // Compaction will create the iterator to scan the whole file. So all the
709
+ // blocks are needed. Meta blocks are always cached. When block_1 is read
710
+ // out, block_2 is evicted from block cache and inserted to secondary
711
+ // cache.
712
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
713
+ ASSERT_EQ(secondary_cache->num_lookups(), 3u);
714
+
715
+ std::string v = Get(Key(0));
716
+ ASSERT_EQ(1007, v.size());
717
+ // The first data block is not in the cache, similarly, trigger the block
718
+ // cache Lookup and secondary cache lookup for block_1. But block_1 will not
719
+ // be inserted successfully due to the size. Currently, cache only has
720
+ // the meta blocks.
721
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
722
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
723
+
724
+ v = Get(Key(5));
725
+ ASSERT_EQ(1007, v.size());
726
+ // The second data block is not in the cache, similarly, trigger the block
727
+ // cache Lookup and secondary cache lookup for block_2 and block_2 is found
728
+ // in the secondary cache. Now block cache has block_2
729
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
730
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
731
+
732
+ v = Get(Key(5));
733
+ ASSERT_EQ(1007, v.size());
734
+ // block_2 is in the block cache. There is a block cache hit. No need to
735
+ // lookup or insert the secondary cache.
736
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
737
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
738
+
739
+ v = Get(Key(0));
740
+ ASSERT_EQ(1007, v.size());
741
+ // Lookup the first data block, not in the block cache, so lookup the
742
+ // secondary cache. Also not in the secondary cache. After Get, still
743
+ // block_1 is will not be cached.
744
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
745
+ ASSERT_EQ(secondary_cache->num_lookups(), 6u);
746
+
747
+ v = Get(Key(0));
748
+ ASSERT_EQ(1007, v.size());
749
+ // Lookup the first data block, not in the block cache, so lookup the
750
+ // secondary cache. Also not in the secondary cache. After Get, still
751
+ // block_1 is will not be cached.
752
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
753
+ ASSERT_EQ(secondary_cache->num_lookups(), 7u);
754
+
755
+ Destroy(options);
756
+ }
757
+
758
+ // In this test, the block cache size is set to 6100, after insert 6 KV-pairs
759
+ // and flush, there are 5 blocks in this SST file, 2 data blocks and 3 meta
760
+ // blocks. block_1 size is 4096 and block_2 size is 2056. The total size
761
+ // of the meta blocks are about 900 to 1000. Therefore, we can successfully
762
+ // insert and cache block_1 in the block cache (this is the different place
763
+ // from TestSecondaryCacheCorrectness1)
764
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheCorrectness2) {
765
+ LRUCacheOptions opts(6100, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
766
+ kDontChargeCacheMetadata);
767
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
768
+ new TestSecondaryCache(2048 * 1024));
769
+ opts.secondary_cache = secondary_cache;
770
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
771
+ BlockBasedTableOptions table_options;
772
+ table_options.block_cache = cache;
773
+ table_options.block_size = 4 * 1024;
774
+ Options options = GetDefaultOptions();
775
+ options.create_if_missing = true;
776
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
777
+ options.paranoid_file_checks = true;
778
+ options.env = fault_env_.get();
779
+ fault_fs_->SetFailGetUniqueId(true);
780
+ DestroyAndReopen(options);
781
+ std::string session_id;
782
+ ASSERT_OK(db_->GetDbSessionId(session_id));
783
+ secondary_cache->SetDbSessionId(session_id);
784
+ Random rnd(301);
785
+ const int N = 6;
786
+ for (int i = 0; i < N; i++) {
787
+ std::string p_v = rnd.RandomString(1007);
788
+ ASSERT_OK(Put(Key(i), p_v));
789
+ }
790
+
791
+ ASSERT_OK(Flush());
792
+ // After Flush is successful, RocksDB will do the paranoid check for the new
793
+ // SST file. Meta blocks are always cached in the block cache and they
794
+ // will not be evicted. When block_2 is cache miss and read out, it is
795
+ // inserted to the block cache. Thefore, block_1 is evicted from block
796
+ // cache and successfully inserted to the secondary cache. Here are 2
797
+ // lookups in the secondary cache for block_1 and block_2.
798
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
799
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
800
+
801
+ Compact("a", "z");
802
+ // Compaction will create the iterator to scan the whole file. So all the
803
+ // blocks are needed. After Flush, only block_2 is cached in block cache
804
+ // and block_1 is in the secondary cache. So when read block_1, it is
805
+ // read out from secondary cache and inserted to block cache. At the same
806
+ // time, block_2 is inserted to secondary cache. Now, secondary cache has
807
+ // both block_1 and block_2. After compaction, block_1 is in the cache.
808
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
809
+ ASSERT_EQ(secondary_cache->num_lookups(), 3u);
810
+
811
+ std::string v = Get(Key(0));
812
+ ASSERT_EQ(1007, v.size());
813
+ // This Get needs to access block_1, since block_1 is cached in block cache
814
+ // there is no secondary cache lookup.
815
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
816
+ ASSERT_EQ(secondary_cache->num_lookups(), 3u);
817
+
818
+ v = Get(Key(5));
819
+ ASSERT_EQ(1007, v.size());
820
+ // This Get needs to access block_2 which is not in the block cache. So
821
+ // it will lookup the secondary cache for block_2 and cache it in the
822
+ // block_cache.
823
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
824
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
825
+
826
+ v = Get(Key(5));
827
+ ASSERT_EQ(1007, v.size());
828
+ // This Get needs to access block_2 which is already in the block cache.
829
+ // No need to lookup secondary cache.
830
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
831
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
832
+
833
+ v = Get(Key(0));
834
+ ASSERT_EQ(1007, v.size());
835
+ // This Get needs to access block_1, since block_1 is not in block cache
836
+ // there is one econdary cache lookup. Then, block_1 is cached in the
837
+ // block cache.
838
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
839
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
840
+
841
+ v = Get(Key(0));
842
+ ASSERT_EQ(1007, v.size());
843
+ // This Get needs to access block_1, since block_1 is cached in block cache
844
+ // there is no secondary cache lookup.
845
+ ASSERT_EQ(secondary_cache->num_inserts(), 2u);
846
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
847
+
848
+ Destroy(options);
849
+ }
850
+
851
+ // The block cache size is set to 1024*1024, after insert 6 KV-pairs
852
+ // and flush, there are 5 blocks in this SST file, 2 data blocks and 3 meta
853
+ // blocks. block_1 size is 4096 and block_2 size is 2056. The total size
854
+ // of the meta blocks are about 900 to 1000. Therefore, we can successfully
855
+ // cache all the blocks in the block cache and there is not secondary cache
856
+ // insertion. 2 lookup is needed for the blocks.
857
+ TEST_F(DBSecondaryCacheTest, NoSecondaryCacheInsertion) {
858
+ LRUCacheOptions opts(1024 * 1024, 0, false, 0.5, nullptr,
859
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
860
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
861
+ new TestSecondaryCache(2048 * 1024));
862
+ opts.secondary_cache = secondary_cache;
863
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
864
+ BlockBasedTableOptions table_options;
865
+ table_options.block_cache = cache;
866
+ table_options.block_size = 4 * 1024;
867
+ Options options = GetDefaultOptions();
868
+ options.create_if_missing = true;
869
+ options.paranoid_file_checks = true;
870
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
871
+ options.env = fault_env_.get();
872
+ fault_fs_->SetFailGetUniqueId(true);
873
+
874
+ DestroyAndReopen(options);
875
+ std::string session_id;
876
+ ASSERT_OK(db_->GetDbSessionId(session_id));
877
+ secondary_cache->SetDbSessionId(session_id);
878
+ Random rnd(301);
879
+ const int N = 6;
880
+ for (int i = 0; i < N; i++) {
881
+ std::string p_v = rnd.RandomString(1000);
882
+ ASSERT_OK(Put(Key(i), p_v));
883
+ }
884
+
885
+ ASSERT_OK(Flush());
886
+ // After Flush is successful, RocksDB will do the paranoid check for the new
887
+ // SST file. Meta blocks are always cached in the block cache and they
888
+ // will not be evicted. Now, block cache is large enough, it cache
889
+ // both block_1 and block_2. When first time read block_1 and block_2
890
+ // there are cache misses. So 2 secondary cache lookups are needed for
891
+ // the 2 blocks
892
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
893
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
894
+
895
+ Compact("a", "z");
896
+ // Compaction will iterate the whole SST file. Since all the data blocks
897
+ // are in the block cache. No need to lookup the secondary cache.
898
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
899
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
900
+
901
+ std::string v = Get(Key(0));
902
+ ASSERT_EQ(1000, v.size());
903
+ // Since the block cache is large enough, all the blocks are cached. we
904
+ // do not need to lookup the seondary cache.
905
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
906
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
907
+
908
+ Destroy(options);
909
+ }
910
+
911
+ TEST_F(DBSecondaryCacheTest, SecondaryCacheIntensiveTesting) {
912
+ LRUCacheOptions opts(8 * 1024, 0, false, 0.5, nullptr,
913
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
914
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
915
+ new TestSecondaryCache(2048 * 1024));
916
+ opts.secondary_cache = secondary_cache;
917
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
918
+ BlockBasedTableOptions table_options;
919
+ table_options.block_cache = cache;
920
+ table_options.block_size = 4 * 1024;
921
+ Options options = GetDefaultOptions();
922
+ options.create_if_missing = true;
923
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
924
+ options.env = fault_env_.get();
925
+ fault_fs_->SetFailGetUniqueId(true);
926
+ DestroyAndReopen(options);
927
+ std::string session_id;
928
+ ASSERT_OK(db_->GetDbSessionId(session_id));
929
+ secondary_cache->SetDbSessionId(session_id);
930
+ Random rnd(301);
931
+ const int N = 256;
932
+ for (int i = 0; i < N; i++) {
933
+ std::string p_v = rnd.RandomString(1000);
934
+ ASSERT_OK(Put(Key(i), p_v));
935
+ }
936
+ ASSERT_OK(Flush());
937
+ Compact("a", "z");
938
+
939
+ Random r_index(47);
940
+ std::string v;
941
+ for (int i = 0; i < 1000; i++) {
942
+ uint32_t key_i = r_index.Next() % N;
943
+ v = Get(Key(key_i));
944
+ }
945
+
946
+ // We have over 200 data blocks there will be multiple insertion
947
+ // and lookups.
948
+ ASSERT_GE(secondary_cache->num_inserts(), 1u);
949
+ ASSERT_GE(secondary_cache->num_lookups(), 1u);
950
+
951
+ Destroy(options);
952
+ }
953
+
954
+ // In this test, the block cache size is set to 4096, after insert 6 KV-pairs
955
+ // and flush, there are 5 blocks in this SST file, 2 data blocks and 3 meta
956
+ // blocks. block_1 size is 4096 and block_2 size is 2056. The total size
957
+ // of the meta blocks are about 900 to 1000. Therefore, in any situation,
958
+ // if we try to insert block_1 to the block cache, it will always fails. Only
959
+ // block_2 will be successfully inserted into the block cache.
960
+ TEST_F(DBSecondaryCacheTest, SecondaryCacheFailureTest) {
961
+ LRUCacheOptions opts(4 * 1024, 0, false, 0.5, nullptr,
962
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
963
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
964
+ new TestSecondaryCache(2048 * 1024));
965
+ opts.secondary_cache = secondary_cache;
966
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
967
+ BlockBasedTableOptions table_options;
968
+ table_options.block_cache = cache;
969
+ table_options.block_size = 4 * 1024;
970
+ Options options = GetDefaultOptions();
971
+ options.create_if_missing = true;
972
+ options.paranoid_file_checks = true;
973
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
974
+ options.env = fault_env_.get();
975
+ fault_fs_->SetFailGetUniqueId(true);
976
+ DestroyAndReopen(options);
977
+ std::string session_id;
978
+ ASSERT_OK(db_->GetDbSessionId(session_id));
979
+ secondary_cache->SetDbSessionId(session_id);
980
+ Random rnd(301);
981
+ const int N = 6;
982
+ for (int i = 0; i < N; i++) {
983
+ std::string p_v = rnd.RandomString(1007);
984
+ ASSERT_OK(Put(Key(i), p_v));
985
+ }
986
+
987
+ ASSERT_OK(Flush());
988
+ // After Flush is successful, RocksDB will do the paranoid check for the new
989
+ // SST file. Meta blocks are always cached in the block cache and they
990
+ // will not be evicted. When block_2 is cache miss and read out, it is
991
+ // inserted to the block cache. Note that, block_1 is never successfully
992
+ // inserted to the block cache. Here are 2 lookups in the secondary cache
993
+ // for block_1 and block_2
994
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
995
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
996
+
997
+ // Fail the insertion, in LRU cache, the secondary insertion returned status
998
+ // is not checked, therefore, the DB will not be influenced.
999
+ secondary_cache->InjectFailure();
1000
+ Compact("a", "z");
1001
+ // Compaction will create the iterator to scan the whole file. So all the
1002
+ // blocks are needed. Meta blocks are always cached. When block_1 is read
1003
+ // out, block_2 is evicted from block cache and inserted to secondary
1004
+ // cache.
1005
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1006
+ ASSERT_EQ(secondary_cache->num_lookups(), 3u);
1007
+
1008
+ std::string v = Get(Key(0));
1009
+ ASSERT_EQ(1007, v.size());
1010
+ // The first data block is not in the cache, similarly, trigger the block
1011
+ // cache Lookup and secondary cache lookup for block_1. But block_1 will not
1012
+ // be inserted successfully due to the size. Currently, cache only has
1013
+ // the meta blocks.
1014
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1015
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
1016
+
1017
+ v = Get(Key(5));
1018
+ ASSERT_EQ(1007, v.size());
1019
+ // The second data block is not in the cache, similarly, trigger the block
1020
+ // cache Lookup and secondary cache lookup for block_2 and block_2 is found
1021
+ // in the secondary cache. Now block cache has block_2
1022
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1023
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
1024
+
1025
+ v = Get(Key(5));
1026
+ ASSERT_EQ(1007, v.size());
1027
+ // block_2 is in the block cache. There is a block cache hit. No need to
1028
+ // lookup or insert the secondary cache.
1029
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1030
+ ASSERT_EQ(secondary_cache->num_lookups(), 5u);
1031
+
1032
+ v = Get(Key(0));
1033
+ ASSERT_EQ(1007, v.size());
1034
+ // Lookup the first data block, not in the block cache, so lookup the
1035
+ // secondary cache. Also not in the secondary cache. After Get, still
1036
+ // block_1 is will not be cached.
1037
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1038
+ ASSERT_EQ(secondary_cache->num_lookups(), 6u);
1039
+
1040
+ v = Get(Key(0));
1041
+ ASSERT_EQ(1007, v.size());
1042
+ // Lookup the first data block, not in the block cache, so lookup the
1043
+ // secondary cache. Also not in the secondary cache. After Get, still
1044
+ // block_1 is will not be cached.
1045
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1046
+ ASSERT_EQ(secondary_cache->num_lookups(), 7u);
1047
+ secondary_cache->ResetInjectFailure();
1048
+
1049
+ Destroy(options);
1050
+ }
1051
+
1052
+ TEST_F(LRUCacheSecondaryCacheTest, BasicWaitAllTest) {
1053
+ LRUCacheOptions opts(1024, 2, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
1054
+ kDontChargeCacheMetadata);
1055
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
1056
+ std::make_shared<TestSecondaryCache>(32 * 1024);
1057
+ opts.secondary_cache = secondary_cache;
1058
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
1059
+ const int num_keys = 32;
1060
+
1061
+ Random rnd(301);
1062
+ std::vector<std::string> values;
1063
+ for (int i = 0; i < num_keys; ++i) {
1064
+ std::string str = rnd.RandomString(1020);
1065
+ values.emplace_back(str);
1066
+ TestItem* item = new TestItem(str.data(), str.length());
1067
+ ASSERT_OK(cache->Insert("k" + std::to_string(i), item,
1068
+ &LRUCacheSecondaryCacheTest::helper_,
1069
+ str.length()));
1070
+ }
1071
+ // Force all entries to be evicted to the secondary cache
1072
+ cache->SetCapacity(0);
1073
+ ASSERT_EQ(secondary_cache->num_inserts(), 32u);
1074
+ cache->SetCapacity(32 * 1024);
1075
+
1076
+ secondary_cache->SetResultMap(
1077
+ {{"k3", TestSecondaryCache::ResultType::DEFER},
1078
+ {"k4", TestSecondaryCache::ResultType::DEFER_AND_FAIL},
1079
+ {"k5", TestSecondaryCache::ResultType::FAIL}});
1080
+ std::vector<Cache::Handle*> results;
1081
+ for (int i = 0; i < 6; ++i) {
1082
+ results.emplace_back(cache->Lookup(
1083
+ "k" + std::to_string(i), &LRUCacheSecondaryCacheTest::helper_,
1084
+ test_item_creator, Cache::Priority::LOW, false));
1085
+ }
1086
+ cache->WaitAll(results);
1087
+ for (int i = 0; i < 6; ++i) {
1088
+ if (i == 4) {
1089
+ ASSERT_EQ(cache->Value(results[i]), nullptr);
1090
+ } else if (i == 5) {
1091
+ ASSERT_EQ(results[i], nullptr);
1092
+ continue;
1093
+ } else {
1094
+ TestItem* item = static_cast<TestItem*>(cache->Value(results[i]));
1095
+ ASSERT_EQ(item->ToString(), values[i]);
1096
+ }
1097
+ cache->Release(results[i]);
1098
+ }
1099
+
1100
+ cache.reset();
1101
+ secondary_cache.reset();
1102
+ }
1103
+
1104
+ // In this test, we have one KV pair per data block. We indirectly determine
1105
+ // the cache key associated with each data block (and thus each KV) by using
1106
+ // a sync point callback in TestSecondaryCache::Lookup. We then control the
1107
+ // lookup result by setting the ResultMap.
1108
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheMultiGet) {
1109
+ LRUCacheOptions opts(1 << 20, 0, false, 0.5, nullptr, kDefaultToAdaptiveMutex,
1110
+ kDontChargeCacheMetadata);
1111
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
1112
+ new TestSecondaryCache(2048 * 1024));
1113
+ opts.secondary_cache = secondary_cache;
1114
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
1115
+ BlockBasedTableOptions table_options;
1116
+ table_options.block_cache = cache;
1117
+ table_options.block_size = 4 * 1024;
1118
+ table_options.cache_index_and_filter_blocks = false;
1119
+ Options options = GetDefaultOptions();
1120
+ options.create_if_missing = true;
1121
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1122
+ options.paranoid_file_checks = true;
1123
+ DestroyAndReopen(options);
1124
+ Random rnd(301);
1125
+ const int N = 8;
1126
+ std::vector<std::string> keys;
1127
+ for (int i = 0; i < N; i++) {
1128
+ std::string p_v = rnd.RandomString(4000);
1129
+ keys.emplace_back(p_v);
1130
+ ASSERT_OK(Put(Key(i), p_v));
1131
+ }
1132
+
1133
+ ASSERT_OK(Flush());
1134
+ // After Flush is successful, RocksDB does the paranoid check for the new
1135
+ // SST file. This will try to lookup all data blocks in the secondary
1136
+ // cache.
1137
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1138
+ ASSERT_EQ(secondary_cache->num_lookups(), 8u);
1139
+
1140
+ cache->SetCapacity(0);
1141
+ ASSERT_EQ(secondary_cache->num_inserts(), 8u);
1142
+ cache->SetCapacity(1 << 20);
1143
+
1144
+ std::vector<std::string> cache_keys;
1145
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1146
+ "TestSecondaryCache::Lookup", [&cache_keys](void* key) -> void {
1147
+ cache_keys.emplace_back(*(static_cast<std::string*>(key)));
1148
+ });
1149
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1150
+ for (int i = 0; i < N; ++i) {
1151
+ std::string v = Get(Key(i));
1152
+ ASSERT_EQ(4000, v.size());
1153
+ ASSERT_EQ(v, keys[i]);
1154
+ }
1155
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1156
+ ASSERT_EQ(secondary_cache->num_lookups(), 16u);
1157
+ cache->SetCapacity(0);
1158
+ cache->SetCapacity(1 << 20);
1159
+
1160
+ ASSERT_EQ(Get(Key(2)), keys[2]);
1161
+ ASSERT_EQ(Get(Key(7)), keys[7]);
1162
+ secondary_cache->SetResultMap(
1163
+ {{cache_keys[3], TestSecondaryCache::ResultType::DEFER},
1164
+ {cache_keys[4], TestSecondaryCache::ResultType::DEFER_AND_FAIL},
1165
+ {cache_keys[5], TestSecondaryCache::ResultType::FAIL}});
1166
+
1167
+ std::vector<std::string> mget_keys(
1168
+ {Key(0), Key(1), Key(2), Key(3), Key(4), Key(5), Key(6), Key(7)});
1169
+ std::vector<PinnableSlice> values(mget_keys.size());
1170
+ std::vector<Status> s(keys.size());
1171
+ std::vector<Slice> key_slices;
1172
+ for (const std::string& key : mget_keys) {
1173
+ key_slices.emplace_back(key);
1174
+ }
1175
+ uint32_t num_lookups = secondary_cache->num_lookups();
1176
+ dbfull()->MultiGet(ReadOptions(), dbfull()->DefaultColumnFamily(),
1177
+ key_slices.size(), key_slices.data(), values.data(),
1178
+ s.data(), false);
1179
+ ASSERT_EQ(secondary_cache->num_lookups(), num_lookups + 5);
1180
+ for (int i = 0; i < N; ++i) {
1181
+ ASSERT_OK(s[i]);
1182
+ ASSERT_EQ(values[i].ToString(), keys[i]);
1183
+ values[i].Reset();
1184
+ }
1185
+ Destroy(options);
1186
+ }
1187
+
1188
+ class LRUCacheWithStat : public LRUCache {
1189
+ public:
1190
+ LRUCacheWithStat(
1191
+ size_t _capacity, int _num_shard_bits, bool _strict_capacity_limit,
1192
+ double _high_pri_pool_ratio,
1193
+ std::shared_ptr<MemoryAllocator> _memory_allocator = nullptr,
1194
+ bool _use_adaptive_mutex = kDefaultToAdaptiveMutex,
1195
+ CacheMetadataChargePolicy _metadata_charge_policy =
1196
+ kDontChargeCacheMetadata,
1197
+ const std::shared_ptr<SecondaryCache>& _secondary_cache = nullptr)
1198
+ : LRUCache(_capacity, _num_shard_bits, _strict_capacity_limit,
1199
+ _high_pri_pool_ratio, _memory_allocator, _use_adaptive_mutex,
1200
+ _metadata_charge_policy, _secondary_cache) {
1201
+ insert_count_ = 0;
1202
+ lookup_count_ = 0;
1203
+ }
1204
+ ~LRUCacheWithStat() {}
1205
+
1206
+ Status Insert(const Slice& key, void* value, size_t charge, DeleterFn deleter,
1207
+ Handle** handle, Priority priority) override {
1208
+ insert_count_++;
1209
+ return LRUCache::Insert(key, value, charge, deleter, handle, priority);
1210
+ }
1211
+ Status Insert(const Slice& key, void* value, const CacheItemHelper* helper,
1212
+ size_t chargge, Handle** handle = nullptr,
1213
+ Priority priority = Priority::LOW) override {
1214
+ insert_count_++;
1215
+ return LRUCache::Insert(key, value, helper, chargge, handle, priority);
1216
+ }
1217
+ Handle* Lookup(const Slice& key, Statistics* stats) override {
1218
+ lookup_count_++;
1219
+ return LRUCache::Lookup(key, stats);
1220
+ }
1221
+ Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
1222
+ const CreateCallback& create_cb, Priority priority, bool wait,
1223
+ Statistics* stats = nullptr) override {
1224
+ lookup_count_++;
1225
+ return LRUCache::Lookup(key, helper, create_cb, priority, wait, stats);
1226
+ }
1227
+
1228
+ uint32_t GetInsertCount() { return insert_count_; }
1229
+ uint32_t GetLookupcount() { return lookup_count_; }
1230
+ void ResetCount() {
1231
+ insert_count_ = 0;
1232
+ lookup_count_ = 0;
1233
+ }
1234
+
1235
+ private:
1236
+ uint32_t insert_count_;
1237
+ uint32_t lookup_count_;
1238
+ };
1239
+
1240
+ #ifndef ROCKSDB_LITE
1241
+
1242
+ TEST_F(DBSecondaryCacheTest, LRUCacheDumpLoadBasic) {
1243
+ LRUCacheOptions cache_opts(1024 * 1024, 0, false, 0.5, nullptr,
1244
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
1245
+ LRUCacheWithStat* tmp_cache = new LRUCacheWithStat(
1246
+ cache_opts.capacity, cache_opts.num_shard_bits,
1247
+ cache_opts.strict_capacity_limit, cache_opts.high_pri_pool_ratio,
1248
+ cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
1249
+ cache_opts.metadata_charge_policy, cache_opts.secondary_cache);
1250
+ std::shared_ptr<Cache> cache(tmp_cache);
1251
+ BlockBasedTableOptions table_options;
1252
+ table_options.block_cache = cache;
1253
+ table_options.block_size = 4 * 1024;
1254
+ Options options = GetDefaultOptions();
1255
+ options.create_if_missing = true;
1256
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1257
+ options.env = fault_env_.get();
1258
+ DestroyAndReopen(options);
1259
+ fault_fs_->SetFailGetUniqueId(true);
1260
+
1261
+ Random rnd(301);
1262
+ const int N = 256;
1263
+ std::vector<std::string> value;
1264
+ char buf[1000];
1265
+ memset(buf, 'a', 1000);
1266
+ value.resize(N);
1267
+ for (int i = 0; i < N; i++) {
1268
+ // std::string p_v = rnd.RandomString(1000);
1269
+ std::string p_v(buf, 1000);
1270
+ value[i] = p_v;
1271
+ ASSERT_OK(Put(Key(i), p_v));
1272
+ }
1273
+ ASSERT_OK(Flush());
1274
+ Compact("a", "z");
1275
+
1276
+ // do th eread for all the key value pairs, so all the blocks should be in
1277
+ // cache
1278
+ uint32_t start_insert = tmp_cache->GetInsertCount();
1279
+ uint32_t start_lookup = tmp_cache->GetLookupcount();
1280
+ std::string v;
1281
+ for (int i = 0; i < N; i++) {
1282
+ v = Get(Key(i));
1283
+ ASSERT_EQ(v, value[i]);
1284
+ }
1285
+ uint32_t dump_insert = tmp_cache->GetInsertCount() - start_insert;
1286
+ uint32_t dump_lookup = tmp_cache->GetLookupcount() - start_lookup;
1287
+ ASSERT_EQ(63,
1288
+ static_cast<int>(dump_insert)); // the insert in the block cache
1289
+ ASSERT_EQ(256,
1290
+ static_cast<int>(dump_lookup)); // the lookup in the block cache
1291
+ // We have enough blocks in the block cache
1292
+
1293
+ CacheDumpOptions cd_options;
1294
+ cd_options.clock = fault_env_->GetSystemClock().get();
1295
+ std::string dump_path = db_->GetName() + "/cache_dump";
1296
+ std::unique_ptr<CacheDumpWriter> dump_writer;
1297
+ Status s = NewToFileCacheDumpWriter(fault_fs_, FileOptions(), dump_path,
1298
+ &dump_writer);
1299
+ ASSERT_OK(s);
1300
+ std::unique_ptr<CacheDumper> cache_dumper;
1301
+ s = NewDefaultCacheDumper(cd_options, cache, std::move(dump_writer),
1302
+ &cache_dumper);
1303
+ ASSERT_OK(s);
1304
+ std::vector<DB*> db_list;
1305
+ db_list.push_back(db_);
1306
+ s = cache_dumper->SetDumpFilter(db_list);
1307
+ ASSERT_OK(s);
1308
+ s = cache_dumper->DumpCacheEntriesToWriter();
1309
+ ASSERT_OK(s);
1310
+ cache_dumper.reset();
1311
+
1312
+ // we have a new cache it is empty, then, before we do the Get, we do the
1313
+ // dumpload
1314
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
1315
+ std::make_shared<TestSecondaryCache>(2048 * 1024);
1316
+ cache_opts.secondary_cache = secondary_cache;
1317
+ tmp_cache = new LRUCacheWithStat(
1318
+ cache_opts.capacity, cache_opts.num_shard_bits,
1319
+ cache_opts.strict_capacity_limit, cache_opts.high_pri_pool_ratio,
1320
+ cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
1321
+ cache_opts.metadata_charge_policy, cache_opts.secondary_cache);
1322
+ std::shared_ptr<Cache> cache_new(tmp_cache);
1323
+ table_options.block_cache = cache_new;
1324
+ table_options.block_size = 4 * 1024;
1325
+ options.create_if_missing = true;
1326
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1327
+ options.env = fault_env_.get();
1328
+
1329
+ // start to load the data to new block cache
1330
+ start_insert = secondary_cache->num_inserts();
1331
+ start_lookup = secondary_cache->num_lookups();
1332
+ std::unique_ptr<CacheDumpReader> dump_reader;
1333
+ s = NewFromFileCacheDumpReader(fault_fs_, FileOptions(), dump_path,
1334
+ &dump_reader);
1335
+ ASSERT_OK(s);
1336
+ std::unique_ptr<CacheDumpedLoader> cache_loader;
1337
+ s = NewDefaultCacheDumpedLoader(cd_options, table_options, secondary_cache,
1338
+ std::move(dump_reader), &cache_loader);
1339
+ ASSERT_OK(s);
1340
+ s = cache_loader->RestoreCacheEntriesToSecondaryCache();
1341
+ ASSERT_OK(s);
1342
+ uint32_t load_insert = secondary_cache->num_inserts() - start_insert;
1343
+ uint32_t load_lookup = secondary_cache->num_lookups() - start_lookup;
1344
+ // check the number we inserted
1345
+ ASSERT_EQ(64, static_cast<int>(load_insert));
1346
+ ASSERT_EQ(0, static_cast<int>(load_lookup));
1347
+ ASSERT_OK(s);
1348
+
1349
+ Reopen(options);
1350
+
1351
+ // After load, we do the Get again
1352
+ start_insert = secondary_cache->num_inserts();
1353
+ start_lookup = secondary_cache->num_lookups();
1354
+ uint32_t cache_insert = tmp_cache->GetInsertCount();
1355
+ uint32_t cache_lookup = tmp_cache->GetLookupcount();
1356
+ for (int i = 0; i < N; i++) {
1357
+ v = Get(Key(i));
1358
+ ASSERT_EQ(v, value[i]);
1359
+ }
1360
+ uint32_t final_insert = secondary_cache->num_inserts() - start_insert;
1361
+ uint32_t final_lookup = secondary_cache->num_lookups() - start_lookup;
1362
+ // no insert to secondary cache
1363
+ ASSERT_EQ(0, static_cast<int>(final_insert));
1364
+ // lookup the secondary to get all blocks
1365
+ ASSERT_EQ(64, static_cast<int>(final_lookup));
1366
+ uint32_t block_insert = tmp_cache->GetInsertCount() - cache_insert;
1367
+ uint32_t block_lookup = tmp_cache->GetLookupcount() - cache_lookup;
1368
+ // Check the new block cache insert and lookup, should be no insert since all
1369
+ // blocks are from the secondary cache.
1370
+ ASSERT_EQ(0, static_cast<int>(block_insert));
1371
+ ASSERT_EQ(256, static_cast<int>(block_lookup));
1372
+
1373
+ fault_fs_->SetFailGetUniqueId(false);
1374
+ Destroy(options);
1375
+ }
1376
+
1377
+ TEST_F(DBSecondaryCacheTest, LRUCacheDumpLoadWithFilter) {
1378
+ LRUCacheOptions cache_opts(1024 * 1024, 0, false, 0.5, nullptr,
1379
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
1380
+ LRUCacheWithStat* tmp_cache = new LRUCacheWithStat(
1381
+ cache_opts.capacity, cache_opts.num_shard_bits,
1382
+ cache_opts.strict_capacity_limit, cache_opts.high_pri_pool_ratio,
1383
+ cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
1384
+ cache_opts.metadata_charge_policy, cache_opts.secondary_cache);
1385
+ std::shared_ptr<Cache> cache(tmp_cache);
1386
+ BlockBasedTableOptions table_options;
1387
+ table_options.block_cache = cache;
1388
+ table_options.block_size = 4 * 1024;
1389
+ Options options = GetDefaultOptions();
1390
+ options.create_if_missing = true;
1391
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1392
+ options.env = fault_env_.get();
1393
+ std::string dbname1 = test::PerThreadDBPath("db_1");
1394
+ ASSERT_OK(DestroyDB(dbname1, options));
1395
+ DB* db1 = nullptr;
1396
+ ASSERT_OK(DB::Open(options, dbname1, &db1));
1397
+ std::string dbname2 = test::PerThreadDBPath("db_2");
1398
+ ASSERT_OK(DestroyDB(dbname2, options));
1399
+ DB* db2 = nullptr;
1400
+ ASSERT_OK(DB::Open(options, dbname2, &db2));
1401
+ fault_fs_->SetFailGetUniqueId(true);
1402
+
1403
+ // write the KVs to db1
1404
+ Random rnd(301);
1405
+ const int N = 256;
1406
+ std::vector<std::string> value1;
1407
+ WriteOptions wo;
1408
+ char buf[1000];
1409
+ memset(buf, 'a', 1000);
1410
+ value1.resize(N);
1411
+ for (int i = 0; i < N; i++) {
1412
+ std::string p_v(buf, 1000);
1413
+ value1[i] = p_v;
1414
+ ASSERT_OK(db1->Put(wo, Key(i), p_v));
1415
+ }
1416
+ ASSERT_OK(db1->Flush(FlushOptions()));
1417
+ Slice bg("a");
1418
+ Slice ed("b");
1419
+ ASSERT_OK(db1->CompactRange(CompactRangeOptions(), &bg, &ed));
1420
+
1421
+ // Write the KVs to DB2
1422
+ std::vector<std::string> value2;
1423
+ memset(buf, 'b', 1000);
1424
+ value2.resize(N);
1425
+ for (int i = 0; i < N; i++) {
1426
+ std::string p_v(buf, 1000);
1427
+ value2[i] = p_v;
1428
+ ASSERT_OK(db2->Put(wo, Key(i), p_v));
1429
+ }
1430
+ ASSERT_OK(db2->Flush(FlushOptions()));
1431
+ ASSERT_OK(db2->CompactRange(CompactRangeOptions(), &bg, &ed));
1432
+
1433
+ // do th eread for all the key value pairs, so all the blocks should be in
1434
+ // cache
1435
+ uint32_t start_insert = tmp_cache->GetInsertCount();
1436
+ uint32_t start_lookup = tmp_cache->GetLookupcount();
1437
+ ReadOptions ro;
1438
+ std::string v;
1439
+ for (int i = 0; i < N; i++) {
1440
+ ASSERT_OK(db1->Get(ro, Key(i), &v));
1441
+ ASSERT_EQ(v, value1[i]);
1442
+ }
1443
+ for (int i = 0; i < N; i++) {
1444
+ ASSERT_OK(db2->Get(ro, Key(i), &v));
1445
+ ASSERT_EQ(v, value2[i]);
1446
+ }
1447
+ uint32_t dump_insert = tmp_cache->GetInsertCount() - start_insert;
1448
+ uint32_t dump_lookup = tmp_cache->GetLookupcount() - start_lookup;
1449
+ ASSERT_EQ(128,
1450
+ static_cast<int>(dump_insert)); // the insert in the block cache
1451
+ ASSERT_EQ(512,
1452
+ static_cast<int>(dump_lookup)); // the lookup in the block cache
1453
+ // We have enough blocks in the block cache
1454
+
1455
+ CacheDumpOptions cd_options;
1456
+ cd_options.clock = fault_env_->GetSystemClock().get();
1457
+ std::string dump_path = db1->GetName() + "/cache_dump";
1458
+ std::unique_ptr<CacheDumpWriter> dump_writer;
1459
+ Status s = NewToFileCacheDumpWriter(fault_fs_, FileOptions(), dump_path,
1460
+ &dump_writer);
1461
+ ASSERT_OK(s);
1462
+ std::unique_ptr<CacheDumper> cache_dumper;
1463
+ s = NewDefaultCacheDumper(cd_options, cache, std::move(dump_writer),
1464
+ &cache_dumper);
1465
+ ASSERT_OK(s);
1466
+ std::vector<DB*> db_list;
1467
+ db_list.push_back(db1);
1468
+ s = cache_dumper->SetDumpFilter(db_list);
1469
+ ASSERT_OK(s);
1470
+ s = cache_dumper->DumpCacheEntriesToWriter();
1471
+ ASSERT_OK(s);
1472
+ cache_dumper.reset();
1473
+
1474
+ // we have a new cache it is empty, then, before we do the Get, we do the
1475
+ // dumpload
1476
+ std::shared_ptr<TestSecondaryCache> secondary_cache =
1477
+ std::make_shared<TestSecondaryCache>(2048 * 1024);
1478
+ cache_opts.secondary_cache = secondary_cache;
1479
+ tmp_cache = new LRUCacheWithStat(
1480
+ cache_opts.capacity, cache_opts.num_shard_bits,
1481
+ cache_opts.strict_capacity_limit, cache_opts.high_pri_pool_ratio,
1482
+ cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
1483
+ cache_opts.metadata_charge_policy, cache_opts.secondary_cache);
1484
+ std::shared_ptr<Cache> cache_new(tmp_cache);
1485
+ table_options.block_cache = cache_new;
1486
+ table_options.block_size = 4 * 1024;
1487
+ options.create_if_missing = true;
1488
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1489
+ options.env = fault_env_.get();
1490
+
1491
+ // Start the cache loading process
1492
+ start_insert = secondary_cache->num_inserts();
1493
+ start_lookup = secondary_cache->num_lookups();
1494
+ std::unique_ptr<CacheDumpReader> dump_reader;
1495
+ s = NewFromFileCacheDumpReader(fault_fs_, FileOptions(), dump_path,
1496
+ &dump_reader);
1497
+ ASSERT_OK(s);
1498
+ std::unique_ptr<CacheDumpedLoader> cache_loader;
1499
+ s = NewDefaultCacheDumpedLoader(cd_options, table_options, secondary_cache,
1500
+ std::move(dump_reader), &cache_loader);
1501
+ ASSERT_OK(s);
1502
+ s = cache_loader->RestoreCacheEntriesToSecondaryCache();
1503
+ ASSERT_OK(s);
1504
+ uint32_t load_insert = secondary_cache->num_inserts() - start_insert;
1505
+ uint32_t load_lookup = secondary_cache->num_lookups() - start_lookup;
1506
+ // check the number we inserted
1507
+ ASSERT_EQ(64, static_cast<int>(load_insert));
1508
+ ASSERT_EQ(0, static_cast<int>(load_lookup));
1509
+ ASSERT_OK(s);
1510
+
1511
+ ASSERT_OK(db1->Close());
1512
+ delete db1;
1513
+ ASSERT_OK(DB::Open(options, dbname1, &db1));
1514
+
1515
+ // After load, we do the Get again. To validate the cache, we do not allow any
1516
+ // I/O, so we set the file system to false.
1517
+ IOStatus error_msg = IOStatus::IOError("Retryable IO Error");
1518
+ fault_fs_->SetFilesystemActive(false, error_msg);
1519
+ start_insert = secondary_cache->num_inserts();
1520
+ start_lookup = secondary_cache->num_lookups();
1521
+ uint32_t cache_insert = tmp_cache->GetInsertCount();
1522
+ uint32_t cache_lookup = tmp_cache->GetLookupcount();
1523
+ for (int i = 0; i < N; i++) {
1524
+ ASSERT_OK(db1->Get(ro, Key(i), &v));
1525
+ ASSERT_EQ(v, value1[i]);
1526
+ }
1527
+ uint32_t final_insert = secondary_cache->num_inserts() - start_insert;
1528
+ uint32_t final_lookup = secondary_cache->num_lookups() - start_lookup;
1529
+ // no insert to secondary cache
1530
+ ASSERT_EQ(0, static_cast<int>(final_insert));
1531
+ // lookup the secondary to get all blocks
1532
+ ASSERT_EQ(64, static_cast<int>(final_lookup));
1533
+ uint32_t block_insert = tmp_cache->GetInsertCount() - cache_insert;
1534
+ uint32_t block_lookup = tmp_cache->GetLookupcount() - cache_lookup;
1535
+ // Check the new block cache insert and lookup, should be no insert since all
1536
+ // blocks are from the secondary cache.
1537
+ ASSERT_EQ(0, static_cast<int>(block_insert));
1538
+ ASSERT_EQ(256, static_cast<int>(block_lookup));
1539
+ fault_fs_->SetFailGetUniqueId(false);
1540
+ fault_fs_->SetFilesystemActive(true);
1541
+ delete db1;
1542
+ delete db2;
1543
+ ASSERT_OK(DestroyDB(dbname1, options));
1544
+ ASSERT_OK(DestroyDB(dbname2, options));
1545
+ }
1546
+
1547
+ // Test the option not to use the secondary cache in a certain DB.
1548
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheOptionBasic) {
1549
+ LRUCacheOptions opts(4 * 1024, 0, false, 0.5, nullptr,
1550
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
1551
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
1552
+ new TestSecondaryCache(2048 * 1024));
1553
+ opts.secondary_cache = secondary_cache;
1554
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
1555
+ BlockBasedTableOptions table_options;
1556
+ table_options.block_cache = cache;
1557
+ table_options.block_size = 4 * 1024;
1558
+ Options options = GetDefaultOptions();
1559
+ options.create_if_missing = true;
1560
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1561
+ options.env = fault_env_.get();
1562
+ fault_fs_->SetFailGetUniqueId(true);
1563
+ options.lowest_used_cache_tier = CacheTier::kVolatileTier;
1564
+
1565
+ // Set the file paranoid check, so after flush, the file will be read
1566
+ // all the blocks will be accessed.
1567
+ options.paranoid_file_checks = true;
1568
+ DestroyAndReopen(options);
1569
+ std::string session_id;
1570
+ ASSERT_OK(db_->GetDbSessionId(session_id));
1571
+ secondary_cache->SetDbSessionId(session_id);
1572
+ Random rnd(301);
1573
+ const int N = 6;
1574
+ for (int i = 0; i < N; i++) {
1575
+ std::string p_v = rnd.RandomString(1007);
1576
+ ASSERT_OK(Put(Key(i), p_v));
1577
+ }
1578
+
1579
+ ASSERT_OK(Flush());
1580
+
1581
+ for (int i = 0; i < N; i++) {
1582
+ std::string p_v = rnd.RandomString(1007);
1583
+ ASSERT_OK(Put(Key(i + 70), p_v));
1584
+ }
1585
+
1586
+ ASSERT_OK(Flush());
1587
+
1588
+ // Flush will trigger the paranoid check and read blocks. But only block cache
1589
+ // will be read. No operations for secondary cache.
1590
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1591
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1592
+
1593
+ Compact("a", "z");
1594
+
1595
+ // Compaction will also insert and evict blocks, no operations to the block
1596
+ // cache. No operations for secondary cache.
1597
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1598
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1599
+
1600
+ std::string v = Get(Key(0));
1601
+ ASSERT_EQ(1007, v.size());
1602
+
1603
+ // Check the data in first block. Cache miss, direclty read from SST file.
1604
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1605
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1606
+
1607
+ v = Get(Key(5));
1608
+ ASSERT_EQ(1007, v.size());
1609
+
1610
+ // Check the second block.
1611
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1612
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1613
+
1614
+ v = Get(Key(5));
1615
+ ASSERT_EQ(1007, v.size());
1616
+
1617
+ // block cache hit
1618
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1619
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1620
+
1621
+ v = Get(Key(70));
1622
+ ASSERT_EQ(1007, v.size());
1623
+
1624
+ // Check the first block in the second SST file. Cache miss and trigger SST
1625
+ // file read. No operations for secondary cache.
1626
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1627
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1628
+
1629
+ v = Get(Key(75));
1630
+ ASSERT_EQ(1007, v.size());
1631
+
1632
+ // Check the second block in the second SST file. Cache miss and trigger SST
1633
+ // file read. No operations for secondary cache.
1634
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1635
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1636
+
1637
+ Destroy(options);
1638
+ }
1639
+
1640
+ // We disable the secondary cache in DBOptions at first. Close and reopen the DB
1641
+ // with new options, which set the lowest_used_cache_tier to
1642
+ // kNonVolatileBlockTier. So secondary cache will be used.
1643
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheOptionChange) {
1644
+ LRUCacheOptions opts(4 * 1024, 0, false, 0.5, nullptr,
1645
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
1646
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
1647
+ new TestSecondaryCache(2048 * 1024));
1648
+ opts.secondary_cache = secondary_cache;
1649
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
1650
+ BlockBasedTableOptions table_options;
1651
+ table_options.block_cache = cache;
1652
+ table_options.block_size = 4 * 1024;
1653
+ Options options = GetDefaultOptions();
1654
+ options.create_if_missing = true;
1655
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1656
+ options.env = fault_env_.get();
1657
+ fault_fs_->SetFailGetUniqueId(true);
1658
+ options.lowest_used_cache_tier = CacheTier::kVolatileTier;
1659
+
1660
+ // Set the file paranoid check, so after flush, the file will be read
1661
+ // all the blocks will be accessed.
1662
+ options.paranoid_file_checks = true;
1663
+ DestroyAndReopen(options);
1664
+ std::string session_id;
1665
+ ASSERT_OK(db_->GetDbSessionId(session_id));
1666
+ secondary_cache->SetDbSessionId(session_id);
1667
+ Random rnd(301);
1668
+ const int N = 6;
1669
+ for (int i = 0; i < N; i++) {
1670
+ std::string p_v = rnd.RandomString(1007);
1671
+ ASSERT_OK(Put(Key(i), p_v));
1672
+ }
1673
+
1674
+ ASSERT_OK(Flush());
1675
+
1676
+ for (int i = 0; i < N; i++) {
1677
+ std::string p_v = rnd.RandomString(1007);
1678
+ ASSERT_OK(Put(Key(i + 70), p_v));
1679
+ }
1680
+
1681
+ ASSERT_OK(Flush());
1682
+
1683
+ // Flush will trigger the paranoid check and read blocks. But only block cache
1684
+ // will be read.
1685
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1686
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1687
+
1688
+ Compact("a", "z");
1689
+
1690
+ // Compaction will also insert and evict blocks, no operations to the block
1691
+ // cache.
1692
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1693
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1694
+
1695
+ std::string v = Get(Key(0));
1696
+ ASSERT_EQ(1007, v.size());
1697
+
1698
+ // Check the data in first block. Cache miss, direclty read from SST file.
1699
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1700
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1701
+
1702
+ v = Get(Key(5));
1703
+ ASSERT_EQ(1007, v.size());
1704
+
1705
+ // Check the second block.
1706
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1707
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1708
+
1709
+ v = Get(Key(5));
1710
+ ASSERT_EQ(1007, v.size());
1711
+
1712
+ // block cache hit
1713
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1714
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1715
+
1716
+ // Change the option to enable secondary cache after we Reopen the DB
1717
+ options.lowest_used_cache_tier = CacheTier::kNonVolatileBlockTier;
1718
+ Reopen(options);
1719
+
1720
+ v = Get(Key(70));
1721
+ ASSERT_EQ(1007, v.size());
1722
+
1723
+ // Enable the secondary cache, trigger lookup of the first block in second SST
1724
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1725
+ ASSERT_EQ(secondary_cache->num_lookups(), 1u);
1726
+
1727
+ v = Get(Key(75));
1728
+ ASSERT_EQ(1007, v.size());
1729
+
1730
+ // trigger lookup of the second block in second SST
1731
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1732
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
1733
+ Destroy(options);
1734
+ }
1735
+
1736
+ // Two DB test. We create 2 DBs sharing the same block cache and secondary
1737
+ // cache. We diable the secondary cache option for DB2.
1738
+ TEST_F(DBSecondaryCacheTest, TestSecondaryCacheOptionTwoDB) {
1739
+ LRUCacheOptions opts(4 * 1024, 0, false, 0.5, nullptr,
1740
+ kDefaultToAdaptiveMutex, kDontChargeCacheMetadata);
1741
+ std::shared_ptr<TestSecondaryCache> secondary_cache(
1742
+ new TestSecondaryCache(2048 * 1024));
1743
+ opts.secondary_cache = secondary_cache;
1744
+ std::shared_ptr<Cache> cache = NewLRUCache(opts);
1745
+ BlockBasedTableOptions table_options;
1746
+ table_options.block_cache = cache;
1747
+ table_options.block_size = 4 * 1024;
1748
+ Options options = GetDefaultOptions();
1749
+ options.create_if_missing = true;
1750
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1751
+ options.env = fault_env_.get();
1752
+ options.paranoid_file_checks = true;
1753
+ std::string dbname1 = test::PerThreadDBPath("db_t_1");
1754
+ ASSERT_OK(DestroyDB(dbname1, options));
1755
+ DB* db1 = nullptr;
1756
+ ASSERT_OK(DB::Open(options, dbname1, &db1));
1757
+ std::string dbname2 = test::PerThreadDBPath("db_t_2");
1758
+ ASSERT_OK(DestroyDB(dbname2, options));
1759
+ DB* db2 = nullptr;
1760
+ Options options2 = options;
1761
+ options2.lowest_used_cache_tier = CacheTier::kVolatileTier;
1762
+ ASSERT_OK(DB::Open(options2, dbname2, &db2));
1763
+ fault_fs_->SetFailGetUniqueId(true);
1764
+
1765
+ // Set the file paranoid check, so after flush, the file will be read
1766
+ // all the blocks will be accessed.
1767
+ std::string session_id;
1768
+ ASSERT_OK(db1->GetDbSessionId(session_id));
1769
+ secondary_cache->SetDbSessionId(session_id);
1770
+
1771
+ WriteOptions wo;
1772
+ Random rnd(301);
1773
+ const int N = 6;
1774
+ for (int i = 0; i < N; i++) {
1775
+ std::string p_v = rnd.RandomString(1007);
1776
+ ASSERT_OK(db1->Put(wo, Key(i), p_v));
1777
+ }
1778
+
1779
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1780
+ ASSERT_EQ(secondary_cache->num_lookups(), 0u);
1781
+ ASSERT_OK(db1->Flush(FlushOptions()));
1782
+
1783
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1784
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
1785
+
1786
+ for (int i = 0; i < N; i++) {
1787
+ std::string p_v = rnd.RandomString(1007);
1788
+ ASSERT_OK(db2->Put(wo, Key(i), p_v));
1789
+ }
1790
+
1791
+ // No change in the secondary cache, since it is disabled in DB2
1792
+ ASSERT_EQ(secondary_cache->num_inserts(), 0u);
1793
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
1794
+ ASSERT_OK(db2->Flush(FlushOptions()));
1795
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1796
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
1797
+
1798
+ Slice bg("a");
1799
+ Slice ed("b");
1800
+ ASSERT_OK(db1->CompactRange(CompactRangeOptions(), &bg, &ed));
1801
+ ASSERT_OK(db2->CompactRange(CompactRangeOptions(), &bg, &ed));
1802
+
1803
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1804
+ ASSERT_EQ(secondary_cache->num_lookups(), 2u);
1805
+
1806
+ ReadOptions ro;
1807
+ std::string v;
1808
+ ASSERT_OK(db1->Get(ro, Key(0), &v));
1809
+ ASSERT_EQ(1007, v.size());
1810
+
1811
+ // DB 1 has lookup block 1 and it is miss in block cache, trigger secondary
1812
+ // cache lookup
1813
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1814
+ ASSERT_EQ(secondary_cache->num_lookups(), 3u);
1815
+
1816
+ ASSERT_OK(db1->Get(ro, Key(5), &v));
1817
+ ASSERT_EQ(1007, v.size());
1818
+
1819
+ // DB 1 lookup the second block and it is miss in block cache, trigger
1820
+ // secondary cache lookup
1821
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1822
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
1823
+
1824
+ ASSERT_OK(db2->Get(ro, Key(0), &v));
1825
+ ASSERT_EQ(1007, v.size());
1826
+
1827
+ // For db2, it is not enabled with secondary cache, so no search in the
1828
+ // secondary cache
1829
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1830
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
1831
+
1832
+ ASSERT_OK(db2->Get(ro, Key(5), &v));
1833
+ ASSERT_EQ(1007, v.size());
1834
+
1835
+ // For db2, it is not enabled with secondary cache, so no search in the
1836
+ // secondary cache
1837
+ ASSERT_EQ(secondary_cache->num_inserts(), 1u);
1838
+ ASSERT_EQ(secondary_cache->num_lookups(), 4u);
1839
+
1840
+ fault_fs_->SetFailGetUniqueId(false);
1841
+ fault_fs_->SetFilesystemActive(true);
1842
+ delete db1;
1843
+ delete db2;
1844
+ ASSERT_OK(DestroyDB(dbname1, options));
1845
+ ASSERT_OK(DestroyDB(dbname2, options));
1846
+ }
1847
+
1848
+ #endif // ROCKSDB_LITE
1849
+
194
1850
  } // namespace ROCKSDB_NAMESPACE
195
1851
 
196
1852
  int main(int argc, char** argv) {