@nxtedition/rocksdb 8.1.4 → 8.1.6
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 +21 -0
- package/deps/rocksdb/rocksdb/Makefile +15 -3
- package/deps/rocksdb/rocksdb/TARGETS +6 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
- package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +15 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
- package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
- package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
- package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
- package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
- package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
- package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +6 -3
- package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compression.h +11 -2
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
- package/package.json +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
#include <cstring>
|
|
14
14
|
#include <memory>
|
|
15
15
|
|
|
16
|
-
#include "cache/cache_entry_roles.h"
|
|
17
16
|
#include "rocksdb/cache.h"
|
|
18
17
|
#include "rocksdb/slice.h"
|
|
19
18
|
#include "rocksdb/status.h"
|
|
@@ -41,17 +40,17 @@ CacheReservationManagerImpl<
|
|
|
41
40
|
template <CacheEntryRole R>
|
|
42
41
|
CacheReservationManagerImpl<R>::CacheReservationManagerImpl(
|
|
43
42
|
std::shared_ptr<Cache> cache, bool delayed_decrease)
|
|
44
|
-
:
|
|
43
|
+
: cache_(cache),
|
|
44
|
+
delayed_decrease_(delayed_decrease),
|
|
45
45
|
cache_allocated_size_(0),
|
|
46
46
|
memory_used_(0) {
|
|
47
47
|
assert(cache != nullptr);
|
|
48
|
-
cache_ = cache;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
template <CacheEntryRole R>
|
|
52
51
|
CacheReservationManagerImpl<R>::~CacheReservationManagerImpl() {
|
|
53
52
|
for (auto* handle : dummy_handles_) {
|
|
54
|
-
cache_
|
|
53
|
+
cache_.ReleaseAndEraseIfLastRef(handle);
|
|
55
54
|
}
|
|
56
55
|
}
|
|
57
56
|
|
|
@@ -115,8 +114,7 @@ Status CacheReservationManagerImpl<R>::IncreaseCacheReservation(
|
|
|
115
114
|
Status return_status = Status::OK();
|
|
116
115
|
while (new_mem_used > cache_allocated_size_.load(std::memory_order_relaxed)) {
|
|
117
116
|
Cache::Handle* handle = nullptr;
|
|
118
|
-
return_status = cache_
|
|
119
|
-
GetNoopDeleterForRole<R>(), &handle);
|
|
117
|
+
return_status = cache_.Insert(GetNextCacheKey(), kSizeDummyEntry, &handle);
|
|
120
118
|
|
|
121
119
|
if (return_status != Status::OK()) {
|
|
122
120
|
return return_status;
|
|
@@ -141,7 +139,7 @@ Status CacheReservationManagerImpl<R>::DecreaseCacheReservation(
|
|
|
141
139
|
cache_allocated_size_.load(std::memory_order_relaxed)) {
|
|
142
140
|
assert(!dummy_handles_.empty());
|
|
143
141
|
auto* handle = dummy_handles_.back();
|
|
144
|
-
cache_
|
|
142
|
+
cache_.ReleaseAndEraseIfLastRef(handle);
|
|
145
143
|
dummy_handles_.pop_back();
|
|
146
144
|
cache_allocated_size_ -= kSizeDummyEntry;
|
|
147
145
|
}
|
|
@@ -169,8 +167,9 @@ Slice CacheReservationManagerImpl<R>::GetNextCacheKey() {
|
|
|
169
167
|
}
|
|
170
168
|
|
|
171
169
|
template <CacheEntryRole R>
|
|
172
|
-
Cache::
|
|
173
|
-
|
|
170
|
+
const Cache::CacheItemHelper*
|
|
171
|
+
CacheReservationManagerImpl<R>::TEST_GetCacheItemHelperForRole() {
|
|
172
|
+
return &CacheInterface::kHelper;
|
|
174
173
|
}
|
|
175
174
|
|
|
176
175
|
template class CacheReservationManagerImpl<
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
#include "cache/cache_entry_roles.h"
|
|
20
20
|
#include "cache/cache_key.h"
|
|
21
|
-
#include "
|
|
21
|
+
#include "cache/typed_cache.h"
|
|
22
22
|
#include "rocksdb/slice.h"
|
|
23
23
|
#include "rocksdb/status.h"
|
|
24
24
|
#include "util/coding.h"
|
|
@@ -197,10 +197,10 @@ class CacheReservationManagerImpl
|
|
|
197
197
|
|
|
198
198
|
static constexpr std::size_t GetDummyEntrySize() { return kSizeDummyEntry; }
|
|
199
199
|
|
|
200
|
-
// For testing only - it is to help ensure the
|
|
200
|
+
// For testing only - it is to help ensure the CacheItemHelperForRole<R>
|
|
201
201
|
// accessed from CacheReservationManagerImpl and the one accessed from the
|
|
202
202
|
// test are from the same translation units
|
|
203
|
-
static Cache::
|
|
203
|
+
static const Cache::CacheItemHelper *TEST_GetCacheItemHelperForRole();
|
|
204
204
|
|
|
205
205
|
private:
|
|
206
206
|
static constexpr std::size_t kSizeDummyEntry = 256 * 1024;
|
|
@@ -211,7 +211,8 @@ class CacheReservationManagerImpl
|
|
|
211
211
|
Status IncreaseCacheReservation(std::size_t new_mem_used);
|
|
212
212
|
Status DecreaseCacheReservation(std::size_t new_mem_used);
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
using CacheInterface = PlaceholderSharedCacheInterface<R>;
|
|
215
|
+
CacheInterface cache_;
|
|
215
216
|
bool delayed_decrease_;
|
|
216
217
|
std::atomic<std::size_t> cache_allocated_size_;
|
|
217
218
|
std::size_t memory_used_;
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
#include <vector>
|
|
17
17
|
|
|
18
18
|
#include "cache/lru_cache.h"
|
|
19
|
+
#include "cache/typed_cache.h"
|
|
19
20
|
#include "port/stack_trace.h"
|
|
20
21
|
#include "test_util/testharness.h"
|
|
21
22
|
#include "util/coding.h"
|
|
@@ -55,23 +56,31 @@ int DecodeKey32Bits(const Slice& k) {
|
|
|
55
56
|
return DecodeFixed32(k.data());
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
|
|
59
|
+
Cache::ObjectPtr EncodeValue(uintptr_t v) {
|
|
60
|
+
return reinterpret_cast<Cache::ObjectPtr>(v);
|
|
61
|
+
}
|
|
59
62
|
|
|
60
63
|
int DecodeValue(void* v) {
|
|
61
64
|
return static_cast<int>(reinterpret_cast<uintptr_t>(v));
|
|
62
65
|
}
|
|
63
66
|
|
|
64
|
-
|
|
67
|
+
const Cache::CacheItemHelper kDumbHelper{
|
|
68
|
+
CacheEntryRole::kMisc,
|
|
69
|
+
[](Cache::ObjectPtr /*value*/, MemoryAllocator* /*alloc*/) {}};
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
const Cache::CacheItemHelper kEraseOnDeleteHelper1{
|
|
72
|
+
CacheEntryRole::kMisc,
|
|
73
|
+
[](Cache::ObjectPtr value, MemoryAllocator* /*alloc*/) {
|
|
74
|
+
Cache* cache = static_cast<Cache*>(value);
|
|
75
|
+
cache->Erase("foo");
|
|
76
|
+
}};
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
const Cache::CacheItemHelper kEraseOnDeleteHelper2{
|
|
79
|
+
CacheEntryRole::kMisc,
|
|
80
|
+
[](Cache::ObjectPtr value, MemoryAllocator* /*alloc*/) {
|
|
81
|
+
Cache* cache = static_cast<Cache*>(value);
|
|
82
|
+
cache->Erase(EncodeKey16Bytes(1234));
|
|
83
|
+
}};
|
|
75
84
|
|
|
76
85
|
const std::string kLRU = "lru";
|
|
77
86
|
const std::string kHyperClock = "hyper_clock";
|
|
@@ -83,14 +92,11 @@ class CacheTest : public testing::TestWithParam<std::string> {
|
|
|
83
92
|
static CacheTest* current_;
|
|
84
93
|
static std::string type_;
|
|
85
94
|
|
|
86
|
-
static void Deleter(
|
|
87
|
-
if (type_ == kHyperClock) {
|
|
88
|
-
current_->deleted_keys_.push_back(DecodeKey16Bytes(key));
|
|
89
|
-
} else {
|
|
90
|
-
current_->deleted_keys_.push_back(DecodeKey32Bits(key));
|
|
91
|
-
}
|
|
95
|
+
static void Deleter(Cache::ObjectPtr v, MemoryAllocator*) {
|
|
92
96
|
current_->deleted_values_.push_back(DecodeValue(v));
|
|
93
97
|
}
|
|
98
|
+
static constexpr Cache::CacheItemHelper kHelper{CacheEntryRole::kMisc,
|
|
99
|
+
&Deleter};
|
|
94
100
|
|
|
95
101
|
static const int kCacheSize = 1000;
|
|
96
102
|
static const int kNumShardBits = 4;
|
|
@@ -98,7 +104,6 @@ class CacheTest : public testing::TestWithParam<std::string> {
|
|
|
98
104
|
static const int kCacheSize2 = 100;
|
|
99
105
|
static const int kNumShardBits2 = 2;
|
|
100
106
|
|
|
101
|
-
std::vector<int> deleted_keys_;
|
|
102
107
|
std::vector<int> deleted_values_;
|
|
103
108
|
std::shared_ptr<Cache> cache_;
|
|
104
109
|
std::shared_ptr<Cache> cache2_;
|
|
@@ -182,8 +187,8 @@ class CacheTest : public testing::TestWithParam<std::string> {
|
|
|
182
187
|
|
|
183
188
|
void Insert(std::shared_ptr<Cache> cache, int key, int value,
|
|
184
189
|
int charge = 1) {
|
|
185
|
-
EXPECT_OK(
|
|
186
|
-
|
|
190
|
+
EXPECT_OK(
|
|
191
|
+
cache->Insert(EncodeKey(key), EncodeValue(value), &kHelper, charge));
|
|
187
192
|
}
|
|
188
193
|
|
|
189
194
|
void Erase(std::shared_ptr<Cache> cache, int key) {
|
|
@@ -236,10 +241,8 @@ TEST_P(CacheTest, UsageTest) {
|
|
|
236
241
|
key = EncodeKey(i);
|
|
237
242
|
}
|
|
238
243
|
auto kv_size = key.size() + 5;
|
|
239
|
-
ASSERT_OK(cache->Insert(key,
|
|
240
|
-
|
|
241
|
-
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
242
|
-
kv_size, DumbDeleter));
|
|
244
|
+
ASSERT_OK(cache->Insert(key, value, &kDumbHelper, kv_size));
|
|
245
|
+
ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, kv_size));
|
|
243
246
|
usage += kv_size;
|
|
244
247
|
ASSERT_EQ(usage, cache->GetUsage());
|
|
245
248
|
if (type == kHyperClock) {
|
|
@@ -262,10 +265,8 @@ TEST_P(CacheTest, UsageTest) {
|
|
|
262
265
|
} else {
|
|
263
266
|
key = EncodeKey(static_cast<int>(1000 + i));
|
|
264
267
|
}
|
|
265
|
-
ASSERT_OK(cache->Insert(key,
|
|
266
|
-
|
|
267
|
-
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
268
|
-
key.size() + 5, DumbDeleter));
|
|
268
|
+
ASSERT_OK(cache->Insert(key, value, &kDumbHelper, key.size() + 5));
|
|
269
|
+
ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, key.size() + 5));
|
|
269
270
|
}
|
|
270
271
|
|
|
271
272
|
// the usage should be close to the capacity
|
|
@@ -320,11 +321,9 @@ TEST_P(CacheTest, PinnedUsageTest) {
|
|
|
320
321
|
auto kv_size = key.size() + 5;
|
|
321
322
|
Cache::Handle* handle;
|
|
322
323
|
Cache::Handle* handle_in_precise_cache;
|
|
323
|
-
ASSERT_OK(cache->Insert(key,
|
|
324
|
-
DumbDeleter, &handle));
|
|
324
|
+
ASSERT_OK(cache->Insert(key, value, &kDumbHelper, kv_size, &handle));
|
|
325
325
|
assert(handle);
|
|
326
|
-
ASSERT_OK(precise_cache->Insert(key,
|
|
327
|
-
kv_size, DumbDeleter,
|
|
326
|
+
ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, kv_size,
|
|
328
327
|
&handle_in_precise_cache));
|
|
329
328
|
assert(handle_in_precise_cache);
|
|
330
329
|
pinned_usage += kv_size;
|
|
@@ -365,10 +364,8 @@ TEST_P(CacheTest, PinnedUsageTest) {
|
|
|
365
364
|
} else {
|
|
366
365
|
key = EncodeKey(static_cast<int>(1000 + i));
|
|
367
366
|
}
|
|
368
|
-
ASSERT_OK(cache->Insert(key,
|
|
369
|
-
|
|
370
|
-
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
371
|
-
key.size() + 5, DumbDeleter));
|
|
367
|
+
ASSERT_OK(cache->Insert(key, value, &kDumbHelper, key.size() + 5));
|
|
368
|
+
ASSERT_OK(precise_cache->Insert(key, value, &kDumbHelper, key.size() + 5));
|
|
372
369
|
}
|
|
373
370
|
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
|
|
374
371
|
ASSERT_EQ(precise_cache_pinned_usage, precise_cache->GetPinnedUsage());
|
|
@@ -416,8 +413,7 @@ TEST_P(CacheTest, HitAndMiss) {
|
|
|
416
413
|
ASSERT_EQ(201, Lookup(200));
|
|
417
414
|
ASSERT_EQ(-1, Lookup(300));
|
|
418
415
|
|
|
419
|
-
ASSERT_EQ(1U,
|
|
420
|
-
ASSERT_EQ(100, deleted_keys_[0]);
|
|
416
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
421
417
|
if (GetParam() == kHyperClock) {
|
|
422
418
|
ASSERT_EQ(102, deleted_values_[0]);
|
|
423
419
|
} else {
|
|
@@ -438,21 +434,20 @@ TEST_P(CacheTest, InsertSameKey) {
|
|
|
438
434
|
|
|
439
435
|
TEST_P(CacheTest, Erase) {
|
|
440
436
|
Erase(200);
|
|
441
|
-
ASSERT_EQ(0U,
|
|
437
|
+
ASSERT_EQ(0U, deleted_values_.size());
|
|
442
438
|
|
|
443
439
|
Insert(100, 101);
|
|
444
440
|
Insert(200, 201);
|
|
445
441
|
Erase(100);
|
|
446
442
|
ASSERT_EQ(-1, Lookup(100));
|
|
447
443
|
ASSERT_EQ(201, Lookup(200));
|
|
448
|
-
ASSERT_EQ(1U,
|
|
449
|
-
ASSERT_EQ(100, deleted_keys_[0]);
|
|
444
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
450
445
|
ASSERT_EQ(101, deleted_values_[0]);
|
|
451
446
|
|
|
452
447
|
Erase(100);
|
|
453
448
|
ASSERT_EQ(-1, Lookup(100));
|
|
454
449
|
ASSERT_EQ(201, Lookup(200));
|
|
455
|
-
ASSERT_EQ(1U,
|
|
450
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
456
451
|
}
|
|
457
452
|
|
|
458
453
|
TEST_P(CacheTest, EntriesArePinned) {
|
|
@@ -469,23 +464,21 @@ TEST_P(CacheTest, EntriesArePinned) {
|
|
|
469
464
|
Insert(100, 102);
|
|
470
465
|
Cache::Handle* h2 = cache_->Lookup(EncodeKey(100));
|
|
471
466
|
ASSERT_EQ(102, DecodeValue(cache_->Value(h2)));
|
|
472
|
-
ASSERT_EQ(0U,
|
|
467
|
+
ASSERT_EQ(0U, deleted_values_.size());
|
|
473
468
|
ASSERT_EQ(2U, cache_->GetUsage());
|
|
474
469
|
|
|
475
470
|
cache_->Release(h1);
|
|
476
|
-
ASSERT_EQ(1U,
|
|
477
|
-
ASSERT_EQ(100, deleted_keys_[0]);
|
|
471
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
478
472
|
ASSERT_EQ(101, deleted_values_[0]);
|
|
479
473
|
ASSERT_EQ(1U, cache_->GetUsage());
|
|
480
474
|
|
|
481
475
|
Erase(100);
|
|
482
476
|
ASSERT_EQ(-1, Lookup(100));
|
|
483
|
-
ASSERT_EQ(1U,
|
|
477
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
484
478
|
ASSERT_EQ(1U, cache_->GetUsage());
|
|
485
479
|
|
|
486
480
|
cache_->Release(h2);
|
|
487
|
-
ASSERT_EQ(2U,
|
|
488
|
-
ASSERT_EQ(100, deleted_keys_[1]);
|
|
481
|
+
ASSERT_EQ(2U, deleted_values_.size());
|
|
489
482
|
ASSERT_EQ(102, deleted_values_[1]);
|
|
490
483
|
ASSERT_EQ(0U, cache_->GetUsage());
|
|
491
484
|
}
|
|
@@ -588,9 +581,9 @@ TEST_P(CacheTest, EvictEmptyCache) {
|
|
|
588
581
|
// Insert item large than capacity to trigger eviction on empty cache.
|
|
589
582
|
auto cache = NewCache(1, 0, false);
|
|
590
583
|
if (type == kLRU) {
|
|
591
|
-
ASSERT_OK(cache->Insert("foo", nullptr,
|
|
584
|
+
ASSERT_OK(cache->Insert("foo", nullptr, &kDumbHelper, 10));
|
|
592
585
|
} else {
|
|
593
|
-
ASSERT_OK(cache->Insert(EncodeKey(1000), nullptr,
|
|
586
|
+
ASSERT_OK(cache->Insert(EncodeKey(1000), nullptr, &kDumbHelper, 10));
|
|
594
587
|
}
|
|
595
588
|
}
|
|
596
589
|
|
|
@@ -601,19 +594,19 @@ TEST_P(CacheTest, EraseFromDeleter) {
|
|
|
601
594
|
// the cache at that point.
|
|
602
595
|
std::shared_ptr<Cache> cache = NewCache(10, 0, false);
|
|
603
596
|
std::string foo, bar;
|
|
604
|
-
Cache::
|
|
597
|
+
const Cache::CacheItemHelper* erase_helper;
|
|
605
598
|
if (type == kLRU) {
|
|
606
599
|
foo = "foo";
|
|
607
600
|
bar = "bar";
|
|
608
|
-
|
|
601
|
+
erase_helper = &kEraseOnDeleteHelper1;
|
|
609
602
|
} else {
|
|
610
603
|
foo = EncodeKey(1234);
|
|
611
604
|
bar = EncodeKey(5678);
|
|
612
|
-
|
|
605
|
+
erase_helper = &kEraseOnDeleteHelper2;
|
|
613
606
|
}
|
|
614
607
|
|
|
615
|
-
ASSERT_OK(cache->Insert(foo, nullptr,
|
|
616
|
-
ASSERT_OK(cache->Insert(bar, cache.get(),
|
|
608
|
+
ASSERT_OK(cache->Insert(foo, nullptr, &kDumbHelper, 1));
|
|
609
|
+
ASSERT_OK(cache->Insert(bar, cache.get(), erase_helper, 1));
|
|
617
610
|
|
|
618
611
|
cache->Erase(bar);
|
|
619
612
|
ASSERT_EQ(nullptr, cache->Lookup(foo));
|
|
@@ -675,50 +668,51 @@ TEST_P(CacheTest, NewId) {
|
|
|
675
668
|
ASSERT_NE(a, b);
|
|
676
669
|
}
|
|
677
670
|
|
|
678
|
-
class Value {
|
|
679
|
-
public:
|
|
680
|
-
explicit Value(int v) : v_(v) {}
|
|
681
|
-
|
|
682
|
-
int v_;
|
|
683
|
-
};
|
|
684
|
-
|
|
685
|
-
namespace {
|
|
686
|
-
void deleter(const Slice& /*key*/, void* value) {
|
|
687
|
-
delete static_cast<Value*>(value);
|
|
688
|
-
}
|
|
689
|
-
} // namespace
|
|
690
|
-
|
|
691
671
|
TEST_P(CacheTest, ReleaseAndErase) {
|
|
692
672
|
std::shared_ptr<Cache> cache = NewCache(5, 0, false);
|
|
693
673
|
Cache::Handle* handle;
|
|
694
|
-
Status s =
|
|
695
|
-
|
|
674
|
+
Status s =
|
|
675
|
+
cache->Insert(EncodeKey(100), EncodeValue(100), &kHelper, 1, &handle);
|
|
696
676
|
ASSERT_TRUE(s.ok());
|
|
697
677
|
ASSERT_EQ(5U, cache->GetCapacity());
|
|
698
678
|
ASSERT_EQ(1U, cache->GetUsage());
|
|
699
|
-
ASSERT_EQ(0U,
|
|
679
|
+
ASSERT_EQ(0U, deleted_values_.size());
|
|
700
680
|
auto erased = cache->Release(handle, true);
|
|
701
681
|
ASSERT_TRUE(erased);
|
|
702
682
|
// This tests that deleter has been called
|
|
703
|
-
ASSERT_EQ(1U,
|
|
683
|
+
ASSERT_EQ(1U, deleted_values_.size());
|
|
704
684
|
}
|
|
705
685
|
|
|
706
686
|
TEST_P(CacheTest, ReleaseWithoutErase) {
|
|
707
687
|
std::shared_ptr<Cache> cache = NewCache(5, 0, false);
|
|
708
688
|
Cache::Handle* handle;
|
|
709
|
-
Status s =
|
|
710
|
-
|
|
689
|
+
Status s =
|
|
690
|
+
cache->Insert(EncodeKey(100), EncodeValue(100), &kHelper, 1, &handle);
|
|
711
691
|
ASSERT_TRUE(s.ok());
|
|
712
692
|
ASSERT_EQ(5U, cache->GetCapacity());
|
|
713
693
|
ASSERT_EQ(1U, cache->GetUsage());
|
|
714
|
-
ASSERT_EQ(0U,
|
|
694
|
+
ASSERT_EQ(0U, deleted_values_.size());
|
|
715
695
|
auto erased = cache->Release(handle);
|
|
716
696
|
ASSERT_FALSE(erased);
|
|
717
697
|
// This tests that deleter is not called. When cache has free capacity it is
|
|
718
698
|
// not expected to immediately erase the released items.
|
|
719
|
-
ASSERT_EQ(0U,
|
|
699
|
+
ASSERT_EQ(0U, deleted_values_.size());
|
|
720
700
|
}
|
|
721
701
|
|
|
702
|
+
namespace {
|
|
703
|
+
class Value {
|
|
704
|
+
public:
|
|
705
|
+
explicit Value(int v) : v_(v) {}
|
|
706
|
+
|
|
707
|
+
int v_;
|
|
708
|
+
|
|
709
|
+
static constexpr auto kCacheEntryRole = CacheEntryRole::kMisc;
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
using SharedCache = BasicTypedSharedCacheInterface<Value>;
|
|
713
|
+
using TypedHandle = SharedCache::TypedHandle;
|
|
714
|
+
} // namespace
|
|
715
|
+
|
|
722
716
|
TEST_P(CacheTest, SetCapacity) {
|
|
723
717
|
auto type = GetParam();
|
|
724
718
|
if (type == kHyperClock) {
|
|
@@ -731,19 +725,19 @@ TEST_P(CacheTest, SetCapacity) {
|
|
|
731
725
|
// lets create a cache with capacity 5,
|
|
732
726
|
// then, insert 5 elements, then increase capacity
|
|
733
727
|
// to 10, returned capacity should be 10, usage=5
|
|
734
|
-
|
|
735
|
-
std::vector<
|
|
728
|
+
SharedCache cache{NewCache(5, 0, false)};
|
|
729
|
+
std::vector<TypedHandle*> handles(10);
|
|
736
730
|
// Insert 5 entries, but not releasing.
|
|
737
731
|
for (int i = 0; i < 5; i++) {
|
|
738
732
|
std::string key = EncodeKey(i + 1);
|
|
739
|
-
Status s = cache
|
|
733
|
+
Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
|
|
740
734
|
ASSERT_TRUE(s.ok());
|
|
741
735
|
}
|
|
742
|
-
ASSERT_EQ(5U, cache->GetCapacity());
|
|
743
|
-
ASSERT_EQ(5U, cache->GetUsage());
|
|
744
|
-
cache->SetCapacity(10);
|
|
745
|
-
ASSERT_EQ(10U, cache->GetCapacity());
|
|
746
|
-
ASSERT_EQ(5U, cache->GetUsage());
|
|
736
|
+
ASSERT_EQ(5U, cache.get()->GetCapacity());
|
|
737
|
+
ASSERT_EQ(5U, cache.get()->GetUsage());
|
|
738
|
+
cache.get()->SetCapacity(10);
|
|
739
|
+
ASSERT_EQ(10U, cache.get()->GetCapacity());
|
|
740
|
+
ASSERT_EQ(5U, cache.get()->GetUsage());
|
|
747
741
|
|
|
748
742
|
// test2: decrease capacity
|
|
749
743
|
// insert 5 more elements to cache, then release 5,
|
|
@@ -751,77 +745,77 @@ TEST_P(CacheTest, SetCapacity) {
|
|
|
751
745
|
// and usage should be 7
|
|
752
746
|
for (int i = 5; i < 10; i++) {
|
|
753
747
|
std::string key = EncodeKey(i + 1);
|
|
754
|
-
Status s = cache
|
|
748
|
+
Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
|
|
755
749
|
ASSERT_TRUE(s.ok());
|
|
756
750
|
}
|
|
757
|
-
ASSERT_EQ(10U, cache->GetCapacity());
|
|
758
|
-
ASSERT_EQ(10U, cache->GetUsage());
|
|
751
|
+
ASSERT_EQ(10U, cache.get()->GetCapacity());
|
|
752
|
+
ASSERT_EQ(10U, cache.get()->GetUsage());
|
|
759
753
|
for (int i = 0; i < 5; i++) {
|
|
760
|
-
cache
|
|
754
|
+
cache.Release(handles[i]);
|
|
761
755
|
}
|
|
762
|
-
ASSERT_EQ(10U, cache->GetCapacity());
|
|
763
|
-
ASSERT_EQ(10U, cache->GetUsage());
|
|
764
|
-
cache->SetCapacity(7);
|
|
765
|
-
ASSERT_EQ(7, cache->GetCapacity());
|
|
766
|
-
ASSERT_EQ(7, cache->GetUsage());
|
|
756
|
+
ASSERT_EQ(10U, cache.get()->GetCapacity());
|
|
757
|
+
ASSERT_EQ(10U, cache.get()->GetUsage());
|
|
758
|
+
cache.get()->SetCapacity(7);
|
|
759
|
+
ASSERT_EQ(7, cache.get()->GetCapacity());
|
|
760
|
+
ASSERT_EQ(7, cache.get()->GetUsage());
|
|
767
761
|
|
|
768
762
|
// release remaining 5 to keep valgrind happy
|
|
769
763
|
for (int i = 5; i < 10; i++) {
|
|
770
|
-
cache
|
|
764
|
+
cache.Release(handles[i]);
|
|
771
765
|
}
|
|
772
766
|
|
|
773
767
|
// Make sure this doesn't crash or upset ASAN/valgrind
|
|
774
|
-
cache->DisownData();
|
|
768
|
+
cache.get()->DisownData();
|
|
775
769
|
}
|
|
776
770
|
|
|
777
771
|
TEST_P(LRUCacheTest, SetStrictCapacityLimit) {
|
|
778
772
|
// test1: set the flag to false. Insert more keys than capacity. See if they
|
|
779
773
|
// all go through.
|
|
780
|
-
|
|
781
|
-
std::vector<
|
|
774
|
+
SharedCache cache{NewCache(5, 0, false)};
|
|
775
|
+
std::vector<TypedHandle*> handles(10);
|
|
782
776
|
Status s;
|
|
783
777
|
for (int i = 0; i < 10; i++) {
|
|
784
778
|
std::string key = EncodeKey(i + 1);
|
|
785
|
-
s = cache
|
|
779
|
+
s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
|
|
786
780
|
ASSERT_OK(s);
|
|
787
781
|
ASSERT_NE(nullptr, handles[i]);
|
|
788
782
|
}
|
|
789
|
-
ASSERT_EQ(10, cache->GetUsage());
|
|
783
|
+
ASSERT_EQ(10, cache.get()->GetUsage());
|
|
790
784
|
|
|
791
785
|
// test2: set the flag to true. Insert and check if it fails.
|
|
792
786
|
std::string extra_key = EncodeKey(100);
|
|
793
787
|
Value* extra_value = new Value(0);
|
|
794
|
-
cache->SetStrictCapacityLimit(true);
|
|
795
|
-
|
|
796
|
-
s = cache
|
|
788
|
+
cache.get()->SetStrictCapacityLimit(true);
|
|
789
|
+
TypedHandle* handle;
|
|
790
|
+
s = cache.Insert(extra_key, extra_value, 1, &handle);
|
|
797
791
|
ASSERT_TRUE(s.IsMemoryLimit());
|
|
798
792
|
ASSERT_EQ(nullptr, handle);
|
|
799
|
-
ASSERT_EQ(10, cache->GetUsage());
|
|
793
|
+
ASSERT_EQ(10, cache.get()->GetUsage());
|
|
800
794
|
|
|
801
795
|
for (int i = 0; i < 10; i++) {
|
|
802
|
-
cache
|
|
796
|
+
cache.Release(handles[i]);
|
|
803
797
|
}
|
|
804
798
|
|
|
805
799
|
// test3: init with flag being true.
|
|
806
|
-
|
|
800
|
+
SharedCache cache2{NewCache(5, 0, true)};
|
|
807
801
|
for (int i = 0; i < 5; i++) {
|
|
808
802
|
std::string key = EncodeKey(i + 1);
|
|
809
|
-
s = cache2
|
|
803
|
+
s = cache2.Insert(key, new Value(i + 1), 1, &handles[i]);
|
|
810
804
|
ASSERT_OK(s);
|
|
811
805
|
ASSERT_NE(nullptr, handles[i]);
|
|
812
806
|
}
|
|
813
|
-
s = cache2
|
|
807
|
+
s = cache2.Insert(extra_key, extra_value, 1, &handle);
|
|
814
808
|
ASSERT_TRUE(s.IsMemoryLimit());
|
|
815
809
|
ASSERT_EQ(nullptr, handle);
|
|
816
810
|
// test insert without handle
|
|
817
|
-
s = cache2
|
|
811
|
+
s = cache2.Insert(extra_key, extra_value, 1);
|
|
818
812
|
// AS if the key have been inserted into cache but get evicted immediately.
|
|
819
813
|
ASSERT_OK(s);
|
|
820
|
-
ASSERT_EQ(5, cache2->GetUsage());
|
|
821
|
-
ASSERT_EQ(nullptr, cache2
|
|
814
|
+
ASSERT_EQ(5, cache2.get()->GetUsage());
|
|
815
|
+
ASSERT_EQ(nullptr, cache2.Lookup(extra_key));
|
|
822
816
|
|
|
823
817
|
for (int i = 0; i < 5; i++) {
|
|
824
|
-
cache2
|
|
818
|
+
cache2.Release(handles[i]);
|
|
825
819
|
}
|
|
826
820
|
}
|
|
827
821
|
|
|
@@ -829,55 +823,54 @@ TEST_P(CacheTest, OverCapacity) {
|
|
|
829
823
|
size_t n = 10;
|
|
830
824
|
|
|
831
825
|
// a LRUCache with n entries and one shard only
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
std::vector<Cache::Handle*> handles(n + 1);
|
|
826
|
+
SharedCache cache{NewCache(n, 0, false)};
|
|
827
|
+
std::vector<TypedHandle*> handles(n + 1);
|
|
835
828
|
|
|
836
829
|
// Insert n+1 entries, but not releasing.
|
|
837
830
|
for (int i = 0; i < static_cast<int>(n + 1); i++) {
|
|
838
831
|
std::string key = EncodeKey(i + 1);
|
|
839
|
-
Status s = cache
|
|
832
|
+
Status s = cache.Insert(key, new Value(i + 1), 1, &handles[i]);
|
|
840
833
|
ASSERT_TRUE(s.ok());
|
|
841
834
|
}
|
|
842
835
|
|
|
843
836
|
// Guess what's in the cache now?
|
|
844
837
|
for (int i = 0; i < static_cast<int>(n + 1); i++) {
|
|
845
838
|
std::string key = EncodeKey(i + 1);
|
|
846
|
-
auto h = cache
|
|
839
|
+
auto h = cache.Lookup(key);
|
|
847
840
|
ASSERT_TRUE(h != nullptr);
|
|
848
|
-
if (h) cache
|
|
841
|
+
if (h) cache.Release(h);
|
|
849
842
|
}
|
|
850
843
|
|
|
851
844
|
// the cache is over capacity since nothing could be evicted
|
|
852
|
-
ASSERT_EQ(n + 1U, cache->GetUsage());
|
|
845
|
+
ASSERT_EQ(n + 1U, cache.get()->GetUsage());
|
|
853
846
|
for (int i = 0; i < static_cast<int>(n + 1); i++) {
|
|
854
|
-
cache
|
|
847
|
+
cache.Release(handles[i]);
|
|
855
848
|
}
|
|
856
849
|
|
|
857
850
|
if (GetParam() == kHyperClock) {
|
|
858
851
|
// Make sure eviction is triggered.
|
|
859
|
-
ASSERT_OK(cache
|
|
852
|
+
ASSERT_OK(cache.Insert(EncodeKey(-1), nullptr, 1, &handles[0]));
|
|
860
853
|
|
|
861
854
|
// cache is under capacity now since elements were released
|
|
862
|
-
ASSERT_GE(n, cache->GetUsage());
|
|
855
|
+
ASSERT_GE(n, cache.get()->GetUsage());
|
|
863
856
|
|
|
864
857
|
// clean up
|
|
865
|
-
cache
|
|
858
|
+
cache.Release(handles[0]);
|
|
866
859
|
} else {
|
|
867
860
|
// LRUCache checks for over-capacity in Release.
|
|
868
861
|
|
|
869
862
|
// cache is exactly at capacity now with minimal eviction
|
|
870
|
-
ASSERT_EQ(n, cache->GetUsage());
|
|
863
|
+
ASSERT_EQ(n, cache.get()->GetUsage());
|
|
871
864
|
|
|
872
865
|
// element 0 is evicted and the rest is there
|
|
873
866
|
// This is consistent with the LRU policy since the element 0
|
|
874
867
|
// was released first
|
|
875
868
|
for (int i = 0; i < static_cast<int>(n + 1); i++) {
|
|
876
869
|
std::string key = EncodeKey(i + 1);
|
|
877
|
-
auto h = cache
|
|
870
|
+
auto h = cache.Lookup(key);
|
|
878
871
|
if (h) {
|
|
879
872
|
ASSERT_NE(static_cast<size_t>(i), 0U);
|
|
880
|
-
cache
|
|
873
|
+
cache.Release(h);
|
|
881
874
|
} else {
|
|
882
875
|
ASSERT_EQ(static_cast<size_t>(i), 0U);
|
|
883
876
|
}
|
|
@@ -885,40 +878,15 @@ TEST_P(CacheTest, OverCapacity) {
|
|
|
885
878
|
}
|
|
886
879
|
}
|
|
887
880
|
|
|
888
|
-
namespace {
|
|
889
|
-
std::vector<std::pair<int, int>> legacy_callback_state;
|
|
890
|
-
void legacy_callback(void* value, size_t charge) {
|
|
891
|
-
legacy_callback_state.push_back(
|
|
892
|
-
{DecodeValue(value), static_cast<int>(charge)});
|
|
893
|
-
}
|
|
894
|
-
}; // namespace
|
|
895
|
-
|
|
896
|
-
TEST_P(CacheTest, ApplyToAllCacheEntriesTest) {
|
|
897
|
-
std::vector<std::pair<int, int>> inserted;
|
|
898
|
-
legacy_callback_state.clear();
|
|
899
|
-
|
|
900
|
-
for (int i = 0; i < 10; ++i) {
|
|
901
|
-
Insert(i, i * 2, i + 1);
|
|
902
|
-
inserted.push_back({i * 2, i + 1});
|
|
903
|
-
}
|
|
904
|
-
cache_->ApplyToAllCacheEntries(legacy_callback, true);
|
|
905
|
-
|
|
906
|
-
std::sort(inserted.begin(), inserted.end());
|
|
907
|
-
std::sort(legacy_callback_state.begin(), legacy_callback_state.end());
|
|
908
|
-
ASSERT_EQ(inserted.size(), legacy_callback_state.size());
|
|
909
|
-
for (int i = 0; i < static_cast<int>(inserted.size()); ++i) {
|
|
910
|
-
EXPECT_EQ(inserted[i], legacy_callback_state[i]);
|
|
911
|
-
}
|
|
912
|
-
}
|
|
913
|
-
|
|
914
881
|
TEST_P(CacheTest, ApplyToAllEntriesTest) {
|
|
915
882
|
std::vector<std::string> callback_state;
|
|
916
|
-
const auto callback = [&](const Slice& key,
|
|
917
|
-
|
|
883
|
+
const auto callback = [&](const Slice& key, Cache::ObjectPtr value,
|
|
884
|
+
size_t charge,
|
|
885
|
+
const Cache::CacheItemHelper* helper) {
|
|
918
886
|
callback_state.push_back(std::to_string(DecodeKey(key)) + "," +
|
|
919
887
|
std::to_string(DecodeValue(value)) + "," +
|
|
920
888
|
std::to_string(charge));
|
|
921
|
-
assert(
|
|
889
|
+
assert(helper == &CacheTest::kHelper);
|
|
922
890
|
};
|
|
923
891
|
|
|
924
892
|
std::vector<std::string> inserted;
|
|
@@ -957,8 +925,8 @@ TEST_P(CacheTest, ApplyToAllEntriesDuringResize) {
|
|
|
957
925
|
|
|
958
926
|
// For callback
|
|
959
927
|
int special_count = 0;
|
|
960
|
-
const auto callback = [&](const Slice&,
|
|
961
|
-
Cache::
|
|
928
|
+
const auto callback = [&](const Slice&, Cache::ObjectPtr, size_t charge,
|
|
929
|
+
const Cache::CacheItemHelper*) {
|
|
962
930
|
if (charge == static_cast<size_t>(kSpecialCharge)) {
|
|
963
931
|
++special_count;
|
|
964
932
|
}
|
|
@@ -1020,7 +988,7 @@ TEST_P(CacheTest, GetChargeAndDeleter) {
|
|
|
1020
988
|
Cache::Handle* h1 = cache_->Lookup(EncodeKey(1));
|
|
1021
989
|
ASSERT_EQ(2, DecodeValue(cache_->Value(h1)));
|
|
1022
990
|
ASSERT_EQ(1, cache_->GetCharge(h1));
|
|
1023
|
-
ASSERT_EQ(&CacheTest::
|
|
991
|
+
ASSERT_EQ(&CacheTest::kHelper, cache_->GetCacheItemHelper(h1));
|
|
1024
992
|
cache_->Release(h1);
|
|
1025
993
|
}
|
|
1026
994
|
|