@nxtedition/rocksdb 7.1.3 → 7.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/binding.cc +32 -14
- package/deps/rocksdb/iostats.patch +19 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
- package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
- package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
- package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
- package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
- package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
- package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
- package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
- package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
- package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
- package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
- package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
- package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
- package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
- package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
- package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
- package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
- package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
- package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
- package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
- package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
- package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
- package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
- package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
- package/deps/rocksdb/rocksdb/util/math.h +41 -0
- package/deps/rocksdb/rocksdb/util/math128.h +6 -0
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
- package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
- package/index.js +17 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/logging/posix_logger.h +0 -179
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
#include "rocksdb/rocksdb_namespace.h"
|
|
11
11
|
#include "rocksdb/slice.h"
|
|
12
|
+
#include "table/unique_id_impl.h"
|
|
12
13
|
|
|
13
14
|
namespace ROCKSDB_NAMESPACE {
|
|
14
15
|
|
|
@@ -33,10 +34,10 @@ class CacheKey {
|
|
|
33
34
|
public:
|
|
34
35
|
// For convenience, constructs an "empty" cache key that is never returned
|
|
35
36
|
// by other means.
|
|
36
|
-
inline CacheKey() :
|
|
37
|
+
inline CacheKey() : file_num_etc64_(), offset_etc64_() {}
|
|
37
38
|
|
|
38
39
|
inline bool IsEmpty() const {
|
|
39
|
-
return (
|
|
40
|
+
return (file_num_etc64_ == 0) & (offset_etc64_ == 0);
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
// Use this cache key as a Slice (byte order is endianness-dependent)
|
|
@@ -59,9 +60,9 @@ class CacheKey {
|
|
|
59
60
|
|
|
60
61
|
protected:
|
|
61
62
|
friend class OffsetableCacheKey;
|
|
62
|
-
CacheKey(uint64_t
|
|
63
|
-
:
|
|
64
|
-
uint64_t
|
|
63
|
+
CacheKey(uint64_t file_num_etc64, uint64_t offset_etc64)
|
|
64
|
+
: file_num_etc64_(file_num_etc64), offset_etc64_(offset_etc64) {}
|
|
65
|
+
uint64_t file_num_etc64_;
|
|
65
66
|
uint64_t offset_etc64_;
|
|
66
67
|
};
|
|
67
68
|
|
|
@@ -85,50 +86,58 @@ class OffsetableCacheKey : private CacheKey {
|
|
|
85
86
|
inline OffsetableCacheKey() : CacheKey() {}
|
|
86
87
|
|
|
87
88
|
// Constructs an OffsetableCacheKey with the given information about a file.
|
|
88
|
-
//
|
|
89
|
-
// choose an appropriate (sub-)encoding. This constructor never generates an
|
|
90
|
-
// "empty" base key.
|
|
89
|
+
// This constructor never generates an "empty" base key.
|
|
91
90
|
OffsetableCacheKey(const std::string &db_id, const std::string &db_session_id,
|
|
92
|
-
uint64_t file_number
|
|
91
|
+
uint64_t file_number);
|
|
92
|
+
|
|
93
|
+
// Creates an OffsetableCacheKey from an SST unique ID, so that cache keys
|
|
94
|
+
// can be derived from DB manifest data before reading the file from
|
|
95
|
+
// storage--so that every part of the file can potentially go in a persistent
|
|
96
|
+
// cache.
|
|
97
|
+
//
|
|
98
|
+
// Calling GetSstInternalUniqueId() on a db_id, db_session_id, and
|
|
99
|
+
// file_number and passing the result to this function produces the same
|
|
100
|
+
// base cache key as feeding those inputs directly to the constructor.
|
|
101
|
+
//
|
|
102
|
+
// This is a bijective transformation assuming either id is empty or
|
|
103
|
+
// lower 64 bits is non-zero:
|
|
104
|
+
// * Empty (all zeros) input -> empty (all zeros) output
|
|
105
|
+
// * Lower 64 input is non-zero -> lower 64 output (file_num_etc64_) is
|
|
106
|
+
// non-zero
|
|
107
|
+
static OffsetableCacheKey FromInternalUniqueId(UniqueIdPtr id);
|
|
108
|
+
|
|
109
|
+
// This is the inverse transformation to the above, assuming either empty
|
|
110
|
+
// or lower 64 bits (file_num_etc64_) is non-zero. Perhaps only useful for
|
|
111
|
+
// testing.
|
|
112
|
+
UniqueId64x2 ToInternalUniqueId();
|
|
93
113
|
|
|
94
114
|
inline bool IsEmpty() const {
|
|
95
|
-
bool result =
|
|
115
|
+
bool result = file_num_etc64_ == 0;
|
|
96
116
|
assert(!(offset_etc64_ > 0 && result));
|
|
97
117
|
return result;
|
|
98
118
|
}
|
|
99
119
|
|
|
100
|
-
// Construct a CacheKey for an offset within a file
|
|
101
|
-
//
|
|
102
|
-
//
|
|
120
|
+
// Construct a CacheKey for an offset within a file. An offset is not
|
|
121
|
+
// necessarily a byte offset if a smaller unique identifier of keyable
|
|
122
|
+
// offsets is used.
|
|
103
123
|
//
|
|
104
124
|
// This class was designed to make this hot code extremely fast.
|
|
105
125
|
inline CacheKey WithOffset(uint64_t offset) const {
|
|
106
126
|
assert(!IsEmpty());
|
|
107
|
-
|
|
108
|
-
return CacheKey(session_etc64_, offset_etc64_ ^ offset);
|
|
127
|
+
return CacheKey(file_num_etc64_, offset_etc64_ ^ offset);
|
|
109
128
|
}
|
|
110
129
|
|
|
111
|
-
// The "common prefix" is a shared prefix for all the returned CacheKeys
|
|
112
|
-
//
|
|
113
|
-
// so is efficient and highly accurate (not perfectly) for DB-specific cache
|
|
114
|
-
// dump selection (but not file-specific).
|
|
130
|
+
// The "common prefix" is a shared prefix for all the returned CacheKeys.
|
|
131
|
+
// It is specific to the file but the same for all offsets within the file.
|
|
115
132
|
static constexpr size_t kCommonPrefixSize = 8;
|
|
116
133
|
inline Slice CommonPrefixSlice() const {
|
|
117
|
-
static_assert(sizeof(
|
|
134
|
+
static_assert(sizeof(file_num_etc64_) == kCommonPrefixSize,
|
|
118
135
|
"8 byte common prefix expected");
|
|
119
136
|
assert(!IsEmpty());
|
|
120
|
-
assert(&this->
|
|
137
|
+
assert(&this->file_num_etc64_ == static_cast<const void *>(this));
|
|
121
138
|
|
|
122
139
|
return Slice(reinterpret_cast<const char *>(this), kCommonPrefixSize);
|
|
123
140
|
}
|
|
124
|
-
|
|
125
|
-
// For any max_offset <= this value, the same encoding scheme is guaranteed.
|
|
126
|
-
static constexpr uint64_t kMaxOffsetStandardEncoding = 0xffffffffffU;
|
|
127
|
-
|
|
128
|
-
private:
|
|
129
|
-
#ifndef NDEBUG
|
|
130
|
-
uint64_t max_offset_ = 0;
|
|
131
|
-
#endif
|
|
132
141
|
};
|
|
133
142
|
|
|
134
143
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -48,13 +48,13 @@ TEST_F(CacheReservationManagerTest, GenerateCacheKey) {
|
|
|
48
48
|
// Next unique Cache key
|
|
49
49
|
CacheKey ckey = CacheKey::CreateUniqueForCacheLifetime(cache.get());
|
|
50
50
|
// Get to the underlying values
|
|
51
|
-
|
|
52
|
-
auto& ckey_pair = *reinterpret_cast<PairU64*>(&ckey);
|
|
51
|
+
uint64_t* ckey_data = reinterpret_cast<uint64_t*>(&ckey);
|
|
53
52
|
// Back it up to the one used by CRM (using CacheKey implementation details)
|
|
54
|
-
|
|
53
|
+
ckey_data[1]--;
|
|
55
54
|
|
|
56
55
|
// Specific key (subject to implementation details)
|
|
57
|
-
EXPECT_EQ(
|
|
56
|
+
EXPECT_EQ(ckey_data[0], 0);
|
|
57
|
+
EXPECT_EQ(ckey_data[1], 2);
|
|
58
58
|
|
|
59
59
|
Cache::Handle* handle = cache->Lookup(ckey.AsSlice());
|
|
60
60
|
EXPECT_NE(handle, nullptr)
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
#include "util/coding.h"
|
|
24
24
|
#include "util/string_util.h"
|
|
25
25
|
|
|
26
|
+
// FastLRUCache and ClockCache only support 16-byte keys, so some of
|
|
27
|
+
// the tests originally wrote for LRUCache do not work on the other caches.
|
|
28
|
+
// Those tests were adapted to use 16-byte keys. We kept the original ones.
|
|
29
|
+
// TODO: Remove the original tests if they ever become unused.
|
|
30
|
+
|
|
26
31
|
namespace ROCKSDB_NAMESPACE {
|
|
27
32
|
|
|
28
33
|
namespace {
|
|
@@ -58,17 +63,22 @@ int DecodeValue(void* v) {
|
|
|
58
63
|
return static_cast<int>(reinterpret_cast<uintptr_t>(v));
|
|
59
64
|
}
|
|
60
65
|
|
|
61
|
-
const
|
|
62
|
-
const std::string kClock = "clock";
|
|
63
|
-
const std::string kFast = "fast";
|
|
64
|
-
|
|
65
|
-
void dumbDeleter(const Slice& /*key*/, void* /*value*/) {}
|
|
66
|
+
void DumbDeleter(const Slice& /*key*/, void* /*value*/) {}
|
|
66
67
|
|
|
67
|
-
void
|
|
68
|
+
void EraseDeleter1(const Slice& /*key*/, void* value) {
|
|
68
69
|
Cache* cache = reinterpret_cast<Cache*>(value);
|
|
69
70
|
cache->Erase("foo");
|
|
70
71
|
}
|
|
71
72
|
|
|
73
|
+
void EraseDeleter2(const Slice& /*key*/, void* value) {
|
|
74
|
+
Cache* cache = reinterpret_cast<Cache*>(value);
|
|
75
|
+
cache->Erase(EncodeKey16Bytes(1234));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const std::string kLRU = "lru";
|
|
79
|
+
const std::string kClock = "clock";
|
|
80
|
+
const std::string kFast = "fast";
|
|
81
|
+
|
|
72
82
|
} // anonymous namespace
|
|
73
83
|
|
|
74
84
|
class CacheTest : public testing::TestWithParam<std::string> {
|
|
@@ -223,13 +233,9 @@ class LRUCacheTest : public CacheTest {};
|
|
|
223
233
|
|
|
224
234
|
TEST_P(CacheTest, UsageTest) {
|
|
225
235
|
auto type = GetParam();
|
|
226
|
-
if (type == kFast || type == kClock) {
|
|
227
|
-
ROCKSDB_GTEST_BYPASS("FastLRUCache and ClockCache require 16-byte keys.");
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
236
|
|
|
231
237
|
// cache is std::shared_ptr and will be automatically cleaned up.
|
|
232
|
-
const
|
|
238
|
+
const size_t kCapacity = 100000;
|
|
233
239
|
auto cache = NewCache(kCapacity, 8, false, kDontChargeCacheMetadata);
|
|
234
240
|
auto precise_cache = NewCache(kCapacity, 0, false, kFullChargeCacheMetadata);
|
|
235
241
|
ASSERT_EQ(0, cache->GetUsage());
|
|
@@ -239,12 +245,17 @@ TEST_P(CacheTest, UsageTest) {
|
|
|
239
245
|
char value[10] = "abcdef";
|
|
240
246
|
// make sure everything will be cached
|
|
241
247
|
for (int i = 1; i < 100; ++i) {
|
|
242
|
-
std::string key
|
|
248
|
+
std::string key;
|
|
249
|
+
if (type == kLRU) {
|
|
250
|
+
key = std::string(i, 'a');
|
|
251
|
+
} else {
|
|
252
|
+
key = EncodeKey(i);
|
|
253
|
+
}
|
|
243
254
|
auto kv_size = key.size() + 5;
|
|
244
255
|
ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), kv_size,
|
|
245
|
-
|
|
256
|
+
DumbDeleter));
|
|
246
257
|
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
247
|
-
kv_size,
|
|
258
|
+
kv_size, DumbDeleter));
|
|
248
259
|
usage += kv_size;
|
|
249
260
|
ASSERT_EQ(usage, cache->GetUsage());
|
|
250
261
|
ASSERT_LT(usage, precise_cache->GetUsage());
|
|
@@ -256,12 +267,17 @@ TEST_P(CacheTest, UsageTest) {
|
|
|
256
267
|
ASSERT_EQ(0, precise_cache->GetUsage());
|
|
257
268
|
|
|
258
269
|
// make sure the cache will be overloaded
|
|
259
|
-
for (
|
|
260
|
-
|
|
270
|
+
for (size_t i = 1; i < kCapacity; ++i) {
|
|
271
|
+
std::string key;
|
|
272
|
+
if (type == kLRU) {
|
|
273
|
+
key = std::to_string(i);
|
|
274
|
+
} else {
|
|
275
|
+
key = EncodeKey(static_cast<int>(1000 + i));
|
|
276
|
+
}
|
|
261
277
|
ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
|
|
262
|
-
|
|
278
|
+
DumbDeleter));
|
|
263
279
|
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
264
|
-
key.size() + 5,
|
|
280
|
+
key.size() + 5, DumbDeleter));
|
|
265
281
|
}
|
|
266
282
|
|
|
267
283
|
// the usage should be close to the capacity
|
|
@@ -271,15 +287,18 @@ TEST_P(CacheTest, UsageTest) {
|
|
|
271
287
|
ASSERT_LT(kCapacity * 0.95, precise_cache->GetUsage());
|
|
272
288
|
}
|
|
273
289
|
|
|
290
|
+
// TODO: This test takes longer than expected on ClockCache. This is
|
|
291
|
+
// because the values size estimate at construction is too sloppy.
|
|
292
|
+
// Fix this.
|
|
293
|
+
// Why is it so slow? The cache is constructed with an estimate of 1, but
|
|
294
|
+
// then the charge is claimed to be 21. This will cause the hash table
|
|
295
|
+
// to be extremely sparse, which in turn means clock needs to scan too
|
|
296
|
+
// many slots to find victims.
|
|
274
297
|
TEST_P(CacheTest, PinnedUsageTest) {
|
|
275
298
|
auto type = GetParam();
|
|
276
|
-
if (type == kFast || type == kClock) {
|
|
277
|
-
ROCKSDB_GTEST_BYPASS("FastLRUCache and ClockCache require 16-byte keys.");
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
299
|
|
|
281
300
|
// cache is std::shared_ptr and will be automatically cleaned up.
|
|
282
|
-
const
|
|
301
|
+
const size_t kCapacity = 200000;
|
|
283
302
|
auto cache = NewCache(kCapacity, 8, false, kDontChargeCacheMetadata);
|
|
284
303
|
auto precise_cache = NewCache(kCapacity, 8, false, kFullChargeCacheMetadata);
|
|
285
304
|
|
|
@@ -292,15 +311,20 @@ TEST_P(CacheTest, PinnedUsageTest) {
|
|
|
292
311
|
// Add entries. Unpin some of them after insertion. Then, pin some of them
|
|
293
312
|
// again. Check GetPinnedUsage().
|
|
294
313
|
for (int i = 1; i < 100; ++i) {
|
|
295
|
-
std::string key
|
|
314
|
+
std::string key;
|
|
315
|
+
if (type == kLRU) {
|
|
316
|
+
key = std::string(i, 'a');
|
|
317
|
+
} else {
|
|
318
|
+
key = EncodeKey(i);
|
|
319
|
+
}
|
|
296
320
|
auto kv_size = key.size() + 5;
|
|
297
321
|
Cache::Handle* handle;
|
|
298
322
|
Cache::Handle* handle_in_precise_cache;
|
|
299
323
|
ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), kv_size,
|
|
300
|
-
|
|
324
|
+
DumbDeleter, &handle));
|
|
301
325
|
assert(handle);
|
|
302
326
|
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
303
|
-
kv_size,
|
|
327
|
+
kv_size, DumbDeleter,
|
|
304
328
|
&handle_in_precise_cache));
|
|
305
329
|
assert(handle_in_precise_cache);
|
|
306
330
|
pinned_usage += kv_size;
|
|
@@ -334,12 +358,17 @@ TEST_P(CacheTest, PinnedUsageTest) {
|
|
|
334
358
|
ASSERT_LT(pinned_usage, precise_cache_pinned_usage);
|
|
335
359
|
|
|
336
360
|
// check that overloading the cache does not change the pinned usage
|
|
337
|
-
for (
|
|
338
|
-
|
|
361
|
+
for (size_t i = 1; i < 2 * kCapacity; ++i) {
|
|
362
|
+
std::string key;
|
|
363
|
+
if (type == kLRU) {
|
|
364
|
+
key = std::to_string(i);
|
|
365
|
+
} else {
|
|
366
|
+
key = EncodeKey(static_cast<int>(1000 + i));
|
|
367
|
+
}
|
|
339
368
|
ASSERT_OK(cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
|
|
340
|
-
|
|
369
|
+
DumbDeleter));
|
|
341
370
|
ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
|
|
342
|
-
key.size() + 5,
|
|
371
|
+
key.size() + 5, DumbDeleter));
|
|
343
372
|
}
|
|
344
373
|
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
|
|
345
374
|
ASSERT_EQ(precise_cache_pinned_usage, precise_cache->GetPinnedUsage());
|
|
@@ -447,7 +476,7 @@ TEST_P(CacheTest, EvictionPolicy) {
|
|
|
447
476
|
Insert(200, 201);
|
|
448
477
|
|
|
449
478
|
// Frequently used entry must be kept around
|
|
450
|
-
for (int i = 0; i <
|
|
479
|
+
for (int i = 0; i < 2 * kCacheSize; i++) {
|
|
451
480
|
Insert(1000+i, 2000+i);
|
|
452
481
|
ASSERT_EQ(101, Lookup(100));
|
|
453
482
|
}
|
|
@@ -500,9 +529,7 @@ TEST_P(CacheTest, EvictionPolicyRef) {
|
|
|
500
529
|
Insert(303, 104);
|
|
501
530
|
|
|
502
531
|
// Insert entries much more than cache capacity.
|
|
503
|
-
|
|
504
|
-
std::min(fast_lru_cache::kLoadFactor, clock_cache::kLoadFactor);
|
|
505
|
-
for (int i = 0; i < 2 * static_cast<int>(kCacheSize / load_factor); i++) {
|
|
532
|
+
for (int i = 0; i < 100 * kCacheSize; i++) {
|
|
506
533
|
Insert(1000 + i, 2000 + i);
|
|
507
534
|
}
|
|
508
535
|
|
|
@@ -533,31 +560,40 @@ TEST_P(CacheTest, EvictionPolicyRef) {
|
|
|
533
560
|
|
|
534
561
|
TEST_P(CacheTest, EvictEmptyCache) {
|
|
535
562
|
auto type = GetParam();
|
|
536
|
-
if (type == kFast || type == kClock) {
|
|
537
|
-
ROCKSDB_GTEST_BYPASS("FastLRUCache and ClockCache require 16-byte keys.");
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
563
|
|
|
541
564
|
// Insert item large than capacity to trigger eviction on empty cache.
|
|
542
565
|
auto cache = NewCache(1, 0, false);
|
|
543
|
-
|
|
566
|
+
if (type == kLRU) {
|
|
567
|
+
ASSERT_OK(cache->Insert("foo", nullptr, 10, DumbDeleter));
|
|
568
|
+
} else {
|
|
569
|
+
ASSERT_OK(cache->Insert(EncodeKey(1000), nullptr, 10, DumbDeleter));
|
|
570
|
+
}
|
|
544
571
|
}
|
|
545
572
|
|
|
546
573
|
TEST_P(CacheTest, EraseFromDeleter) {
|
|
547
574
|
auto type = GetParam();
|
|
548
|
-
if (type == kFast || type == kClock) {
|
|
549
|
-
ROCKSDB_GTEST_BYPASS("FastLRUCache and ClockCache require 16-byte keys.");
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
575
|
|
|
553
576
|
// Have deleter which will erase item from cache, which will re-enter
|
|
554
577
|
// the cache at that point.
|
|
555
578
|
std::shared_ptr<Cache> cache = NewCache(10, 0, false);
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
579
|
+
std::string foo, bar;
|
|
580
|
+
Cache::DeleterFn erase_deleter;
|
|
581
|
+
if (type == kLRU) {
|
|
582
|
+
foo = "foo";
|
|
583
|
+
bar = "bar";
|
|
584
|
+
erase_deleter = EraseDeleter1;
|
|
585
|
+
} else {
|
|
586
|
+
foo = EncodeKey(1234);
|
|
587
|
+
bar = EncodeKey(5678);
|
|
588
|
+
erase_deleter = EraseDeleter2;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
ASSERT_OK(cache->Insert(foo, nullptr, 1, DumbDeleter));
|
|
592
|
+
ASSERT_OK(cache->Insert(bar, cache.get(), 1, erase_deleter));
|
|
593
|
+
|
|
594
|
+
cache->Erase(bar);
|
|
595
|
+
ASSERT_EQ(nullptr, cache->Lookup(foo));
|
|
596
|
+
ASSERT_EQ(nullptr, cache->Lookup(bar));
|
|
561
597
|
}
|
|
562
598
|
|
|
563
599
|
TEST_P(CacheTest, ErasedHandleState) {
|
|
@@ -590,9 +626,9 @@ TEST_P(CacheTest, HeavyEntries) {
|
|
|
590
626
|
const int kHeavy = 10;
|
|
591
627
|
int added = 0;
|
|
592
628
|
int index = 0;
|
|
593
|
-
while (added < 2*kCacheSize) {
|
|
629
|
+
while (added < 2 * kCacheSize) {
|
|
594
630
|
const int weight = (index & 1) ? kLight : kHeavy;
|
|
595
|
-
Insert(index, 1000+index, weight);
|
|
631
|
+
Insert(index, 1000 + index, weight);
|
|
596
632
|
added += weight;
|
|
597
633
|
index++;
|
|
598
634
|
}
|
|
@@ -603,7 +639,7 @@ TEST_P(CacheTest, HeavyEntries) {
|
|
|
603
639
|
int r = Lookup(i);
|
|
604
640
|
if (r >= 0) {
|
|
605
641
|
cached_weight += weight;
|
|
606
|
-
ASSERT_EQ(1000+i, r);
|
|
642
|
+
ASSERT_EQ(1000 + i, r);
|
|
607
643
|
}
|
|
608
644
|
}
|
|
609
645
|
ASSERT_LE(cached_weight, kCacheSize + kCacheSize/10);
|
|
@@ -615,7 +651,6 @@ TEST_P(CacheTest, NewId) {
|
|
|
615
651
|
ASSERT_NE(a, b);
|
|
616
652
|
}
|
|
617
653
|
|
|
618
|
-
|
|
619
654
|
class Value {
|
|
620
655
|
public:
|
|
621
656
|
explicit Value(int v) : v_(v) {}
|
|
@@ -664,7 +699,8 @@ TEST_P(CacheTest, SetCapacity) {
|
|
|
664
699
|
auto type = GetParam();
|
|
665
700
|
if (type == kFast || type == kClock) {
|
|
666
701
|
ROCKSDB_GTEST_BYPASS(
|
|
667
|
-
"FastLRUCache and ClockCache don't support capacity
|
|
702
|
+
"FastLRUCache and ClockCache don't support arbitrary capacity "
|
|
703
|
+
"adjustments.");
|
|
668
704
|
return;
|
|
669
705
|
}
|
|
670
706
|
// test1: increase capacity
|
|
@@ -716,9 +752,9 @@ TEST_P(CacheTest, SetCapacity) {
|
|
|
716
752
|
|
|
717
753
|
TEST_P(LRUCacheTest, SetStrictCapacityLimit) {
|
|
718
754
|
auto type = GetParam();
|
|
719
|
-
if (type == kFast
|
|
755
|
+
if (type == kFast) {
|
|
720
756
|
ROCKSDB_GTEST_BYPASS(
|
|
721
|
-
"FastLRUCache
|
|
757
|
+
"FastLRUCache only supports a limited number of "
|
|
722
758
|
"inserts beyond "
|
|
723
759
|
"capacity.");
|
|
724
760
|
return;
|
|
@@ -775,9 +811,8 @@ TEST_P(LRUCacheTest, SetStrictCapacityLimit) {
|
|
|
775
811
|
|
|
776
812
|
TEST_P(CacheTest, OverCapacity) {
|
|
777
813
|
auto type = GetParam();
|
|
778
|
-
if (type ==
|
|
779
|
-
ROCKSDB_GTEST_BYPASS(
|
|
780
|
-
"FastLRUCache and ClockCache don't support capacity adjustments.");
|
|
814
|
+
if (type == kClock) {
|
|
815
|
+
ROCKSDB_GTEST_BYPASS("Requires LRU eviction policy.");
|
|
781
816
|
return;
|
|
782
817
|
}
|
|
783
818
|
size_t n = 10;
|