@nxtedition/rocksdb 7.1.20 → 7.1.21
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/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
- package/deps/rocksdb/rocksdb/Makefile +1 -1
- package/deps/rocksdb/rocksdb/TARGETS +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
- package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
- package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
- package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
- package/deps/rocksdb/rocksdb/src.mk +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
- package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
- package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
- package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
- package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
- package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
- package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
- package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
- package/index.js +12 -4
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
namespace ROCKSDB_NAMESPACE {
|
|
23
23
|
namespace lru_cache {
|
|
24
24
|
|
|
25
|
+
// A distinct pointer value for marking "dummy" cache entries
|
|
26
|
+
void* const kDummyValueMarker = const_cast<char*>("kDummyValueMarker");
|
|
27
|
+
|
|
25
28
|
LRUHandleTable::LRUHandleTable(int max_upper_hash_bits)
|
|
26
29
|
: length_bits_(/* historical starting size*/ 4),
|
|
27
30
|
list_(new LRUHandle* [size_t{1} << length_bits_] {}),
|
|
@@ -35,7 +38,7 @@ LRUHandleTable::~LRUHandleTable() {
|
|
|
35
38
|
h->Free();
|
|
36
39
|
}
|
|
37
40
|
},
|
|
38
|
-
0,
|
|
41
|
+
0, size_t{1} << length_bits_);
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
LRUHandle* LRUHandleTable::Lookup(const Slice& key, uint32_t hash) {
|
|
@@ -110,12 +113,13 @@ void LRUHandleTable::Resize() {
|
|
|
110
113
|
length_bits_ = new_length_bits;
|
|
111
114
|
}
|
|
112
115
|
|
|
113
|
-
LRUCacheShard::LRUCacheShard(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
|
|
117
|
+
double high_pri_pool_ratio,
|
|
118
|
+
double low_pri_pool_ratio, bool use_adaptive_mutex,
|
|
119
|
+
CacheMetadataChargePolicy metadata_charge_policy,
|
|
120
|
+
int max_upper_hash_bits,
|
|
121
|
+
SecondaryCache* secondary_cache)
|
|
122
|
+
: CacheShardBase(metadata_charge_policy),
|
|
119
123
|
capacity_(0),
|
|
120
124
|
high_pri_pool_usage_(0),
|
|
121
125
|
low_pri_pool_usage_(0),
|
|
@@ -162,27 +166,27 @@ void LRUCacheShard::EraseUnRefEntries() {
|
|
|
162
166
|
void LRUCacheShard::ApplyToSomeEntries(
|
|
163
167
|
const std::function<void(const Slice& key, void* value, size_t charge,
|
|
164
168
|
DeleterFn deleter)>& callback,
|
|
165
|
-
|
|
169
|
+
size_t average_entries_per_lock, size_t* state) {
|
|
166
170
|
// The state is essentially going to be the starting hash, which works
|
|
167
171
|
// nicely even if we resize between calls because we use upper-most
|
|
168
172
|
// hash bits for table indexes.
|
|
169
173
|
DMutexLock l(mutex_);
|
|
170
|
-
|
|
171
|
-
|
|
174
|
+
int length_bits = table_.GetLengthBits();
|
|
175
|
+
size_t length = size_t{1} << length_bits;
|
|
172
176
|
|
|
173
177
|
assert(average_entries_per_lock > 0);
|
|
174
178
|
// Assuming we are called with same average_entries_per_lock repeatedly,
|
|
175
179
|
// this simplifies some logic (index_end will not overflow).
|
|
176
180
|
assert(average_entries_per_lock < length || *state == 0);
|
|
177
181
|
|
|
178
|
-
|
|
179
|
-
|
|
182
|
+
size_t index_begin = *state >> (sizeof(size_t) * 8u - length_bits);
|
|
183
|
+
size_t index_end = index_begin + average_entries_per_lock;
|
|
180
184
|
if (index_end >= length) {
|
|
181
185
|
// Going to end
|
|
182
186
|
index_end = length;
|
|
183
|
-
*state =
|
|
187
|
+
*state = SIZE_MAX;
|
|
184
188
|
} else {
|
|
185
|
-
*state = index_end << (
|
|
189
|
+
*state = index_end << (sizeof(size_t) * 8u - length_bits);
|
|
186
190
|
}
|
|
187
191
|
|
|
188
192
|
table_.ApplyToEntriesRange(
|
|
@@ -361,7 +365,7 @@ void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
|
|
|
361
365
|
strict_capacity_limit_ = strict_capacity_limit;
|
|
362
366
|
}
|
|
363
367
|
|
|
364
|
-
Status LRUCacheShard::InsertItem(LRUHandle* e,
|
|
368
|
+
Status LRUCacheShard::InsertItem(LRUHandle* e, LRUHandle** handle,
|
|
365
369
|
bool free_handle_on_fail) {
|
|
366
370
|
Status s = Status::OK();
|
|
367
371
|
autovector<LRUHandle*> last_reference_list;
|
|
@@ -411,7 +415,7 @@ Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
|
|
|
411
415
|
if (!e->HasRefs()) {
|
|
412
416
|
e->Ref();
|
|
413
417
|
}
|
|
414
|
-
*handle =
|
|
418
|
+
*handle = e;
|
|
415
419
|
}
|
|
416
420
|
}
|
|
417
421
|
}
|
|
@@ -425,16 +429,20 @@ void LRUCacheShard::Promote(LRUHandle* e) {
|
|
|
425
429
|
SecondaryCacheResultHandle* secondary_handle = e->sec_handle;
|
|
426
430
|
|
|
427
431
|
assert(secondary_handle->IsReady());
|
|
428
|
-
e
|
|
429
|
-
|
|
432
|
+
// e is not thread-shared here; OK to modify "immutable" fields as well as
|
|
433
|
+
// "mutable" (normally requiring mutex)
|
|
434
|
+
e->SetIsPending(false);
|
|
430
435
|
e->value = secondary_handle->Value();
|
|
431
|
-
e->
|
|
436
|
+
assert(e->total_charge == 0);
|
|
437
|
+
size_t value_size = secondary_handle->Size();
|
|
432
438
|
delete secondary_handle;
|
|
433
439
|
|
|
434
440
|
if (e->value) {
|
|
441
|
+
e->CalcTotalCharge(value_size, metadata_charge_policy_);
|
|
435
442
|
Status s;
|
|
436
|
-
if (
|
|
437
|
-
|
|
443
|
+
if (e->IsStandalone()) {
|
|
444
|
+
assert(secondary_cache_ && secondary_cache_->SupportForceErase());
|
|
445
|
+
|
|
438
446
|
// Insert a dummy handle and return a standalone handle to caller.
|
|
439
447
|
// Charge the standalone handle.
|
|
440
448
|
autovector<LRUHandle*> last_reference_list;
|
|
@@ -464,15 +472,16 @@ void LRUCacheShard::Promote(LRUHandle* e) {
|
|
|
464
472
|
|
|
465
473
|
// Insert a dummy handle into the primary cache. This dummy handle is
|
|
466
474
|
// not IsSecondaryCacheCompatible().
|
|
475
|
+
// FIXME? This should not overwrite an existing non-dummy entry in the
|
|
476
|
+
// rare case that one exists
|
|
467
477
|
Cache::Priority priority =
|
|
468
478
|
e->IsHighPri() ? Cache::Priority::HIGH : Cache::Priority::LOW;
|
|
469
|
-
s = Insert(e->key(), e->hash, /*
|
|
479
|
+
s = Insert(e->key(), e->hash, kDummyValueMarker, /*charge=*/0,
|
|
470
480
|
/*deleter=*/nullptr, /*helper=*/nullptr, /*handle=*/nullptr,
|
|
471
481
|
priority);
|
|
472
482
|
} else {
|
|
473
483
|
e->SetInCache(true);
|
|
474
|
-
e
|
|
475
|
-
Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(e);
|
|
484
|
+
LRUHandle* handle = e;
|
|
476
485
|
// This InsertItem() could fail if the cache is over capacity and
|
|
477
486
|
// strict_capacity_limit_ is true. In such a case, we don't want
|
|
478
487
|
// InsertItem() to free the handle, since the item is already in memory
|
|
@@ -489,23 +498,19 @@ void LRUCacheShard::Promote(LRUHandle* e) {
|
|
|
489
498
|
// When the handle is released, the item should get deleted.
|
|
490
499
|
assert(!e->InCache());
|
|
491
500
|
}
|
|
492
|
-
|
|
493
501
|
} else {
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
e->CalcTotalCharge(0, metadata_charge_policy_);
|
|
499
|
-
e->SetInCache(false);
|
|
500
|
-
e->SetIsStandalone(false);
|
|
502
|
+
// Secondary cache lookup failed. The caller will take care of detecting
|
|
503
|
+
// this and eventually releasing e.
|
|
504
|
+
assert(!e->value);
|
|
505
|
+
assert(!e->InCache());
|
|
501
506
|
}
|
|
502
507
|
}
|
|
503
508
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
+
LRUHandle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash,
|
|
510
|
+
const Cache::CacheItemHelper* helper,
|
|
511
|
+
const Cache::CreateCallback& create_cb,
|
|
512
|
+
Cache::Priority priority, bool wait,
|
|
513
|
+
Statistics* stats) {
|
|
509
514
|
LRUHandle* e = nullptr;
|
|
510
515
|
bool found_dummy_entry{false};
|
|
511
516
|
{
|
|
@@ -513,21 +518,22 @@ Cache::Handle* LRUCacheShard::Lookup(
|
|
|
513
518
|
e = table_.Lookup(key, hash);
|
|
514
519
|
if (e != nullptr) {
|
|
515
520
|
assert(e->InCache());
|
|
516
|
-
if (
|
|
517
|
-
//
|
|
518
|
-
//
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
e->Ref();
|
|
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()) {
|
|
521
|
+
if (e->value == kDummyValueMarker) {
|
|
522
|
+
// For a dummy handle, if it was retrieved from secondary cache,
|
|
523
|
+
// it may still exist in secondary cache.
|
|
524
|
+
// If the handle exists in secondary cache, the value should be
|
|
525
|
+
// erased from sec cache and be inserted into primary cache.
|
|
530
526
|
found_dummy_entry = true;
|
|
527
|
+
// Let the dummy entry be overwritten
|
|
528
|
+
e = nullptr;
|
|
529
|
+
} else {
|
|
530
|
+
if (!e->HasRefs()) {
|
|
531
|
+
// The entry is in LRU since it's in hash and has no external
|
|
532
|
+
// references.
|
|
533
|
+
LRU_Remove(e);
|
|
534
|
+
}
|
|
535
|
+
e->Ref();
|
|
536
|
+
e->SetHit();
|
|
531
537
|
}
|
|
532
538
|
}
|
|
533
539
|
}
|
|
@@ -541,21 +547,13 @@ Cache::Handle* LRUCacheShard::Lookup(
|
|
|
541
547
|
// standalone handle is returned to the caller. Only if the block is hit
|
|
542
548
|
// again, we erase it from CompressedSecondaryCache and add it into the
|
|
543
549
|
// primary cache.
|
|
544
|
-
|
|
545
|
-
// Only support synchronous for now.
|
|
546
|
-
// TODO: Support asynchronous lookup in secondary cache
|
|
547
|
-
if ((!e || found_dummy_entry) && secondary_cache_ && helper &&
|
|
548
|
-
helper->saveto_cb) {
|
|
550
|
+
if (!e && secondary_cache_ && helper && helper->saveto_cb) {
|
|
549
551
|
// For objects from the secondary cache, we expect the caller to provide
|
|
550
552
|
// a way to create/delete the primary cache object. The only case where
|
|
551
553
|
// a deleter would not be required is for dummy entries inserted for
|
|
552
554
|
// accounting purposes, which we won't demote to the secondary cache
|
|
553
555
|
// anyway.
|
|
554
556
|
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
|
-
}
|
|
559
557
|
bool is_in_sec_cache{false};
|
|
560
558
|
std::unique_ptr<SecondaryCacheResultHandle> secondary_handle =
|
|
561
559
|
secondary_cache_->Lookup(key, create_cb, wait, found_dummy_entry,
|
|
@@ -564,7 +562,8 @@ Cache::Handle* LRUCacheShard::Lookup(
|
|
|
564
562
|
e = reinterpret_cast<LRUHandle*>(
|
|
565
563
|
new char[sizeof(LRUHandle) - 1 + key.size()]);
|
|
566
564
|
|
|
567
|
-
e->
|
|
565
|
+
e->m_flags = 0;
|
|
566
|
+
e->im_flags = 0;
|
|
568
567
|
e->SetSecondaryCacheCompatible(true);
|
|
569
568
|
e->info_.helper = helper;
|
|
570
569
|
e->key_length = key.size();
|
|
@@ -578,10 +577,8 @@ Cache::Handle* LRUCacheShard::Lookup(
|
|
|
578
577
|
e->total_charge = 0;
|
|
579
578
|
e->Ref();
|
|
580
579
|
e->SetIsInSecondaryCache(is_in_sec_cache);
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
e->SetIsStandalone(true);
|
|
584
|
-
}
|
|
580
|
+
e->SetIsStandalone(secondary_cache_->SupportForceErase() &&
|
|
581
|
+
!found_dummy_entry);
|
|
585
582
|
|
|
586
583
|
if (wait) {
|
|
587
584
|
Promote(e);
|
|
@@ -599,24 +596,27 @@ Cache::Handle* LRUCacheShard::Lookup(
|
|
|
599
596
|
} else {
|
|
600
597
|
// If wait is false, we always return a handle and let the caller
|
|
601
598
|
// release the handle after checking for success or failure.
|
|
602
|
-
e->
|
|
599
|
+
e->SetIsPending(true);
|
|
603
600
|
// This may be slightly inaccurate, if the lookup eventually fails.
|
|
604
601
|
// But the probability is very low.
|
|
605
602
|
PERF_COUNTER_ADD(secondary_cache_hit_count, 1);
|
|
606
603
|
RecordTick(stats, SECONDARY_CACHE_HITS);
|
|
607
604
|
}
|
|
608
605
|
} else {
|
|
609
|
-
|
|
606
|
+
// Caller will most likely overwrite the dummy entry with an Insert
|
|
607
|
+
// after this Lookup fails
|
|
608
|
+
assert(e == nullptr);
|
|
610
609
|
}
|
|
611
610
|
}
|
|
612
|
-
return
|
|
611
|
+
return e;
|
|
613
612
|
}
|
|
614
613
|
|
|
615
|
-
bool LRUCacheShard::Ref(
|
|
616
|
-
LRUHandle* e = reinterpret_cast<LRUHandle*>(h);
|
|
614
|
+
bool LRUCacheShard::Ref(LRUHandle* e) {
|
|
617
615
|
DMutexLock l(mutex_);
|
|
618
616
|
// To create another reference - entry must be already externally referenced.
|
|
619
617
|
assert(e->HasRefs());
|
|
618
|
+
// Pending handles are not for sharing
|
|
619
|
+
assert(!e->IsPending());
|
|
620
620
|
e->Ref();
|
|
621
621
|
return true;
|
|
622
622
|
}
|
|
@@ -635,12 +635,15 @@ void LRUCacheShard::SetLowPriorityPoolRatio(double low_pri_pool_ratio) {
|
|
|
635
635
|
MaintainPoolSize();
|
|
636
636
|
}
|
|
637
637
|
|
|
638
|
-
bool LRUCacheShard::Release(
|
|
639
|
-
|
|
638
|
+
bool LRUCacheShard::Release(LRUHandle* e, bool /*useful*/,
|
|
639
|
+
bool erase_if_last_ref) {
|
|
640
|
+
if (e == nullptr) {
|
|
640
641
|
return false;
|
|
641
642
|
}
|
|
642
|
-
LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
|
|
643
643
|
bool last_reference = false;
|
|
644
|
+
// Must Wait or WaitAll first on pending handles. Otherwise, would leak
|
|
645
|
+
// a secondary cache handle.
|
|
646
|
+
assert(!e->IsPending());
|
|
644
647
|
{
|
|
645
648
|
DMutexLock l(mutex_);
|
|
646
649
|
last_reference = e->Unref();
|
|
@@ -658,12 +661,8 @@ bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
|
|
|
658
661
|
last_reference = false;
|
|
659
662
|
}
|
|
660
663
|
}
|
|
661
|
-
// If it was the last reference,
|
|
662
|
-
|
|
663
|
-
// cache compatible and has a non-null value, then decrement the cache
|
|
664
|
-
// usage. If value is null in the latter case, that means the lookup
|
|
665
|
-
// failed and we didn't charge the cache.
|
|
666
|
-
if (last_reference && (!e->IsSecondaryCacheCompatible() || e->value)) {
|
|
664
|
+
// If it was the last reference, then decrement the cache usage.
|
|
665
|
+
if (last_reference) {
|
|
667
666
|
assert(usage_ >= e->total_charge);
|
|
668
667
|
usage_ -= e->total_charge;
|
|
669
668
|
}
|
|
@@ -680,7 +679,7 @@ Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
|
|
|
680
679
|
size_t charge,
|
|
681
680
|
void (*deleter)(const Slice& key, void* value),
|
|
682
681
|
const Cache::CacheItemHelper* helper,
|
|
683
|
-
|
|
682
|
+
LRUHandle** handle, Cache::Priority priority) {
|
|
684
683
|
// Allocate the memory here outside of the mutex.
|
|
685
684
|
// If the cache is full, we'll have to release it.
|
|
686
685
|
// It shouldn't happen very often though.
|
|
@@ -688,14 +687,17 @@ Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
|
|
|
688
687
|
new char[sizeof(LRUHandle) - 1 + key.size()]);
|
|
689
688
|
|
|
690
689
|
e->value = value;
|
|
691
|
-
e->
|
|
690
|
+
e->m_flags = 0;
|
|
691
|
+
e->im_flags = 0;
|
|
692
692
|
if (helper) {
|
|
693
|
+
// Use only one of the two parameters
|
|
694
|
+
assert(deleter == nullptr);
|
|
695
|
+
// value == nullptr is reserved for indicating failure for when secondary
|
|
696
|
+
// cache compatible
|
|
697
|
+
assert(value != nullptr);
|
|
693
698
|
e->SetSecondaryCacheCompatible(true);
|
|
694
699
|
e->info_.helper = helper;
|
|
695
700
|
} else {
|
|
696
|
-
#ifdef __SANITIZE_THREAD__
|
|
697
|
-
e->is_secondary_cache_compatible_for_tsan = false;
|
|
698
|
-
#endif // __SANITIZE_THREAD__
|
|
699
701
|
e->info_.deleter = deleter;
|
|
700
702
|
}
|
|
701
703
|
e->key_length = key.size();
|
|
@@ -736,9 +738,7 @@ void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {
|
|
|
736
738
|
}
|
|
737
739
|
}
|
|
738
740
|
|
|
739
|
-
bool LRUCacheShard::IsReady(
|
|
740
|
-
LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
|
|
741
|
-
DMutexLock l(mutex_);
|
|
741
|
+
bool LRUCacheShard::IsReady(LRUHandle* e) {
|
|
742
742
|
bool ready = true;
|
|
743
743
|
if (e->IsPending()) {
|
|
744
744
|
assert(secondary_cache_);
|
|
@@ -769,7 +769,7 @@ size_t LRUCacheShard::GetTableAddressCount() const {
|
|
|
769
769
|
return size_t{1} << table_.GetLengthBits();
|
|
770
770
|
}
|
|
771
771
|
|
|
772
|
-
std::string
|
|
772
|
+
void LRUCacheShard::AppendPrintableOptions(std::string& str) const {
|
|
773
773
|
const int kBufferSize = 200;
|
|
774
774
|
char buffer[kBufferSize];
|
|
775
775
|
{
|
|
@@ -779,7 +779,7 @@ std::string LRUCacheShard::GetPrintableOptions() const {
|
|
|
779
779
|
snprintf(buffer + strlen(buffer), kBufferSize - strlen(buffer),
|
|
780
780
|
" low_pri_pool_ratio: %.3lf\n", low_pri_pool_ratio_);
|
|
781
781
|
}
|
|
782
|
-
|
|
782
|
+
str.append(buffer);
|
|
783
783
|
}
|
|
784
784
|
|
|
785
785
|
LRUCache::LRUCache(size_t capacity, int num_shard_bits,
|
|
@@ -788,51 +788,30 @@ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
|
|
|
788
788
|
std::shared_ptr<MemoryAllocator> allocator,
|
|
789
789
|
bool use_adaptive_mutex,
|
|
790
790
|
CacheMetadataChargePolicy metadata_charge_policy,
|
|
791
|
-
|
|
791
|
+
std::shared_ptr<SecondaryCache> _secondary_cache)
|
|
792
792
|
: ShardedCache(capacity, num_shard_bits, strict_capacity_limit,
|
|
793
|
-
std::move(allocator))
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
new (&shards_[i]) LRUCacheShard(
|
|
793
|
+
std::move(allocator)),
|
|
794
|
+
secondary_cache_(std::move(_secondary_cache)) {
|
|
795
|
+
size_t per_shard = GetPerShardCapacity();
|
|
796
|
+
SecondaryCache* secondary_cache = secondary_cache_.get();
|
|
797
|
+
InitShards([=](LRUCacheShard* cs) {
|
|
798
|
+
new (cs) LRUCacheShard(
|
|
800
799
|
per_shard, strict_capacity_limit, high_pri_pool_ratio,
|
|
801
800
|
low_pri_pool_ratio, use_adaptive_mutex, metadata_charge_policy,
|
|
802
801
|
/* max_upper_hash_bits */ 32 - num_shard_bits, secondary_cache);
|
|
803
|
-
}
|
|
804
|
-
secondary_cache_ = secondary_cache;
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
LRUCache::~LRUCache() {
|
|
808
|
-
if (shards_ != nullptr) {
|
|
809
|
-
assert(num_shards_ > 0);
|
|
810
|
-
for (int i = 0; i < num_shards_; i++) {
|
|
811
|
-
shards_[i].~LRUCacheShard();
|
|
812
|
-
}
|
|
813
|
-
port::cacheline_aligned_free(shards_);
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
CacheShard* LRUCache::GetShard(uint32_t shard) {
|
|
818
|
-
return reinterpret_cast<CacheShard*>(&shards_[shard]);
|
|
819
|
-
}
|
|
820
|
-
|
|
821
|
-
const CacheShard* LRUCache::GetShard(uint32_t shard) const {
|
|
822
|
-
return reinterpret_cast<CacheShard*>(&shards_[shard]);
|
|
802
|
+
});
|
|
823
803
|
}
|
|
824
804
|
|
|
825
805
|
void* LRUCache::Value(Handle* handle) {
|
|
826
|
-
|
|
806
|
+
auto h = reinterpret_cast<const LRUHandle*>(handle);
|
|
807
|
+
assert(!h->IsPending() || h->value == nullptr);
|
|
808
|
+
assert(h->value != kDummyValueMarker);
|
|
809
|
+
return h->value;
|
|
827
810
|
}
|
|
828
811
|
|
|
829
812
|
size_t LRUCache::GetCharge(Handle* handle) const {
|
|
830
|
-
CacheMetadataChargePolicy metadata_charge_policy = kDontChargeCacheMetadata;
|
|
831
|
-
if (num_shards_ > 0) {
|
|
832
|
-
metadata_charge_policy = shards_[0].metadata_charge_policy_;
|
|
833
|
-
}
|
|
834
813
|
return reinterpret_cast<const LRUHandle*>(handle)->GetCharge(
|
|
835
|
-
|
|
814
|
+
GetShard(0).metadata_charge_policy_);
|
|
836
815
|
}
|
|
837
816
|
|
|
838
817
|
Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
|
|
@@ -844,32 +823,12 @@ Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
|
|
|
844
823
|
}
|
|
845
824
|
}
|
|
846
825
|
|
|
847
|
-
uint32_t LRUCache::GetHash(Handle* handle) const {
|
|
848
|
-
return reinterpret_cast<const LRUHandle*>(handle)->hash;
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
void LRUCache::DisownData() {
|
|
852
|
-
// Leak data only if that won't generate an ASAN/valgrind warning.
|
|
853
|
-
if (!kMustFreeHeapAllocations) {
|
|
854
|
-
shards_ = nullptr;
|
|
855
|
-
num_shards_ = 0;
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
|
|
859
826
|
size_t LRUCache::TEST_GetLRUSize() {
|
|
860
|
-
|
|
861
|
-
for (int i = 0; i < num_shards_; i++) {
|
|
862
|
-
lru_size_of_all_shards += shards_[i].TEST_GetLRUSize();
|
|
863
|
-
}
|
|
864
|
-
return lru_size_of_all_shards;
|
|
827
|
+
return SumOverShards([](LRUCacheShard& cs) { return cs.TEST_GetLRUSize(); });
|
|
865
828
|
}
|
|
866
829
|
|
|
867
830
|
double LRUCache::GetHighPriPoolRatio() {
|
|
868
|
-
|
|
869
|
-
if (num_shards_ > 0) {
|
|
870
|
-
result = shards_[0].GetHighPriPoolRatio();
|
|
871
|
-
}
|
|
872
|
-
return result;
|
|
831
|
+
return GetShard(0).GetHighPriPoolRatio();
|
|
873
832
|
}
|
|
874
833
|
|
|
875
834
|
void LRUCache::WaitAll(std::vector<Handle*>& handles) {
|
|
@@ -895,22 +854,17 @@ void LRUCache::WaitAll(std::vector<Handle*>& handles) {
|
|
|
895
854
|
if (!lru_handle->IsPending()) {
|
|
896
855
|
continue;
|
|
897
856
|
}
|
|
898
|
-
|
|
899
|
-
LRUCacheShard* shard = static_cast<LRUCacheShard*>(GetShard(Shard(hash)));
|
|
900
|
-
shard->Promote(lru_handle);
|
|
857
|
+
GetShard(lru_handle->hash).Promote(lru_handle);
|
|
901
858
|
}
|
|
902
859
|
}
|
|
903
860
|
}
|
|
904
861
|
|
|
905
|
-
std::string
|
|
906
|
-
|
|
907
|
-
ret.reserve(20000);
|
|
908
|
-
ret.append(ShardedCache::GetPrintableOptions());
|
|
862
|
+
void LRUCache::AppendPrintableOptions(std::string& str) const {
|
|
863
|
+
ShardedCache::AppendPrintableOptions(str); // options from shard
|
|
909
864
|
if (secondary_cache_) {
|
|
910
|
-
|
|
911
|
-
|
|
865
|
+
str.append(" secondary_cache:\n");
|
|
866
|
+
str.append(secondary_cache_->GetPrintableOptions());
|
|
912
867
|
}
|
|
913
|
-
return ret;
|
|
914
868
|
}
|
|
915
869
|
|
|
916
870
|
} // namespace lru_cache
|