@nxtedition/rocksdb 7.1.14 → 7.1.15

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/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -173,13 +173,13 @@ inline int LRUHandleTable::FindSlot(const Slice& key,
173
173
  LRUCacheShard::LRUCacheShard(size_t capacity, size_t estimated_value_size,
174
174
  bool strict_capacity_limit,
175
175
  CacheMetadataChargePolicy metadata_charge_policy)
176
- : capacity_(capacity),
176
+ : CacheShard(metadata_charge_policy),
177
+ capacity_(capacity),
177
178
  strict_capacity_limit_(strict_capacity_limit),
178
179
  table_(
179
180
  CalcHashBits(capacity, estimated_value_size, metadata_charge_policy)),
180
181
  usage_(0),
181
182
  lru_usage_(0) {
182
- set_metadata_charge_policy(metadata_charge_policy);
183
183
  // Make empty circular linked list.
184
184
  lru_.next = &lru_;
185
185
  lru_.prev = &lru_;
@@ -525,6 +525,16 @@ size_t LRUCacheShard::GetPinnedUsage() const {
525
525
  return usage_ - lru_usage_;
526
526
  }
527
527
 
528
+ size_t LRUCacheShard::GetOccupancyCount() const {
529
+ DMutexLock l(mutex_);
530
+ return table_.GetOccupancy();
531
+ }
532
+
533
+ size_t LRUCacheShard::GetTableAddressCount() const {
534
+ DMutexLock l(mutex_);
535
+ return table_.GetTableSize();
536
+ }
537
+
528
538
  std::string LRUCacheShard::GetPrintableOptions() const { return std::string{}; }
529
539
 
530
540
  LRUCache::LRUCache(size_t capacity, size_t estimated_value_size,
@@ -368,6 +368,8 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
368
368
 
369
369
  size_t GetUsage() const override;
370
370
  size_t GetPinnedUsage() const override;
371
+ size_t GetOccupancyCount() const override;
372
+ size_t GetTableAddressCount() const override;
371
373
 
372
374
  void ApplyToSomeEntries(
373
375
  const std::function<void(const Slice& key, void* value, size_t charge,
@@ -12,6 +12,7 @@
12
12
  #include <cassert>
13
13
  #include <cstdint>
14
14
  #include <cstdio>
15
+ #include <cstdlib>
15
16
 
16
17
  #include "monitoring/perf_context_imp.h"
17
18
  #include "monitoring/statistics.h"
@@ -114,7 +115,8 @@ LRUCacheShard::LRUCacheShard(
114
115
  double low_pri_pool_ratio, bool use_adaptive_mutex,
115
116
  CacheMetadataChargePolicy metadata_charge_policy, int max_upper_hash_bits,
116
117
  const std::shared_ptr<SecondaryCache>& secondary_cache)
117
- : capacity_(0),
118
+ : CacheShard(metadata_charge_policy),
119
+ capacity_(0),
118
120
  high_pri_pool_usage_(0),
119
121
  low_pri_pool_usage_(0),
120
122
  strict_capacity_limit_(strict_capacity_limit),
@@ -127,7 +129,6 @@ LRUCacheShard::LRUCacheShard(
127
129
  lru_usage_(0),
128
130
  mutex_(use_adaptive_mutex),
129
131
  secondary_cache_(secondary_cache) {
130
- set_metadata_charge_policy(metadata_charge_policy);
131
132
  // Make empty circular linked list.
132
133
  lru_.next = &lru_;
133
134
  lru_.prev = &lru_;
@@ -329,6 +330,19 @@ void LRUCacheShard::EvictFromLRU(size_t charge,
329
330
  }
330
331
  }
331
332
 
333
+ void LRUCacheShard::TryInsertIntoSecondaryCache(
334
+ autovector<LRUHandle*> evicted_handles) {
335
+ for (auto entry : evicted_handles) {
336
+ if (secondary_cache_ && entry->IsSecondaryCacheCompatible() &&
337
+ !entry->IsInSecondaryCache()) {
338
+ secondary_cache_->Insert(entry->key(), entry->value, entry->info_.helper)
339
+ .PermitUncheckedError();
340
+ }
341
+ // Free the entries here outside of mutex for performance reasons.
342
+ entry->Free();
343
+ }
344
+ }
345
+
332
346
  void LRUCacheShard::SetCapacity(size_t capacity) {
333
347
  autovector<LRUHandle*> last_reference_list;
334
348
  {
@@ -339,16 +353,7 @@ void LRUCacheShard::SetCapacity(size_t capacity) {
339
353
  EvictFromLRU(0, &last_reference_list);
340
354
  }
341
355
 
342
- // Try to insert the evicted entries into tiered cache.
343
- // Free the entries outside of mutex for performance reasons.
344
- for (auto entry : last_reference_list) {
345
- if (secondary_cache_ && entry->IsSecondaryCacheCompatible() &&
346
- !entry->IsInSecondaryCache()) {
347
- secondary_cache_->Insert(entry->key(), entry->value, entry->info_.helper)
348
- .PermitUncheckedError();
349
- }
350
- entry->Free();
351
- }
356
+ TryInsertIntoSecondaryCache(last_reference_list);
352
357
  }
353
358
 
354
359
  void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
@@ -411,16 +416,7 @@ Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
411
416
  }
412
417
  }
413
418
 
414
- // Try to insert the evicted entries into the secondary cache.
415
- // Free the entries here outside of mutex for performance reasons.
416
- for (auto entry : last_reference_list) {
417
- if (secondary_cache_ && entry->IsSecondaryCacheCompatible() &&
418
- !entry->IsInSecondaryCache()) {
419
- secondary_cache_->Insert(entry->key(), entry->value, entry->info_.helper)
420
- .PermitUncheckedError();
421
- }
422
- entry->Free();
423
- }
419
+ TryInsertIntoSecondaryCache(last_reference_list);
424
420
 
425
421
  return s;
426
422
  }
@@ -430,23 +426,70 @@ void LRUCacheShard::Promote(LRUHandle* e) {
430
426
 
431
427
  assert(secondary_handle->IsReady());
432
428
  e->SetIncomplete(false);
433
- e->SetInCache(true);
429
+ e->SetInCache(false);
434
430
  e->value = secondary_handle->Value();
435
431
  e->CalcTotalCharge(secondary_handle->Size(), metadata_charge_policy_);
436
432
  delete secondary_handle;
437
433
 
438
- // This call could fail if the cache is over capacity and
439
- // strict_capacity_limit_ is true. In such a case, we don't want
440
- // InsertItem() to free the handle, since the item is already in memory
441
- // and the caller will most likely just read from disk if we erase it here.
442
434
  if (e->value) {
443
- Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(e);
444
- Status s = InsertItem(e, &handle, /*free_handle_on_fail=*/false);
435
+ Status s;
436
+ if (secondary_cache_ && secondary_cache_->SupportForceErase() &&
437
+ e->IsStandalone()) {
438
+ // Insert a dummy handle and return a standalone handle to caller.
439
+ // Charge the standalone handle.
440
+ autovector<LRUHandle*> last_reference_list;
441
+ bool free_standalone_handle{false};
442
+ {
443
+ DMutexLock l(mutex_);
444
+
445
+ // Free the space following strict LRU policy until enough space
446
+ // is freed or the lru list is empty.
447
+ EvictFromLRU(e->total_charge, &last_reference_list);
448
+
449
+ if ((usage_ + e->total_charge) > capacity_ && strict_capacity_limit_) {
450
+ free_standalone_handle = true;
451
+ } else {
452
+ usage_ += e->total_charge;
453
+ }
454
+ }
455
+
456
+ TryInsertIntoSecondaryCache(last_reference_list);
457
+ if (free_standalone_handle) {
458
+ e->Unref();
459
+ e->Free();
460
+ e = nullptr;
461
+ } else {
462
+ PERF_COUNTER_ADD(block_cache_standalone_handle_count, 1);
463
+ }
464
+
465
+ // Insert a dummy handle into the primary cache. This dummy handle is
466
+ // not IsSecondaryCacheCompatible().
467
+ Cache::Priority priority =
468
+ e->IsHighPri() ? Cache::Priority::HIGH : Cache::Priority::LOW;
469
+ s = Insert(e->key(), e->hash, /*value=*/nullptr, 0,
470
+ /*deleter=*/nullptr, /*helper=*/nullptr, /*handle=*/nullptr,
471
+ priority);
472
+ } else {
473
+ e->SetInCache(true);
474
+ e->SetIsStandalone(false);
475
+ Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(e);
476
+ // This InsertItem() could fail if the cache is over capacity and
477
+ // strict_capacity_limit_ is true. In such a case, we don't want
478
+ // InsertItem() to free the handle, since the item is already in memory
479
+ // and the caller will most likely just read it from disk if we erase it
480
+ // here.
481
+ s = InsertItem(e, &handle, /*free_handle_on_fail=*/false);
482
+ if (s.ok()) {
483
+ PERF_COUNTER_ADD(block_cache_real_handle_count, 1);
484
+ }
485
+ }
486
+
445
487
  if (!s.ok()) {
446
488
  // Item is in memory, but not accounted against the cache capacity.
447
489
  // When the handle is released, the item should get deleted.
448
490
  assert(!e->InCache());
449
491
  }
492
+
450
493
  } else {
451
494
  // Since the secondary cache lookup failed, mark the item as not in cache
452
495
  // Don't charge the cache as its only metadata that'll shortly be released
@@ -454,6 +497,7 @@ void LRUCacheShard::Promote(LRUHandle* e) {
454
497
  // TODO
455
498
  e->CalcTotalCharge(0, metadata_charge_policy_);
456
499
  e->SetInCache(false);
500
+ e->SetIsStandalone(false);
457
501
  }
458
502
  }
459
503
 
@@ -463,34 +507,59 @@ Cache::Handle* LRUCacheShard::Lookup(
463
507
  const ShardedCache::CreateCallback& create_cb, Cache::Priority priority,
464
508
  bool wait, Statistics* stats) {
465
509
  LRUHandle* e = nullptr;
510
+ bool found_dummy_entry{false};
466
511
  {
467
512
  DMutexLock l(mutex_);
468
513
  e = table_.Lookup(key, hash);
469
514
  if (e != nullptr) {
470
515
  assert(e->InCache());
471
516
  if (!e->HasRefs()) {
472
- // The entry is in LRU since it's in hash and has no external references
517
+ // The entry is in LRU since it's in hash and has no external
518
+ // references.
473
519
  LRU_Remove(e);
474
520
  }
475
521
  e->Ref();
476
522
  e->SetHit();
523
+
524
+ // For a dummy handle, if it was retrieved from secondary cache,
525
+ // it may still exist in secondary cache.
526
+ // If the handle exists in secondary cache, the value should be
527
+ // erased from sec cache and be inserted into primary cache.
528
+ if (!e->value && secondary_cache_ &&
529
+ secondary_cache_->SupportForceErase()) {
530
+ found_dummy_entry = true;
531
+ }
477
532
  }
478
533
  }
479
534
 
480
- // If handle table lookup failed, then allocate a handle outside the
481
- // mutex if we're going to lookup in the secondary cache.
535
+ // If handle table lookup failed or the handle is a dummy one, allocate
536
+ // a handle outside the mutex if we re going to lookup in the secondary cache.
537
+ //
538
+ // When a block is firstly Lookup from CompressedSecondaryCache, we just
539
+ // insert a dummy block into the primary cache (charging the actual size of
540
+ // the block) and don't erase the block from CompressedSecondaryCache. A
541
+ // standalone handle is returned to the caller. Only if the block is hit
542
+ // again, we erase it from CompressedSecondaryCache and add it into the
543
+ // primary cache.
544
+ //
482
545
  // Only support synchronous for now.
483
546
  // TODO: Support asynchronous lookup in secondary cache
484
- if (!e && secondary_cache_ && helper && helper->saveto_cb) {
547
+ if ((!e || found_dummy_entry) && secondary_cache_ && helper &&
548
+ helper->saveto_cb) {
485
549
  // For objects from the secondary cache, we expect the caller to provide
486
550
  // a way to create/delete the primary cache object. The only case where
487
551
  // a deleter would not be required is for dummy entries inserted for
488
552
  // accounting purposes, which we won't demote to the secondary cache
489
553
  // anyway.
490
554
  assert(create_cb && helper->del_cb);
555
+ // Release the dummy handle.
556
+ if (e) {
557
+ Release(reinterpret_cast<Cache::Handle*>(e), true /*erase_if_last_ref*/);
558
+ }
491
559
  bool is_in_sec_cache{false};
492
560
  std::unique_ptr<SecondaryCacheResultHandle> secondary_handle =
493
- secondary_cache_->Lookup(key, create_cb, wait, is_in_sec_cache);
561
+ secondary_cache_->Lookup(key, create_cb, wait, found_dummy_entry,
562
+ is_in_sec_cache);
494
563
  if (secondary_handle != nullptr) {
495
564
  e = reinterpret_cast<LRUHandle*>(
496
565
  new char[sizeof(LRUHandle) - 1 + key.size()]);
@@ -510,16 +579,22 @@ Cache::Handle* LRUCacheShard::Lookup(
510
579
  e->Ref();
511
580
  e->SetIsInSecondaryCache(is_in_sec_cache);
512
581
 
582
+ if (secondary_cache_->SupportForceErase() && !found_dummy_entry) {
583
+ e->SetIsStandalone(true);
584
+ }
585
+
513
586
  if (wait) {
514
587
  Promote(e);
515
- if (!e->value) {
516
- // The secondary cache returned a handle, but the lookup failed.
517
- e->Unref();
518
- e->Free();
519
- e = nullptr;
520
- } else {
521
- PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
522
- RecordTick(stats, SECONDARY_CACHE_HITS);
588
+ if (e) {
589
+ if (!e->value) {
590
+ // The secondary cache returned a handle, but the lookup failed.
591
+ e->Unref();
592
+ e->Free();
593
+ e = nullptr;
594
+ } else {
595
+ PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
596
+ RecordTick(stats, SECONDARY_CACHE_HITS);
597
+ }
523
598
  }
524
599
  } else {
525
600
  // If wait is false, we always return a handle and let the caller
@@ -530,6 +605,8 @@ Cache::Handle* LRUCacheShard::Lookup(
530
605
  PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
531
606
  RecordTick(stats, SECONDARY_CACHE_HITS);
532
607
  }
608
+ } else {
609
+ e = nullptr;
533
610
  }
534
611
  }
535
612
  return reinterpret_cast<Cache::Handle*>(e);
@@ -682,6 +759,16 @@ size_t LRUCacheShard::GetPinnedUsage() const {
682
759
  return usage_ - lru_usage_;
683
760
  }
684
761
 
762
+ size_t LRUCacheShard::GetOccupancyCount() const {
763
+ DMutexLock l(mutex_);
764
+ return table_.GetOccupancyCount();
765
+ }
766
+
767
+ size_t LRUCacheShard::GetTableAddressCount() const {
768
+ DMutexLock l(mutex_);
769
+ return size_t{1} << table_.GetLengthBits();
770
+ }
771
+
685
772
  std::string LRUCacheShard::GetPrintableOptions() const {
686
773
  const int kBufferSize = 200;
687
774
  char buffer[kBufferSize];
@@ -843,7 +930,7 @@ std::shared_ptr<Cache> NewLRUCache(
843
930
  return nullptr;
844
931
  }
845
932
  if (low_pri_pool_ratio < 0.0 || low_pri_pool_ratio > 1.0) {
846
- // Invalid high_pri_pool_ratio
933
+ // Invalid low_pri_pool_ratio
847
934
  return nullptr;
848
935
  }
849
936
  if (low_pri_pool_ratio + high_pri_pool_ratio > 1.0) {
@@ -40,8 +40,11 @@ namespace lru_cache {
40
40
  // In that case the entry is not in the LRU list and not in hash table.
41
41
  // The entry can be freed when refs becomes 0.
42
42
  // (refs >= 1 && in_cache == false)
43
- //
44
- // All newly created LRUHandles are in state 1. If you call
43
+ // 4. The handle is never inserted into the LRUCache (both hash table and LRU
44
+ // list) and it doesn't experience the above three states.
45
+ // The entry can be freed when refs becomes 0.
46
+ // (refs >= 1 && in_cache == false && IS_STANDALONE == true)
47
+ // All newly created LRUHandles are in state 1 or 4. If you call
45
48
  // LRUCacheShard::Release on entry in state 1, it will go into state 2.
46
49
  // To move from state 1 to state 3, either call LRUCacheShard::Erase or
47
50
  // LRUCacheShard::Insert with the same key (but possibly different value).
@@ -93,6 +96,9 @@ struct LRUHandle {
93
96
  IS_LOW_PRI = (1 << 7),
94
97
  // Whether this entry is in low-pri pool.
95
98
  IN_LOW_PRI_POOL = (1 << 8),
99
+ // Whether this entry is not inserted into the cache (both hash table and
100
+ // LRU list).
101
+ IS_STANDALONE = (1 << 9),
96
102
  };
97
103
 
98
104
  uint16_t flags;
@@ -138,6 +144,7 @@ struct LRUHandle {
138
144
  }
139
145
  bool IsPending() const { return flags & IS_PENDING; }
140
146
  bool IsInSecondaryCache() const { return flags & IS_IN_SECONDARY_CACHE; }
147
+ bool IsStandalone() const { return flags & IS_STANDALONE; }
141
148
 
142
149
  void SetInCache(bool in_cache) {
143
150
  if (in_cache) {
@@ -205,6 +212,14 @@ struct LRUHandle {
205
212
  }
206
213
  }
207
214
 
215
+ void SetIsStandalone(bool is_standalone) {
216
+ if (is_standalone) {
217
+ flags |= IS_STANDALONE;
218
+ } else {
219
+ flags &= ~IS_STANDALONE;
220
+ }
221
+ }
222
+
208
223
  void Free() {
209
224
  assert(refs == 0);
210
225
  #ifdef __SANITIZE_THREAD__
@@ -290,6 +305,8 @@ class LRUHandleTable {
290
305
 
291
306
  int GetLengthBits() const { return length_bits_; }
292
307
 
308
+ size_t GetOccupancyCount() const { return elems_; }
309
+
293
310
  private:
294
311
  // Return a pointer to slot that points to a cache entry that
295
312
  // matches key/hash. If there is no such cache entry, return a
@@ -379,6 +396,8 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
379
396
 
380
397
  virtual size_t GetUsage() const override;
381
398
  virtual size_t GetPinnedUsage() const override;
399
+ virtual size_t GetOccupancyCount() const override;
400
+ virtual size_t GetTableAddressCount() const override;
382
401
 
383
402
  virtual void ApplyToSomeEntries(
384
403
  const std::function<void(const Slice& key, void* value, size_t charge,
@@ -435,6 +454,9 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
435
454
  // holding the mutex_.
436
455
  void EvictFromLRU(size_t charge, autovector<LRUHandle*>* deleted);
437
456
 
457
+ // Try to insert the evicted handles into the secondary cache.
458
+ void TryInsertIntoSecondaryCache(autovector<LRUHandle*> evicted_handles);
459
+
438
460
  // Initialized before use.
439
461
  size_t capacity_;
440
462