@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.
- package/binding.cc +1 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
- package/deps/rocksdb/rocksdb/Makefile +91 -11
- package/deps/rocksdb/rocksdb/TARGETS +8 -4
- package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
- package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
- package/deps/rocksdb/rocksdb/db/c.cc +29 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
- package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
- package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
- package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
- package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
- package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
- package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
- package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
- package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
- package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
- package/deps/rocksdb/rocksdb/file/filename.h +4 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
- package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options.cc +2 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
- package/deps/rocksdb/rocksdb/src.mk +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +26 -29
- package/deps/rocksdb/rocksdb/table/format.h +44 -26
- package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
- package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
- package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
- package/deps/rocksdb/rocksdb/util/timer.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
- package/deps/rocksdb/rocksdb.gyp +0 -1
- package/index.js +6 -10
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
- 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
|
-
:
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
444
|
-
|
|
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
|
|
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
|
|
481
|
-
// mutex if we
|
|
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 &&
|
|
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,
|
|
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 (
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
|