@nxtedition/rocksdb 7.1.4 → 7.1.7

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 (185) hide show
  1. package/binding.cc +32 -14
  2. package/deps/rocksdb/iostats.patch +19 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
  4. package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
  6. package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
  7. package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
  8. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
  9. package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
  11. package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
  19. package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
  20. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
  22. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
  24. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
  28. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  29. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
  41. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
  42. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
  43. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
  44. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
  45. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
  54. package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
  55. package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
  56. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
  57. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
  58. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  59. package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
  60. package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
  61. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
  62. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
  63. package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
  64. package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
  65. package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
  67. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
  68. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
  69. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
  70. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
  71. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
  72. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  73. package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
  74. package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
  75. package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
  76. package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
  77. package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
  80. package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
  82. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
  83. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
  84. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
  85. package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
  86. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
  87. package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
  88. package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
  89. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
  90. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
  91. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
  92. package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
  93. package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
  94. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
  95. package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
  96. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  97. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
  99. package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
  100. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
  101. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
  102. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
  103. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
  104. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  105. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
  106. package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
  107. package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
  108. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
  109. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
  111. package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
  112. package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
  113. package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
  114. package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
  115. package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
  116. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
  117. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
  119. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
  122. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
  124. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
  127. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
  128. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
  129. package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
  130. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
  131. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
  132. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
  133. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
  134. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
  137. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
  138. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  139. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
  140. package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
  146. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
  147. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
  149. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
  150. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
  151. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  152. package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
  153. package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
  154. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
  155. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
  156. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  157. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
  158. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
  159. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
  160. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
  161. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
  162. package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
  163. package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
  164. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
  165. package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
  166. package/deps/rocksdb/rocksdb/util/math.h +41 -0
  167. package/deps/rocksdb/rocksdb/util/math128.h +6 -0
  168. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
  169. package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
  170. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
  171. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
  172. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
  173. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
  174. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
  175. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
  176. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
  177. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
  178. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  179. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
  180. package/index.js +17 -8
  181. package/package.json +1 -1
  182. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  183. package/prebuilds/darwin-x64/node.napi.node +0 -0
  184. package/prebuilds/linux-x64/node.napi.node +0 -0
  185. package/deps/rocksdb/rocksdb/logging/posix_logger.h +0 -179
@@ -111,14 +111,17 @@ void LRUHandleTable::Resize() {
111
111
 
112
112
  LRUCacheShard::LRUCacheShard(
113
113
  size_t capacity, bool strict_capacity_limit, double high_pri_pool_ratio,
114
- bool use_adaptive_mutex, CacheMetadataChargePolicy metadata_charge_policy,
115
- int max_upper_hash_bits,
114
+ double low_pri_pool_ratio, bool use_adaptive_mutex,
115
+ CacheMetadataChargePolicy metadata_charge_policy, int max_upper_hash_bits,
116
116
  const std::shared_ptr<SecondaryCache>& secondary_cache)
117
117
  : capacity_(0),
118
118
  high_pri_pool_usage_(0),
119
+ low_pri_pool_usage_(0),
119
120
  strict_capacity_limit_(strict_capacity_limit),
120
121
  high_pri_pool_ratio_(high_pri_pool_ratio),
121
122
  high_pri_pool_capacity_(0),
123
+ low_pri_pool_ratio_(low_pri_pool_ratio),
124
+ low_pri_pool_capacity_(0),
122
125
  table_(max_upper_hash_bits),
123
126
  usage_(0),
124
127
  lru_usage_(0),
@@ -129,6 +132,7 @@ LRUCacheShard::LRUCacheShard(
129
132
  lru_.next = &lru_;
130
133
  lru_.prev = &lru_;
131
134
  lru_low_pri_ = &lru_;
135
+ lru_bottom_pri_ = &lru_;
132
136
  SetCapacity(capacity);
133
137
  }
134
138
 
@@ -192,10 +196,12 @@ void LRUCacheShard::ApplyToSomeEntries(
192
196
  index_begin, index_end);
193
197
  }
194
198
 
195
- void LRUCacheShard::TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri) {
199
+ void LRUCacheShard::TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri,
200
+ LRUHandle** lru_bottom_pri) {
196
201
  DMutexLock l(mutex_);
197
202
  *lru = &lru_;
198
203
  *lru_low_pri = lru_low_pri_;
204
+ *lru_bottom_pri = lru_bottom_pri_;
199
205
  }
200
206
 
201
207
  size_t LRUCacheShard::TEST_GetLRUSize() {
@@ -214,20 +220,32 @@ double LRUCacheShard::GetHighPriPoolRatio() {
214
220
  return high_pri_pool_ratio_;
215
221
  }
216
222
 
223
+ double LRUCacheShard::GetLowPriPoolRatio() {
224
+ DMutexLock l(mutex_);
225
+ return low_pri_pool_ratio_;
226
+ }
227
+
217
228
  void LRUCacheShard::LRU_Remove(LRUHandle* e) {
218
229
  assert(e->next != nullptr);
219
230
  assert(e->prev != nullptr);
220
231
  if (lru_low_pri_ == e) {
221
232
  lru_low_pri_ = e->prev;
222
233
  }
234
+ if (lru_bottom_pri_ == e) {
235
+ lru_bottom_pri_ = e->prev;
236
+ }
223
237
  e->next->prev = e->prev;
224
238
  e->prev->next = e->next;
225
239
  e->prev = e->next = nullptr;
226
240
  assert(lru_usage_ >= e->total_charge);
227
241
  lru_usage_ -= e->total_charge;
242
+ assert(!e->InHighPriPool() || !e->InLowPriPool());
228
243
  if (e->InHighPriPool()) {
229
244
  assert(high_pri_pool_usage_ >= e->total_charge);
230
245
  high_pri_pool_usage_ -= e->total_charge;
246
+ } else if (e->InLowPriPool()) {
247
+ assert(low_pri_pool_usage_ >= e->total_charge);
248
+ low_pri_pool_usage_ -= e->total_charge;
231
249
  }
232
250
  }
233
251
 
@@ -241,17 +259,34 @@ void LRUCacheShard::LRU_Insert(LRUHandle* e) {
241
259
  e->prev->next = e;
242
260
  e->next->prev = e;
243
261
  e->SetInHighPriPool(true);
262
+ e->SetInLowPriPool(false);
244
263
  high_pri_pool_usage_ += e->total_charge;
245
264
  MaintainPoolSize();
246
- } else {
247
- // Insert "e" to the head of low-pri pool. Note that when
248
- // high_pri_pool_ratio is 0, head of low-pri pool is also head of LRU list.
265
+ } else if (low_pri_pool_ratio_ > 0 &&
266
+ (e->IsHighPri() || e->IsLowPri() || e->HasHit())) {
267
+ // Insert "e" to the head of low-pri pool.
249
268
  e->next = lru_low_pri_->next;
250
269
  e->prev = lru_low_pri_;
251
270
  e->prev->next = e;
252
271
  e->next->prev = e;
253
272
  e->SetInHighPriPool(false);
273
+ e->SetInLowPriPool(true);
274
+ low_pri_pool_usage_ += e->total_charge;
275
+ MaintainPoolSize();
254
276
  lru_low_pri_ = e;
277
+ } else {
278
+ // Insert "e" to the head of bottom-pri pool.
279
+ e->next = lru_bottom_pri_->next;
280
+ e->prev = lru_bottom_pri_;
281
+ e->prev->next = e;
282
+ e->next->prev = e;
283
+ e->SetInHighPriPool(false);
284
+ e->SetInLowPriPool(false);
285
+ // if the low-pri pool is empty, lru_low_pri_ also needs to be updated.
286
+ if (lru_bottom_pri_ == lru_low_pri_) {
287
+ lru_low_pri_ = e;
288
+ }
289
+ lru_bottom_pri_ = e;
255
290
  }
256
291
  lru_usage_ += e->total_charge;
257
292
  }
@@ -262,8 +297,20 @@ void LRUCacheShard::MaintainPoolSize() {
262
297
  lru_low_pri_ = lru_low_pri_->next;
263
298
  assert(lru_low_pri_ != &lru_);
264
299
  lru_low_pri_->SetInHighPriPool(false);
300
+ lru_low_pri_->SetInLowPriPool(true);
265
301
  assert(high_pri_pool_usage_ >= lru_low_pri_->total_charge);
266
302
  high_pri_pool_usage_ -= lru_low_pri_->total_charge;
303
+ low_pri_pool_usage_ += lru_low_pri_->total_charge;
304
+ }
305
+
306
+ while (low_pri_pool_usage_ > low_pri_pool_capacity_) {
307
+ // Overflow last entry in low-pri pool to bottom-pri pool.
308
+ lru_bottom_pri_ = lru_bottom_pri_->next;
309
+ assert(lru_bottom_pri_ != &lru_);
310
+ lru_bottom_pri_->SetInHighPriPool(false);
311
+ lru_bottom_pri_->SetInLowPriPool(false);
312
+ assert(low_pri_pool_usage_ >= lru_bottom_pri_->total_charge);
313
+ low_pri_pool_usage_ -= lru_bottom_pri_->total_charge;
267
314
  }
268
315
  }
269
316
 
@@ -288,6 +335,7 @@ void LRUCacheShard::SetCapacity(size_t capacity) {
288
335
  DMutexLock l(mutex_);
289
336
  capacity_ = capacity;
290
337
  high_pri_pool_capacity_ = capacity_ * high_pri_pool_ratio_;
338
+ low_pri_pool_capacity_ = capacity_ * low_pri_pool_ratio_;
291
339
  EvictFromLRU(0, &last_reference_list);
292
340
  }
293
341
 
@@ -458,11 +506,12 @@ Cache::Handle* LRUCacheShard::Lookup(
458
506
  memcpy(e->key_data, key.data(), key.size());
459
507
  e->value = nullptr;
460
508
  e->sec_handle = secondary_handle.release();
509
+ e->total_charge = 0;
461
510
  e->Ref();
511
+ e->SetIsInSecondaryCache(is_in_sec_cache);
462
512
 
463
513
  if (wait) {
464
514
  Promote(e);
465
- e->SetIsInSecondaryCache(is_in_sec_cache);
466
515
  if (!e->value) {
467
516
  // The secondary cache returned a handle, but the lookup failed.
468
517
  e->Unref();
@@ -476,7 +525,6 @@ Cache::Handle* LRUCacheShard::Lookup(
476
525
  // If wait is false, we always return a handle and let the caller
477
526
  // release the handle after checking for success or failure.
478
527
  e->SetIncomplete(true);
479
- e->SetIsInSecondaryCache(is_in_sec_cache);
480
528
  // This may be slightly inaccurate, if the lookup eventually fails.
481
529
  // But the probability is very low.
482
530
  PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
@@ -503,6 +551,13 @@ void LRUCacheShard::SetHighPriorityPoolRatio(double high_pri_pool_ratio) {
503
551
  MaintainPoolSize();
504
552
  }
505
553
 
554
+ void LRUCacheShard::SetLowPriorityPoolRatio(double low_pri_pool_ratio) {
555
+ DMutexLock l(mutex_);
556
+ low_pri_pool_ratio_ = low_pri_pool_ratio;
557
+ low_pri_pool_capacity_ = capacity_ * low_pri_pool_ratio_;
558
+ MaintainPoolSize();
559
+ }
560
+
506
561
  bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
507
562
  if (handle == nullptr) {
508
563
  return false;
@@ -634,12 +689,15 @@ std::string LRUCacheShard::GetPrintableOptions() const {
634
689
  DMutexLock l(mutex_);
635
690
  snprintf(buffer, kBufferSize, " high_pri_pool_ratio: %.3lf\n",
636
691
  high_pri_pool_ratio_);
692
+ snprintf(buffer + strlen(buffer), kBufferSize - strlen(buffer),
693
+ " low_pri_pool_ratio: %.3lf\n", low_pri_pool_ratio_);
637
694
  }
638
695
  return std::string(buffer);
639
696
  }
640
697
 
641
698
  LRUCache::LRUCache(size_t capacity, int num_shard_bits,
642
699
  bool strict_capacity_limit, double high_pri_pool_ratio,
700
+ double low_pri_pool_ratio,
643
701
  std::shared_ptr<MemoryAllocator> allocator,
644
702
  bool use_adaptive_mutex,
645
703
  CacheMetadataChargePolicy metadata_charge_policy,
@@ -653,7 +711,7 @@ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
653
711
  for (int i = 0; i < num_shards_; i++) {
654
712
  new (&shards_[i]) LRUCacheShard(
655
713
  per_shard, strict_capacity_limit, high_pri_pool_ratio,
656
- use_adaptive_mutex, metadata_charge_policy,
714
+ low_pri_pool_ratio, use_adaptive_mutex, metadata_charge_policy,
657
715
  /* max_upper_hash_bits */ 32 - num_shard_bits, secondary_cache);
658
716
  }
659
717
  secondary_cache_ = secondary_cache;
@@ -775,7 +833,8 @@ std::shared_ptr<Cache> NewLRUCache(
775
833
  double high_pri_pool_ratio,
776
834
  std::shared_ptr<MemoryAllocator> memory_allocator, bool use_adaptive_mutex,
777
835
  CacheMetadataChargePolicy metadata_charge_policy,
778
- const std::shared_ptr<SecondaryCache>& secondary_cache) {
836
+ const std::shared_ptr<SecondaryCache>& secondary_cache,
837
+ double low_pri_pool_ratio) {
779
838
  if (num_shard_bits >= 20) {
780
839
  return nullptr; // The cache cannot be sharded into too many fine pieces.
781
840
  }
@@ -783,30 +842,40 @@ std::shared_ptr<Cache> NewLRUCache(
783
842
  // Invalid high_pri_pool_ratio
784
843
  return nullptr;
785
844
  }
845
+ if (low_pri_pool_ratio < 0.0 || low_pri_pool_ratio > 1.0) {
846
+ // Invalid high_pri_pool_ratio
847
+ return nullptr;
848
+ }
849
+ if (low_pri_pool_ratio + high_pri_pool_ratio > 1.0) {
850
+ // Invalid high_pri_pool_ratio and low_pri_pool_ratio combination
851
+ return nullptr;
852
+ }
786
853
  if (num_shard_bits < 0) {
787
854
  num_shard_bits = GetDefaultCacheShardBits(capacity);
788
855
  }
789
856
  return std::make_shared<LRUCache>(
790
857
  capacity, num_shard_bits, strict_capacity_limit, high_pri_pool_ratio,
791
- std::move(memory_allocator), use_adaptive_mutex, metadata_charge_policy,
792
- secondary_cache);
858
+ low_pri_pool_ratio, std::move(memory_allocator), use_adaptive_mutex,
859
+ metadata_charge_policy, secondary_cache);
793
860
  }
794
861
 
795
862
  std::shared_ptr<Cache> NewLRUCache(const LRUCacheOptions& cache_opts) {
796
- return NewLRUCache(
797
- cache_opts.capacity, cache_opts.num_shard_bits,
798
- cache_opts.strict_capacity_limit, cache_opts.high_pri_pool_ratio,
799
- cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
800
- cache_opts.metadata_charge_policy, cache_opts.secondary_cache);
863
+ return NewLRUCache(cache_opts.capacity, cache_opts.num_shard_bits,
864
+ cache_opts.strict_capacity_limit,
865
+ cache_opts.high_pri_pool_ratio,
866
+ cache_opts.memory_allocator, cache_opts.use_adaptive_mutex,
867
+ cache_opts.metadata_charge_policy,
868
+ cache_opts.secondary_cache, cache_opts.low_pri_pool_ratio);
801
869
  }
802
870
 
803
871
  std::shared_ptr<Cache> NewLRUCache(
804
872
  size_t capacity, int num_shard_bits, bool strict_capacity_limit,
805
873
  double high_pri_pool_ratio,
806
874
  std::shared_ptr<MemoryAllocator> memory_allocator, bool use_adaptive_mutex,
807
- CacheMetadataChargePolicy metadata_charge_policy) {
875
+ CacheMetadataChargePolicy metadata_charge_policy,
876
+ double low_pri_pool_ratio) {
808
877
  return NewLRUCache(capacity, num_shard_bits, strict_capacity_limit,
809
878
  high_pri_pool_ratio, memory_allocator, use_adaptive_mutex,
810
- metadata_charge_policy, nullptr);
879
+ metadata_charge_policy, nullptr, low_pri_pool_ratio);
811
880
  }
812
881
  } // namespace ROCKSDB_NAMESPACE
@@ -74,7 +74,7 @@ struct LRUHandle {
74
74
  // The number of external refs to this entry. The cache itself is not counted.
75
75
  uint32_t refs;
76
76
 
77
- enum Flags : uint8_t {
77
+ enum Flags : uint16_t {
78
78
  // Whether this entry is referenced by the hash table.
79
79
  IN_CACHE = (1 << 0),
80
80
  // Whether this entry is high priority entry.
@@ -89,9 +89,13 @@ struct LRUHandle {
89
89
  IS_PENDING = (1 << 5),
90
90
  // Whether this handle is still in a lower tier
91
91
  IS_IN_SECONDARY_CACHE = (1 << 6),
92
+ // Whether this entry is low priority entry.
93
+ IS_LOW_PRI = (1 << 7),
94
+ // Whether this entry is in low-pri pool.
95
+ IN_LOW_PRI_POOL = (1 << 8),
92
96
  };
93
97
 
94
- uint8_t flags;
98
+ uint16_t flags;
95
99
 
96
100
  #ifdef __SANITIZE_THREAD__
97
101
  // TSAN can report a false data race on flags, where one thread is writing
@@ -122,6 +126,8 @@ struct LRUHandle {
122
126
  bool InCache() const { return flags & IN_CACHE; }
123
127
  bool IsHighPri() const { return flags & IS_HIGH_PRI; }
124
128
  bool InHighPriPool() const { return flags & IN_HIGH_PRI_POOL; }
129
+ bool IsLowPri() const { return flags & IS_LOW_PRI; }
130
+ bool InLowPriPool() const { return flags & IN_LOW_PRI_POOL; }
125
131
  bool HasHit() const { return flags & HAS_HIT; }
126
132
  bool IsSecondaryCacheCompatible() const {
127
133
  #ifdef __SANITIZE_THREAD__
@@ -144,8 +150,13 @@ struct LRUHandle {
144
150
  void SetPriority(Cache::Priority priority) {
145
151
  if (priority == Cache::Priority::HIGH) {
146
152
  flags |= IS_HIGH_PRI;
153
+ flags &= ~IS_LOW_PRI;
154
+ } else if (priority == Cache::Priority::LOW) {
155
+ flags &= ~IS_HIGH_PRI;
156
+ flags |= IS_LOW_PRI;
147
157
  } else {
148
158
  flags &= ~IS_HIGH_PRI;
159
+ flags &= ~IS_LOW_PRI;
149
160
  }
150
161
  }
151
162
 
@@ -157,6 +168,14 @@ struct LRUHandle {
157
168
  }
158
169
  }
159
170
 
171
+ void SetInLowPriPool(bool in_low_pri_pool) {
172
+ if (in_low_pri_pool) {
173
+ flags |= IN_LOW_PRI_POOL;
174
+ } else {
175
+ flags &= ~IN_LOW_PRI_POOL;
176
+ }
177
+ }
178
+
160
179
  void SetHit() { flags |= HAS_HIT; }
161
180
 
162
181
  void SetSecondaryCacheCompatible(bool compat) {
@@ -298,7 +317,8 @@ class LRUHandleTable {
298
317
  class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
299
318
  public:
300
319
  LRUCacheShard(size_t capacity, bool strict_capacity_limit,
301
- double high_pri_pool_ratio, bool use_adaptive_mutex,
320
+ double high_pri_pool_ratio, double low_pri_pool_ratio,
321
+ bool use_adaptive_mutex,
302
322
  CacheMetadataChargePolicy metadata_charge_policy,
303
323
  int max_upper_hash_bits,
304
324
  const std::shared_ptr<SecondaryCache>& secondary_cache);
@@ -315,6 +335,9 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
315
335
  // Set percentage of capacity reserved for high-pri cache entries.
316
336
  void SetHighPriorityPoolRatio(double high_pri_pool_ratio);
317
337
 
338
+ // Set percentage of capacity reserved for low-pri cache entries.
339
+ void SetLowPriorityPoolRatio(double low_pri_pool_ratio);
340
+
318
341
  // Like Cache methods, but with an extra "hash" parameter.
319
342
  virtual Status Insert(const Slice& key, uint32_t hash, void* value,
320
343
  size_t charge, Cache::DeleterFn deleter,
@@ -366,15 +389,19 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
366
389
 
367
390
  virtual std::string GetPrintableOptions() const override;
368
391
 
369
- void TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri);
392
+ void TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri,
393
+ LRUHandle** lru_bottom_pri);
370
394
 
371
- // Retrieves number of elements in LRU, for unit test purpose only.
372
- // Not threadsafe.
395
+ // Retrieves number of elements in LRU, for unit test purpose only.
396
+ // Not threadsafe.
373
397
  size_t TEST_GetLRUSize();
374
398
 
375
- // Retrieves high pri pool ratio
399
+ // Retrieves high pri pool ratio
376
400
  double GetHighPriPoolRatio();
377
401
 
402
+ // Retrieves low pri pool ratio
403
+ double GetLowPriPoolRatio();
404
+
378
405
  private:
379
406
  friend class LRUCache;
380
407
  // Insert an item into the hash table and, if handle is null, insert into
@@ -414,6 +441,9 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
414
441
  // Memory size for entries in high-pri pool.
415
442
  size_t high_pri_pool_usage_;
416
443
 
444
+ // Memory size for entries in low-pri pool.
445
+ size_t low_pri_pool_usage_;
446
+
417
447
  // Whether to reject insertion if cache reaches its full capacity.
418
448
  bool strict_capacity_limit_;
419
449
 
@@ -424,6 +454,13 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
424
454
  // Remember the value to avoid recomputing each time.
425
455
  double high_pri_pool_capacity_;
426
456
 
457
+ // Ratio of capacity reserved for low priority cache entries.
458
+ double low_pri_pool_ratio_;
459
+
460
+ // Low-pri pool size, equals to capacity * low_pri_pool_ratio.
461
+ // Remember the value to avoid recomputing each time.
462
+ double low_pri_pool_capacity_;
463
+
427
464
  // Dummy head of LRU list.
428
465
  // lru.prev is newest entry, lru.next is oldest entry.
429
466
  // LRU contains items which can be evicted, ie reference only by cache
@@ -432,6 +469,9 @@ class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
432
469
  // Pointer to head of low-pri pool in LRU list.
433
470
  LRUHandle* lru_low_pri_;
434
471
 
472
+ // Pointer to head of bottom-pri pool in LRU list.
473
+ LRUHandle* lru_bottom_pri_;
474
+
435
475
  // ------------^^^^^^^^^^^^^-----------
436
476
  // Not frequently modified data members
437
477
  // ------------------------------------
@@ -466,7 +506,7 @@ class LRUCache
466
506
  : public ShardedCache {
467
507
  public:
468
508
  LRUCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit,
469
- double high_pri_pool_ratio,
509
+ double high_pri_pool_ratio, double low_pri_pool_ratio,
470
510
  std::shared_ptr<MemoryAllocator> memory_allocator = nullptr,
471
511
  bool use_adaptive_mutex = kDefaultToAdaptiveMutex,
472
512
  CacheMetadataChargePolicy metadata_charge_policy =