@nxtedition/rocksdb 8.1.4 → 8.1.6

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 (223) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
  2. package/deps/rocksdb/rocksdb/Makefile +15 -3
  3. package/deps/rocksdb/rocksdb/TARGETS +6 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
  5. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
  6. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
  9. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
  11. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
  12. package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
  13. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
  14. package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
  16. package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
  18. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
  19. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
  20. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
  21. package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
  22. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
  23. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
  25. package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
  27. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
  30. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
  33. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
  34. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
  35. package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
  36. package/deps/rocksdb/rocksdb/db/builder.h +2 -1
  37. package/deps/rocksdb/rocksdb/db/c.cc +15 -0
  38. package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
  39. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
  40. package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  60. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
  61. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
  67. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
  76. package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
  77. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  78. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
  79. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
  80. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
  81. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
  83. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
  84. package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
  85. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  86. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
  87. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  88. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  89. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  90. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
  93. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
  94. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
  95. package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
  96. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
  97. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
  98. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  99. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  100. package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
  101. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
  103. package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
  104. package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
  105. package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
  106. package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
  107. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  108. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
  110. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  111. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  112. package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
  113. package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
  114. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
  115. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  116. package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
  117. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  118. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
  119. package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
  121. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
  122. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
  123. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
  124. package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
  125. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  126. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
  127. package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
  128. package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
  129. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  130. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
  137. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
  138. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
  139. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
  140. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
  142. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
  144. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  146. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
  148. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
  150. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  151. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
  152. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  153. package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
  154. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
  155. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  156. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
  157. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  158. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  159. package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
  160. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  161. package/deps/rocksdb/rocksdb/src.mk +3 -0
  162. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
  175. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
  177. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
  178. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
  181. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
  182. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
  183. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
  185. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  186. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  187. package/deps/rocksdb/rocksdb/table/format.h +6 -3
  188. package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
  189. package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
  190. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
  191. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  192. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  193. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  194. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
  196. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
  197. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
  198. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  199. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
  200. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
  201. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  202. package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
  203. package/deps/rocksdb/rocksdb/util/compression.h +11 -2
  204. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  205. package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
  206. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
  207. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
  208. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
  209. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
  210. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  211. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
  212. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
  213. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
  214. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
  215. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
  216. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
  217. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
  218. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  219. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
  220. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
  221. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
  222. package/package.json +1 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
@@ -13,7 +13,6 @@
13
13
  #include <cstring>
14
14
  #include <memory>
15
15
 
16
- #include "cache/cache_entry_roles.h"
17
16
  #include "rocksdb/cache.h"
18
17
  #include "rocksdb/slice.h"
19
18
  #include "rocksdb/status.h"
@@ -41,17 +40,17 @@ CacheReservationManagerImpl<
41
40
  template <CacheEntryRole R>
42
41
  CacheReservationManagerImpl<R>::CacheReservationManagerImpl(
43
42
  std::shared_ptr<Cache> cache, bool delayed_decrease)
44
- : delayed_decrease_(delayed_decrease),
43
+ : cache_(cache),
44
+ delayed_decrease_(delayed_decrease),
45
45
  cache_allocated_size_(0),
46
46
  memory_used_(0) {
47
47
  assert(cache != nullptr);
48
- cache_ = cache;
49
48
  }
50
49
 
51
50
  template <CacheEntryRole R>
52
51
  CacheReservationManagerImpl<R>::~CacheReservationManagerImpl() {
53
52
  for (auto* handle : dummy_handles_) {
54
- cache_->Release(handle, true);
53
+ cache_.ReleaseAndEraseIfLastRef(handle);
55
54
  }
56
55
  }
57
56
 
@@ -115,8 +114,7 @@ Status CacheReservationManagerImpl<R>::IncreaseCacheReservation(
115
114
  Status return_status = Status::OK();
116
115
  while (new_mem_used > cache_allocated_size_.load(std::memory_order_relaxed)) {
117
116
  Cache::Handle* handle = nullptr;
118
- return_status = cache_->Insert(GetNextCacheKey(), nullptr, kSizeDummyEntry,
119
- GetNoopDeleterForRole<R>(), &handle);
117
+ return_status = cache_.Insert(GetNextCacheKey(), kSizeDummyEntry, &handle);
120
118
 
121
119
  if (return_status != Status::OK()) {
122
120
  return return_status;
@@ -141,7 +139,7 @@ Status CacheReservationManagerImpl<R>::DecreaseCacheReservation(
141
139
  cache_allocated_size_.load(std::memory_order_relaxed)) {
142
140
  assert(!dummy_handles_.empty());
143
141
  auto* handle = dummy_handles_.back();
144
- cache_->Release(handle, true);
142
+ cache_.ReleaseAndEraseIfLastRef(handle);
145
143
  dummy_handles_.pop_back();
146
144
  cache_allocated_size_ -= kSizeDummyEntry;
147
145
  }
@@ -169,8 +167,9 @@ Slice CacheReservationManagerImpl<R>::GetNextCacheKey() {
169
167
  }
170
168
 
171
169
  template <CacheEntryRole R>
172
- Cache::DeleterFn CacheReservationManagerImpl<R>::TEST_GetNoopDeleterForRole() {
173
- return GetNoopDeleterForRole<R>();
170
+ const Cache::CacheItemHelper*
171
+ CacheReservationManagerImpl<R>::TEST_GetCacheItemHelperForRole() {
172
+ return &CacheInterface::kHelper;
174
173
  }
175
174
 
176
175
  template class CacheReservationManagerImpl<
@@ -18,7 +18,7 @@
18
18
 
19
19
  #include "cache/cache_entry_roles.h"
20
20
  #include "cache/cache_key.h"
21
- #include "rocksdb/cache.h"
21
+ #include "cache/typed_cache.h"
22
22
  #include "rocksdb/slice.h"
23
23
  #include "rocksdb/status.h"
24
24
  #include "util/coding.h"
@@ -197,10 +197,10 @@ class CacheReservationManagerImpl
197
197
 
198
198
  static constexpr std::size_t GetDummyEntrySize() { return kSizeDummyEntry; }
199
199
 
200
- // For testing only - it is to help ensure the NoopDeleterForRole<R>
200
+ // For testing only - it is to help ensure the CacheItemHelperForRole<R>
201
201
  // accessed from CacheReservationManagerImpl and the one accessed from the
202
202
  // test are from the same translation units
203
- static Cache::DeleterFn TEST_GetNoopDeleterForRole();
203
+ static const Cache::CacheItemHelper *TEST_GetCacheItemHelperForRole();
204
204
 
205
205
  private:
206
206
  static constexpr std::size_t kSizeDummyEntry = 256 * 1024;
@@ -211,7 +211,8 @@ class CacheReservationManagerImpl
211
211
  Status IncreaseCacheReservation(std::size_t new_mem_used);
212
212
  Status DecreaseCacheReservation(std::size_t new_mem_used);
213
213
 
214
- std::shared_ptr<Cache> cache_;
214
+ using CacheInterface = PlaceholderSharedCacheInterface<R>;
215
+ CacheInterface cache_;
215
216
  bool delayed_decrease_;
216
217
  std::atomic<std::size_t> cache_allocated_size_;
217
218
  std::size_t memory_used_;
@@ -16,6 +16,7 @@
16
16
  #include <vector>
17
17
 
18
18
  #include "cache/lru_cache.h"
19
+ #include "cache/typed_cache.h"
19
20
  #include "port/stack_trace.h"
20
21
  #include "test_util/testharness.h"
21
22
  #include "util/coding.h"
@@ -55,23 +56,31 @@ int DecodeKey32Bits(const Slice& k) {
55
56
  return DecodeFixed32(k.data());
56
57
  }
57
58
 
58
- void* EncodeValue(uintptr_t v) { return reinterpret_cast<void*>(v); }
59
+ Cache::ObjectPtr EncodeValue(uintptr_t v) {
60
+ return reinterpret_cast<Cache::ObjectPtr>(v);
61
+ }
59
62
 
60
63
  int DecodeValue(void* v) {
61
64
  return static_cast<int>(reinterpret_cast<uintptr_t>(v));
62
65
  }
63
66
 
64
- void DumbDeleter(const Slice& /*key*/, void* /*value*/) {}
67
+ const Cache::CacheItemHelper kDumbHelper{
68
+ CacheEntryRole::kMisc,
69
+ [](Cache::ObjectPtr /*value*/, MemoryAllocator* /*alloc*/) {}};
65
70
 
66
- void EraseDeleter1(const Slice& /*key*/, void* value) {
67
- Cache* cache = reinterpret_cast<Cache*>(value);
68
- cache->Erase("foo");
69
- }
71
+ const Cache::CacheItemHelper kEraseOnDeleteHelper1{
72
+ CacheEntryRole::kMisc,
73
+ [](Cache::ObjectPtr value, MemoryAllocator* /*alloc*/) {
74
+ Cache* cache = static_cast<Cache*>(value);
75
+ cache->Erase("foo");
76
+ }};
70
77
 
71
- void EraseDeleter2(const Slice& /*key*/, void* value) {
72
- Cache* cache = reinterpret_cast<Cache*>(value);
73
- cache->Erase(EncodeKey16Bytes(1234));
74
- }
78
+ const Cache::CacheItemHelper kEraseOnDeleteHelper2{
79
+ CacheEntryRole::kMisc,
80
+ [](Cache::ObjectPtr value, MemoryAllocator* /*alloc*/) {
81
+ Cache* cache = static_cast<Cache*>(value);
82
+ cache->Erase(EncodeKey16Bytes(1234));
83
+ }};
75
84
 
76
85
  const std::string kLRU = "lru";
77
86
  const std::string kHyperClock = "hyper_clock";
@@ -83,14 +92,11 @@ class CacheTest : public testing::TestWithParam<std::string> {
83
92
  static CacheTest* current_;
84
93
  static std::string type_;
85
94
 
86
- static void Deleter(const Slice& key, void* v) {
87
- if (type_ == kHyperClock) {
88
- current_->deleted_keys_.push_back(DecodeKey16Bytes(key));
89
- } else {
90
- current_->deleted_keys_.push_back(DecodeKey32Bits(key));
91
- }
95
+ static void Deleter(Cache::ObjectPtr v, MemoryAllocator*) {
92
96
  current_->deleted_values_.push_back(DecodeValue(v));
93
97
  }
98
+ static constexpr Cache::CacheItemHelper kHelper{CacheEntryRole::kMisc,
99
+ &Deleter};
94
100
 
95
101
  static const int kCacheSize = 1000;
96
102
  static const int kNumShardBits = 4;
@@ -98,7 +104,6 @@ class CacheTest : public testing::TestWithParam<std::string> {
98
104
  static const int kCacheSize2 = 100;
99
105
  static const int kNumShardBits2 = 2;
100
106
 
101
- std::vector<int> deleted_keys_;
102
107
  std::vector<int> deleted_values_;
103
108
  std::shared_ptr<Cache> cache_;
104
109
  std::shared_ptr<Cache> cache2_;
@@ -182,8 +187,8 @@ class CacheTest : public testing::TestWithParam<std::string> {
182
187
 
183
188
  void Insert(std::shared_ptr<Cache> cache, int key, int value,
184
189
  int charge = 1) {
185
- EXPECT_OK(cache->Insert(EncodeKey(key), EncodeValue(value), charge,
186
- &CacheTest::Deleter));
190
+ EXPECT_OK(
191
+ cache->Insert(EncodeKey(key), EncodeValue(value), &kHelper, charge));
187
192
  }
188
193
 
189
194
  void Erase(std::shared_ptr<Cache> cache, int key) {
@@ -236,10 +241,8 @@ TEST_P(CacheTest, UsageTest) {
236
241
  key = EncodeKey(i);
237
242
  }
238
243
  auto kv_size = key.size() + 5;
239
- ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), kv_size,
240
- DumbDeleter));
241
- ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
242
- kv_size, DumbDeleter));
244
+ ASSERT_OK(cache->Insert(key, value, &kDumbHelper, kv_size));
245
+ ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, kv_size));
243
246
  usage += kv_size;
244
247
  ASSERT_EQ(usage, cache->GetUsage());
245
248
  if (type == kHyperClock) {
@@ -262,10 +265,8 @@ TEST_P(CacheTest, UsageTest) {
262
265
  } else {
263
266
  key = EncodeKey(static_cast<int>(1000 + i));
264
267
  }
265
- ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
266
- DumbDeleter));
267
- ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
268
- key.size() + 5, DumbDeleter));
268
+ ASSERT_OK(cache->Insert(key, value, &kDumbHelper, key.size() + 5));
269
+ ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, key.size() + 5));
269
270
  }
270
271
 
271
272
  // the usage should be close to the capacity
@@ -320,11 +321,9 @@ TEST_P(CacheTest, PinnedUsageTest) {
320
321
  auto kv_size = key.size() + 5;
321
322
  Cache::Handle* handle;
322
323
  Cache::Handle* handle_in_precise_cache;
323
- ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), kv_size,
324
- DumbDeleter, &handle));
324
+ ASSERT_OK(cache->Insert(key, value, &kDumbHelper, kv_size, &handle));
325
325
  assert(handle);
326
- ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
327
- kv_size, DumbDeleter,
326
+ ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, kv_size,
328
327
  &handle_in_precise_cache));
329
328
  assert(handle_in_precise_cache);
330
329
  pinned_usage += kv_size;
@@ -365,10 +364,8 @@ TEST_P(CacheTest, PinnedUsageTest) {
365
364
  } else {
366
365
  key = EncodeKey(static_cast<int>(1000 + i));
367
366
  }
368
- ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
369
- DumbDeleter));
370
- ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
371
- key.size() + 5, DumbDeleter));
367
+ ASSERT_OK(cache->Insert(key, value, &kDumbHelper, key.size() + 5));
368
+ ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, key.size() + 5));
372
369
  }
373
370
  ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
374
371
  ASSERT_EQ(precise_cache_pinned_usage, precise_cache->GetPinnedUsage());
@@ -416,8 +413,7 @@ TEST_P(CacheTest, HitAndMiss) {
416
413
  ASSERT_EQ(201, Lookup(200));
417
414
  ASSERT_EQ(-1, Lookup(300));
418
415
 
419
- ASSERT_EQ(1U, deleted_keys_.size());
420
- ASSERT_EQ(100, deleted_keys_[0]);
416
+ ASSERT_EQ(1U, deleted_values_.size());
421
417
  if (GetParam() == kHyperClock) {
422
418
  ASSERT_EQ(102, deleted_values_[0]);
423
419
  } else {
@@ -438,21 +434,20 @@ TEST_P(CacheTest, InsertSameKey) {
438
434
 
439
435
  TEST_P(CacheTest, Erase) {
440
436
  Erase(200);
441
- ASSERT_EQ(0U, deleted_keys_.size());
437
+ ASSERT_EQ(0U, deleted_values_.size());
442
438
 
443
439
  Insert(100, 101);
444
440
  Insert(200, 201);
445
441
  Erase(100);
446
442
  ASSERT_EQ(-1, Lookup(100));
447
443
  ASSERT_EQ(201, Lookup(200));
448
- ASSERT_EQ(1U, deleted_keys_.size());
449
- ASSERT_EQ(100, deleted_keys_[0]);
444
+ ASSERT_EQ(1U, deleted_values_.size());
450
445
  ASSERT_EQ(101, deleted_values_[0]);
451
446
 
452
447
  Erase(100);
453
448
  ASSERT_EQ(-1, Lookup(100));
454
449
  ASSERT_EQ(201, Lookup(200));
455
- ASSERT_EQ(1U, deleted_keys_.size());
450
+ ASSERT_EQ(1U, deleted_values_.size());
456
451
  }
457
452
 
458
453
  TEST_P(CacheTest, EntriesArePinned) {
@@ -469,23 +464,21 @@ TEST_P(CacheTest, EntriesArePinned) {
469
464
  Insert(100, 102);
470
465
  Cache::Handle* h2 = cache_->Lookup(EncodeKey(100));
471
466
  ASSERT_EQ(102, DecodeValue(cache_->Value(h2)));
472
- ASSERT_EQ(0U, deleted_keys_.size());
467
+ ASSERT_EQ(0U, deleted_values_.size());
473
468
  ASSERT_EQ(2U, cache_->GetUsage());
474
469
 
475
470
  cache_->Release(h1);
476
- ASSERT_EQ(1U, deleted_keys_.size());
477
- ASSERT_EQ(100, deleted_keys_[0]);
471
+ ASSERT_EQ(1U, deleted_values_.size());
478
472
  ASSERT_EQ(101, deleted_values_[0]);
479
473
  ASSERT_EQ(1U, cache_->GetUsage());
480
474
 
481
475
  Erase(100);
482
476
  ASSERT_EQ(-1, Lookup(100));
483
- ASSERT_EQ(1U, deleted_keys_.size());
477
+ ASSERT_EQ(1U, deleted_values_.size());
484
478
  ASSERT_EQ(1U, cache_->GetUsage());
485
479
 
486
480
  cache_->Release(h2);
487
- ASSERT_EQ(2U, deleted_keys_.size());
488
- ASSERT_EQ(100, deleted_keys_[1]);
481
+ ASSERT_EQ(2U, deleted_values_.size());
489
482
  ASSERT_EQ(102, deleted_values_[1]);
490
483
  ASSERT_EQ(0U, cache_->GetUsage());
491
484
  }
@@ -588,9 +581,9 @@ TEST_P(CacheTest, EvictEmptyCache) {
588
581
  // Insert item large than capacity to trigger eviction on empty cache.
589
582
  auto cache = NewCache(1, 0, false);
590
583
  if (type == kLRU) {
591
- ASSERT_OK(cache->Insert("foo", nullptr, 10, DumbDeleter));
584
+ ASSERT_OK(cache->Insert("foo", nullptr, &kDumbHelper, 10));
592
585
  } else {
593
- ASSERT_OK(cache->Insert(EncodeKey(1000), nullptr, 10, DumbDeleter));
586
+ ASSERT_OK(cache->Insert(EncodeKey(1000), nullptr, &kDumbHelper, 10));
594
587
  }
595
588
  }
596
589
 
@@ -601,19 +594,19 @@ TEST_P(CacheTest, EraseFromDeleter) {
601
594
  // the cache at that point.
602
595
  std::shared_ptr<Cache> cache = NewCache(10, 0, false);
603
596
  std::string foo, bar;
604
- Cache::DeleterFn erase_deleter;
597
+ const Cache::CacheItemHelper* erase_helper;
605
598
  if (type == kLRU) {
606
599
  foo = "foo";
607
600
  bar = "bar";
608
- erase_deleter = EraseDeleter1;
601
+ erase_helper = &kEraseOnDeleteHelper1;
609
602
  } else {
610
603
  foo = EncodeKey(1234);
611
604
  bar = EncodeKey(5678);
612
- erase_deleter = EraseDeleter2;
605
+ erase_helper = &kEraseOnDeleteHelper2;
613
606
  }
614
607
 
615
- ASSERT_OK(cache->Insert(foo, nullptr, 1, DumbDeleter));
616
- ASSERT_OK(cache->Insert(bar, cache.get(), 1, erase_deleter));
608
+ ASSERT_OK(cache->Insert(foo, nullptr, &kDumbHelper, 1));
609
+ ASSERT_OK(cache->Insert(bar, cache.get(), erase_helper, 1));
617
610
 
618
611
  cache->Erase(bar);
619
612
  ASSERT_EQ(nullptr, cache->Lookup(foo));
@@ -675,50 +668,51 @@ TEST_P(CacheTest, NewId) {
675
668
  ASSERT_NE(a, b);
676
669
  }
677
670
 
678
- class Value {
679
- public:
680
- explicit Value(int v) : v_(v) {}
681
-
682
- int v_;
683
- };
684
-
685
- namespace {
686
- void deleter(const Slice& /*key*/, void* value) {
687
- delete static_cast<Value*>(value);
688
- }
689
- } // namespace
690
-
691
671
  TEST_P(CacheTest, ReleaseAndErase) {
692
672
  std::shared_ptr<Cache> cache = NewCache(5, 0, false);
693
673
  Cache::Handle* handle;
694
- Status s = cache->Insert(EncodeKey(100), EncodeValue(100), 1,
695
- &CacheTest::Deleter, &handle);
674
+ Status s =
675
+ cache->Insert(EncodeKey(100), EncodeValue(100), &kHelper, 1, &handle);
696
676
  ASSERT_TRUE(s.ok());
697
677
  ASSERT_EQ(5U, cache->GetCapacity());
698
678
  ASSERT_EQ(1U, cache->GetUsage());
699
- ASSERT_EQ(0U, deleted_keys_.size());
679
+ ASSERT_EQ(0U, deleted_values_.size());
700
680
  auto erased = cache->Release(handle, true);
701
681
  ASSERT_TRUE(erased);
702
682
  // This tests that deleter has been called
703
- ASSERT_EQ(1U, deleted_keys_.size());
683
+ ASSERT_EQ(1U, deleted_values_.size());
704
684
  }
705
685
 
706
686
  TEST_P(CacheTest, ReleaseWithoutErase) {
707
687
  std::shared_ptr<Cache> cache = NewCache(5, 0, false);
708
688
  Cache::Handle* handle;
709
- Status s = cache->Insert(EncodeKey(100), EncodeValue(100), 1,
710
- &CacheTest::Deleter, &handle);
689
+ Status s =
690
+ cache->Insert(EncodeKey(100), EncodeValue(100), &kHelper, 1, &handle);
711
691
  ASSERT_TRUE(s.ok());
712
692
  ASSERT_EQ(5U, cache->GetCapacity());
713
693
  ASSERT_EQ(1U, cache->GetUsage());
714
- ASSERT_EQ(0U, deleted_keys_.size());
694
+ ASSERT_EQ(0U, deleted_values_.size());
715
695
  auto erased = cache->Release(handle);
716
696
  ASSERT_FALSE(erased);
717
697
  // This tests that deleter is not called. When cache has free capacity it is
718
698
  // not expected to immediately erase the released items.
719
- ASSERT_EQ(0U, deleted_keys_.size());
699
+ ASSERT_EQ(0U, deleted_values_.size());
720
700
  }
721
701
 
702
+ namespace {
703
+ class Value {
704
+ public:
705
+ explicit Value(int v) : v_(v) {}
706
+
707
+ int v_;
708
+
709
+ static constexpr auto kCacheEntryRole = CacheEntryRole::kMisc;
710
+ };
711
+
712
+ using SharedCache = BasicTypedSharedCacheInterface<Value>;
713
+ using TypedHandle = SharedCache::TypedHandle;
714
+ } // namespace
715
+
722
716
  TEST_P(CacheTest, SetCapacity) {
723
717
  auto type = GetParam();
724
718
  if (type == kHyperClock) {
@@ -731,19 +725,19 @@ TEST_P(CacheTest, SetCapacity) {
731
725
  // lets create a cache with capacity 5,
732
726
  // then, insert 5 elements, then increase capacity
733
727
  // to 10, returned capacity should be 10, usage=5
734
- std::shared_ptr<Cache> cache = NewCache(5, 0, false);
735
- std::vector<Cache::Handle*> handles(10);
728
+ SharedCache cache{NewCache(5, 0, false)};
729
+ std::vector<TypedHandle*> handles(10);
736
730
  // Insert 5 entries, but not releasing.
737
731
  for (int i = 0; i < 5; i++) {
738
732
  std::string key = EncodeKey(i + 1);
739
- Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
733
+ Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
740
734
  ASSERT_TRUE(s.ok());
741
735
  }
742
- ASSERT_EQ(5U, cache->GetCapacity());
743
- ASSERT_EQ(5U, cache->GetUsage());
744
- cache->SetCapacity(10);
745
- ASSERT_EQ(10U, cache->GetCapacity());
746
- ASSERT_EQ(5U, cache->GetUsage());
736
+ ASSERT_EQ(5U, cache.get()->GetCapacity());
737
+ ASSERT_EQ(5U, cache.get()->GetUsage());
738
+ cache.get()->SetCapacity(10);
739
+ ASSERT_EQ(10U, cache.get()->GetCapacity());
740
+ ASSERT_EQ(5U, cache.get()->GetUsage());
747
741
 
748
742
  // test2: decrease capacity
749
743
  // insert 5 more elements to cache, then release 5,
@@ -751,77 +745,77 @@ TEST_P(CacheTest, SetCapacity) {
751
745
  // and usage should be 7
752
746
  for (int i = 5; i < 10; i++) {
753
747
  std::string key = EncodeKey(i + 1);
754
- Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
748
+ Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
755
749
  ASSERT_TRUE(s.ok());
756
750
  }
757
- ASSERT_EQ(10U, cache->GetCapacity());
758
- ASSERT_EQ(10U, cache->GetUsage());
751
+ ASSERT_EQ(10U, cache.get()->GetCapacity());
752
+ ASSERT_EQ(10U, cache.get()->GetUsage());
759
753
  for (int i = 0; i < 5; i++) {
760
- cache->Release(handles[i]);
754
+ cache.Release(handles[i]);
761
755
  }
762
- ASSERT_EQ(10U, cache->GetCapacity());
763
- ASSERT_EQ(10U, cache->GetUsage());
764
- cache->SetCapacity(7);
765
- ASSERT_EQ(7, cache->GetCapacity());
766
- ASSERT_EQ(7, cache->GetUsage());
756
+ ASSERT_EQ(10U, cache.get()->GetCapacity());
757
+ ASSERT_EQ(10U, cache.get()->GetUsage());
758
+ cache.get()->SetCapacity(7);
759
+ ASSERT_EQ(7, cache.get()->GetCapacity());
760
+ ASSERT_EQ(7, cache.get()->GetUsage());
767
761
 
768
762
  // release remaining 5 to keep valgrind happy
769
763
  for (int i = 5; i < 10; i++) {
770
- cache->Release(handles[i]);
764
+ cache.Release(handles[i]);
771
765
  }
772
766
 
773
767
  // Make sure this doesn't crash or upset ASAN/valgrind
774
- cache->DisownData();
768
+ cache.get()->DisownData();
775
769
  }
776
770
 
777
771
  TEST_P(LRUCacheTest, SetStrictCapacityLimit) {
778
772
  // test1: set the flag to false. Insert more keys than capacity. See if they
779
773
  // all go through.
780
- std::shared_ptr<Cache> cache = NewCache(5, 0, false);
781
- std::vector<Cache::Handle*> handles(10);
774
+ SharedCache cache{NewCache(5, 0, false)};
775
+ std::vector<TypedHandle*> handles(10);
782
776
  Status s;
783
777
  for (int i = 0; i < 10; i++) {
784
778
  std::string key = EncodeKey(i + 1);
785
- s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
779
+ s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
786
780
  ASSERT_OK(s);
787
781
  ASSERT_NE(nullptr, handles[i]);
788
782
  }
789
- ASSERT_EQ(10, cache->GetUsage());
783
+ ASSERT_EQ(10, cache.get()->GetUsage());
790
784
 
791
785
  // test2: set the flag to true. Insert and check if it fails.
792
786
  std::string extra_key = EncodeKey(100);
793
787
  Value* extra_value = new Value(0);
794
- cache->SetStrictCapacityLimit(true);
795
- Cache::Handle* handle;
796
- s = cache->Insert(extra_key, extra_value, 1, &deleter, &handle);
788
+ cache.get()->SetStrictCapacityLimit(true);
789
+ TypedHandle* handle;
790
+ s = cache.Insert(extra_key, extra_value, 1, &handle);
797
791
  ASSERT_TRUE(s.IsMemoryLimit());
798
792
  ASSERT_EQ(nullptr, handle);
799
- ASSERT_EQ(10, cache->GetUsage());
793
+ ASSERT_EQ(10, cache.get()->GetUsage());
800
794
 
801
795
  for (int i = 0; i < 10; i++) {
802
- cache->Release(handles[i]);
796
+ cache.Release(handles[i]);
803
797
  }
804
798
 
805
799
  // test3: init with flag being true.
806
- std::shared_ptr<Cache> cache2 = NewCache(5, 0, true);
800
+ SharedCache cache2{NewCache(5, 0, true)};
807
801
  for (int i = 0; i < 5; i++) {
808
802
  std::string key = EncodeKey(i + 1);
809
- s = cache2->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
803
+ s = cache2.Insert(key, new Value(i + 1), 1, &handles[i]);
810
804
  ASSERT_OK(s);
811
805
  ASSERT_NE(nullptr, handles[i]);
812
806
  }
813
- s = cache2->Insert(extra_key, extra_value, 1, &deleter, &handle);
807
+ s = cache2.Insert(extra_key, extra_value, 1, &handle);
814
808
  ASSERT_TRUE(s.IsMemoryLimit());
815
809
  ASSERT_EQ(nullptr, handle);
816
810
  // test insert without handle
817
- s = cache2->Insert(extra_key, extra_value, 1, &deleter);
811
+ s = cache2.Insert(extra_key, extra_value, 1);
818
812
  // AS if the key have been inserted into cache but get evicted immediately.
819
813
  ASSERT_OK(s);
820
- ASSERT_EQ(5, cache2->GetUsage());
821
- ASSERT_EQ(nullptr, cache2->Lookup(extra_key));
814
+ ASSERT_EQ(5, cache2.get()->GetUsage());
815
+ ASSERT_EQ(nullptr, cache2.Lookup(extra_key));
822
816
 
823
817
  for (int i = 0; i < 5; i++) {
824
- cache2->Release(handles[i]);
818
+ cache2.Release(handles[i]);
825
819
  }
826
820
  }
827
821
 
@@ -829,55 +823,54 @@ TEST_P(CacheTest, OverCapacity) {
829
823
  size_t n = 10;
830
824
 
831
825
  // a LRUCache with n entries and one shard only
832
- std::shared_ptr<Cache> cache = NewCache(n, 0, false);
833
-
834
- std::vector<Cache::Handle*> handles(n + 1);
826
+ SharedCache cache{NewCache(n, 0, false)};
827
+ std::vector<TypedHandle*> handles(n + 1);
835
828
 
836
829
  // Insert n+1 entries, but not releasing.
837
830
  for (int i = 0; i < static_cast<int>(n + 1); i++) {
838
831
  std::string key = EncodeKey(i + 1);
839
- Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
832
+ Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
840
833
  ASSERT_TRUE(s.ok());
841
834
  }
842
835
 
843
836
  // Guess what's in the cache now?
844
837
  for (int i = 0; i < static_cast<int>(n + 1); i++) {
845
838
  std::string key = EncodeKey(i + 1);
846
- auto h = cache->Lookup(key);
839
+ auto h = cache.Lookup(key);
847
840
  ASSERT_TRUE(h != nullptr);
848
- if (h) cache->Release(h);
841
+ if (h) cache.Release(h);
849
842
  }
850
843
 
851
844
  // the cache is over capacity since nothing could be evicted
852
- ASSERT_EQ(n + 1U, cache->GetUsage());
845
+ ASSERT_EQ(n + 1U, cache.get()->GetUsage());
853
846
  for (int i = 0; i < static_cast<int>(n + 1); i++) {
854
- cache->Release(handles[i]);
847
+ cache.Release(handles[i]);
855
848
  }
856
849
 
857
850
  if (GetParam() == kHyperClock) {
858
851
  // Make sure eviction is triggered.
859
- ASSERT_OK(cache->Insert(EncodeKey(-1), nullptr, 1, &deleter, &handles[0]));
852
+ ASSERT_OK(cache.Insert(EncodeKey(-1), nullptr, 1, &handles[0]));
860
853
 
861
854
  // cache is under capacity now since elements were released
862
- ASSERT_GE(n, cache->GetUsage());
855
+ ASSERT_GE(n, cache.get()->GetUsage());
863
856
 
864
857
  // clean up
865
- cache->Release(handles[0]);
858
+ cache.Release(handles[0]);
866
859
  } else {
867
860
  // LRUCache checks for over-capacity in Release.
868
861
 
869
862
  // cache is exactly at capacity now with minimal eviction
870
- ASSERT_EQ(n, cache->GetUsage());
863
+ ASSERT_EQ(n, cache.get()->GetUsage());
871
864
 
872
865
  // element 0 is evicted and the rest is there
873
866
  // This is consistent with the LRU policy since the element 0
874
867
  // was released first
875
868
  for (int i = 0; i < static_cast<int>(n + 1); i++) {
876
869
  std::string key = EncodeKey(i + 1);
877
- auto h = cache->Lookup(key);
870
+ auto h = cache.Lookup(key);
878
871
  if (h) {
879
872
  ASSERT_NE(static_cast<size_t>(i), 0U);
880
- cache->Release(h);
873
+ cache.Release(h);
881
874
  } else {
882
875
  ASSERT_EQ(static_cast<size_t>(i), 0U);
883
876
  }
@@ -885,40 +878,15 @@ TEST_P(CacheTest, OverCapacity) {
885
878
  }
886
879
  }
887
880
 
888
- namespace {
889
- std::vector<std::pair<int, int>> legacy_callback_state;
890
- void legacy_callback(void* value, size_t charge) {
891
- legacy_callback_state.push_back(
892
- {DecodeValue(value), static_cast<int>(charge)});
893
- }
894
- }; // namespace
895
-
896
- TEST_P(CacheTest, ApplyToAllCacheEntriesTest) {
897
- std::vector<std::pair<int, int>> inserted;
898
- legacy_callback_state.clear();
899
-
900
- for (int i = 0; i < 10; ++i) {
901
- Insert(i, i * 2, i + 1);
902
- inserted.push_back({i * 2, i + 1});
903
- }
904
- cache_->ApplyToAllCacheEntries(legacy_callback, true);
905
-
906
- std::sort(inserted.begin(), inserted.end());
907
- std::sort(legacy_callback_state.begin(), legacy_callback_state.end());
908
- ASSERT_EQ(inserted.size(), legacy_callback_state.size());
909
- for (int i = 0; i < static_cast<int>(inserted.size()); ++i) {
910
- EXPECT_EQ(inserted[i], legacy_callback_state[i]);
911
- }
912
- }
913
-
914
881
  TEST_P(CacheTest, ApplyToAllEntriesTest) {
915
882
  std::vector<std::string> callback_state;
916
- const auto callback = [&](const Slice& key, void* value, size_t charge,
917
- Cache::DeleterFn deleter) {
883
+ const auto callback = [&](const Slice& key, Cache::ObjectPtr value,
884
+ size_t charge,
885
+ const Cache::CacheItemHelper* helper) {
918
886
  callback_state.push_back(std::to_string(DecodeKey(key)) + "," +
919
887
  std::to_string(DecodeValue(value)) + "," +
920
888
  std::to_string(charge));
921
- assert(deleter == &CacheTest::Deleter);
889
+ assert(helper == &CacheTest::kHelper);
922
890
  };
923
891
 
924
892
  std::vector<std::string> inserted;
@@ -957,8 +925,8 @@ TEST_P(CacheTest, ApplyToAllEntriesDuringResize) {
957
925
 
958
926
  // For callback
959
927
  int special_count = 0;
960
- const auto callback = [&](const Slice&, void*, size_t charge,
961
- Cache::DeleterFn) {
928
+ const auto callback = [&](const Slice&, Cache::ObjectPtr, size_t charge,
929
+ const Cache::CacheItemHelper*) {
962
930
  if (charge == static_cast<size_t>(kSpecialCharge)) {
963
931
  ++special_count;
964
932
  }
@@ -1020,7 +988,7 @@ TEST_P(CacheTest, GetChargeAndDeleter) {
1020
988
  Cache::Handle* h1 = cache_->Lookup(EncodeKey(1));
1021
989
  ASSERT_EQ(2, DecodeValue(cache_->Value(h1)));
1022
990
  ASSERT_EQ(1, cache_->GetCharge(h1));
1023
- ASSERT_EQ(&CacheTest::Deleter, cache_->GetDeleter(h1));
991
+ ASSERT_EQ(&CacheTest::kHelper, cache_->GetCacheItemHelper(h1));
1024
992
  cache_->Release(h1);
1025
993
  }
1026
994