@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.
- package/binding.cc +32 -14
- package/deps/rocksdb/iostats.patch +19 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
- package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
- package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
- package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
- package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
- package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
- package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
- package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
- package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
- package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
- package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
- package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
- package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
- package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
- package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
- package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
- package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
- package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
- package/deps/rocksdb/rocksdb/util/math.h +41 -0
- package/deps/rocksdb/rocksdb/util/math128.h +6 -0
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
- package/index.js +17 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- 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
|
-
|
|
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
|
-
|
|
248
|
-
//
|
|
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,
|
|
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
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
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 :
|
|
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
|
-
|
|
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,
|
|
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
|
-
//
|
|
372
|
-
//
|
|
395
|
+
// Retrieves number of elements in LRU, for unit test purpose only.
|
|
396
|
+
// Not threadsafe.
|
|
373
397
|
size_t TEST_GetLRUSize();
|
|
374
398
|
|
|
375
|
-
//
|
|
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 =
|