@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.
Files changed (185) hide show
  1. package/binding.cc +32 -14
  2. package/deps/rocksdb/iostats.patch +19 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
  4. package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
  6. package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
  7. package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
  8. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
  9. package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +92 -42
  11. package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +114 -37
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +34 -2
  14. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +187 -38
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +88 -19
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +481 -224
  19. package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
  20. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
  22. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
  23. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
  24. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
  27. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
  28. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  29. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +105 -0
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +56 -53
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +45 -11
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
  41. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
  42. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
  43. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
  44. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +239 -190
  45. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
  54. package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
  55. package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
  56. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
  57. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
  58. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  59. package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
  60. package/deps/rocksdb/rocksdb/db/db_test2.cc +24 -9
  61. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
  62. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
  63. package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
  64. package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
  65. package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
  67. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
  68. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
  69. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
  70. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +7 -1
  71. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
  72. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  73. package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
  74. package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
  75. package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
  76. package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
  77. package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +222 -47
  80. package/deps/rocksdb/rocksdb/db/memtable.h +70 -14
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
  82. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
  83. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
  84. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
  85. package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
  86. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
  87. package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
  88. package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
  89. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +10 -15
  90. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
  91. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
  92. package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
  93. package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
  94. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
  95. package/deps/rocksdb/rocksdb/db/version_set.cc +71 -28
  96. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  97. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
  99. package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
  100. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
  101. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
  102. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
  103. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
  104. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  105. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
  106. package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
  107. package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
  108. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +5 -0
  109. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +12 -0
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +8 -0
  111. package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
  112. package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
  113. package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
  114. package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
  115. package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
  116. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
  117. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +29 -1
  119. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
  122. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
  124. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
  127. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
  128. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
  129. package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
  130. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
  131. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
  132. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
  133. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
  134. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +10 -3
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -5
  137. package/deps/rocksdb/rocksdb/options/options_helper.cc +4 -1
  138. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  139. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
  140. package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +52 -12
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +5 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +9 -1
  146. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
  147. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
  149. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
  150. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
  151. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  152. package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
  153. package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
  154. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
  155. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
  156. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  157. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
  158. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
  159. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
  160. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
  161. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
  162. package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
  163. package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
  164. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
  165. package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
  166. package/deps/rocksdb/rocksdb/util/math.h +41 -0
  167. package/deps/rocksdb/rocksdb/util/math128.h +6 -0
  168. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
  169. package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
  170. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
  171. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
  172. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
  173. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
  174. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
  175. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
  176. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
  177. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
  178. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  179. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
  180. package/index.js +17 -8
  181. package/package.json +1 -1
  182. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  183. package/prebuilds/darwin-x64/node.napi.node +0 -0
  184. package/prebuilds/linux-x64/node.napi.node +0 -0
  185. 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() : session_etc64_(), offset_etc64_() {}
37
+ inline CacheKey() : file_num_etc64_(), offset_etc64_() {}
37
38
 
38
39
  inline bool IsEmpty() const {
39
- return (session_etc64_ == 0) & (offset_etc64_ == 0);
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 session_etc64, uint64_t offset_etc64)
63
- : session_etc64_(session_etc64), offset_etc64_(offset_etc64) {}
64
- uint64_t session_etc64_;
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
- // max_offset is based on file size (see WithOffset) and is required here to
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, uint64_t max_offset);
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 = session_etc64_ == 0;
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, which must be
101
- // <= max_offset provided in constructor. An offset is not necessarily a
102
- // byte offset if a smaller unique identifier of keyable offsets is used.
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
- assert(offset <= max_offset_);
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
- // that also happens to usually be the same among many files in the same DB,
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(session_etc64_) == kCommonPrefixSize,
134
+ static_assert(sizeof(file_num_etc64_) == kCommonPrefixSize,
118
135
  "8 byte common prefix expected");
119
136
  assert(!IsEmpty());
120
- assert(&this->session_etc64_ == static_cast<const void *>(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
- using PairU64 = std::array<uint64_t, 2>;
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
- ckey_pair[1]--;
53
+ ckey_data[1]--;
55
54
 
56
55
  // Specific key (subject to implementation details)
57
- EXPECT_EQ(ckey_pair, PairU64({0, 2}));
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 std::string kLRU = "lru";
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 eraseDeleter(const Slice& /*key*/, void* value) {
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 uint64_t kCapacity = 100000;
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(i, 'a');
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
- dumbDeleter));
256
+ DumbDeleter));
246
257
  ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
247
- kv_size, dumbDeleter));
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 (uint64_t i = 1; i < kCapacity; ++i) {
260
- auto key = std::to_string(i);
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
- dumbDeleter));
278
+ DumbDeleter));
263
279
  ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
264
- key.size() + 5, dumbDeleter));
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 uint64_t kCapacity = 200000;
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(i, 'a');
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
- dumbDeleter, &handle));
324
+ DumbDeleter, &handle));
301
325
  assert(handle);
302
326
  ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
303
- kv_size, dumbDeleter,
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 (uint64_t i = 1; i < 2 * kCapacity; ++i) {
338
- auto key = std::to_string(i);
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
- dumbDeleter));
369
+ DumbDeleter));
341
370
  ASSERT_OK(precise_cache->Insert(key, reinterpret_cast<void*>(value),
342
- key.size() + 5, dumbDeleter));
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 < kCacheSize * 2; 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
- double load_factor =
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
- ASSERT_OK(cache->Insert("foo", nullptr, 10, dumbDeleter));
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
- ASSERT_OK(cache->Insert("foo", nullptr, 1, dumbDeleter));
557
- ASSERT_OK(cache->Insert("bar", cache.get(), 1, eraseDeleter));
558
- cache->Erase("bar");
559
- ASSERT_EQ(nullptr, cache->Lookup("foo"));
560
- ASSERT_EQ(nullptr, cache->Lookup("bar"));
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 adjustments.");
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 || type == kClock) {
755
+ if (type == kFast) {
720
756
  ROCKSDB_GTEST_BYPASS(
721
- "FastLRUCache and ClockCache don't support an unbounded number of "
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 == kFast || type == kClock) {
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;