@nxtedition/rocksdb 8.0.0 → 8.0.2

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 (144) hide show
  1. package/BUILDING.md +2 -2
  2. package/binding.cc +2 -7
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -9
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/TARGETS +4 -2
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +0 -5
  7. package/deps/rocksdb/rocksdb/cache/cache_test.cc +8 -29
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +146 -0
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.h +13 -1
  10. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +57 -146
  11. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +32 -0
  12. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +11 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -9
  14. package/deps/rocksdb/rocksdb/db/column_family.h +20 -0
  15. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +5 -0
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +13 -33
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +27 -8
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -1
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -1
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -6
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +65 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +5 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +10 -32
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +28 -47
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +28 -22
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -14
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -8
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +170 -140
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -4
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  35. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  37. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  38. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +72 -5
  39. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +119 -10
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +585 -264
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +46 -18
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +6 -15
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -8
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +10 -0
  49. package/deps/rocksdb/rocksdb/db/db_iter.cc +57 -36
  50. package/deps/rocksdb/rocksdb/db/db_iter.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +250 -2
  52. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  53. package/deps/rocksdb/rocksdb/db/db_test2.cc +307 -8
  54. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  55. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  56. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  57. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  58. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  59. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +5 -2
  60. package/deps/rocksdb/rocksdb/db/flush_job.cc +5 -2
  61. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +4 -0
  62. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  63. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  64. package/deps/rocksdb/rocksdb/db/memtable.cc +55 -9
  65. package/deps/rocksdb/rocksdb/db/merge_helper.cc +76 -102
  66. package/deps/rocksdb/rocksdb/db/merge_helper.h +2 -11
  67. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  68. package/deps/rocksdb/rocksdb/db/repair.cc +64 -22
  69. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  70. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  71. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
  72. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  73. package/deps/rocksdb/rocksdb/db/version_builder.cc +90 -43
  74. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  75. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +190 -67
  76. package/deps/rocksdb/rocksdb/db/version_edit.cc +15 -1
  77. package/deps/rocksdb/rocksdb/db/version_edit.h +16 -4
  78. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +41 -11
  79. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +27 -12
  80. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +18 -16
  81. package/deps/rocksdb/rocksdb/db/version_set.cc +219 -38
  82. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  83. package/deps/rocksdb/rocksdb/db/version_set_test.cc +45 -25
  84. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +122 -61
  85. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +0 -1
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +0 -4
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +12 -17
  89. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +6 -4
  90. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -1
  91. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -0
  92. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +0 -48
  93. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  94. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +196 -171
  95. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  97. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -18
  98. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +27 -5
  99. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  100. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  101. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +3 -0
  102. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  103. package/deps/rocksdb/rocksdb/logging/logging.h +13 -19
  104. package/deps/rocksdb/rocksdb/memory/arena.cc +4 -3
  105. package/deps/rocksdb/rocksdb/memory/arena_test.cc +30 -0
  106. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
  107. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  108. package/deps/rocksdb/rocksdb/src.mk +2 -1
  109. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  110. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -10
  111. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -29
  112. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  113. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -39
  114. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +0 -1
  115. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  116. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +142 -0
  117. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +241 -0
  118. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  119. package/deps/rocksdb/rocksdb/table/format.h +5 -2
  120. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -11
  121. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +97 -115
  122. package/deps/rocksdb/rocksdb/table/merging_iterator.h +82 -1
  123. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  124. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  125. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  126. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  127. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +0 -6
  128. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  129. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/util/crc32c.cc +1 -1
  131. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  132. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +5 -0
  133. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -0
  134. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -67
  135. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -3
  136. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  137. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +59 -0
  138. package/deps/rocksdb/rocksdb.gyp +2 -1
  139. package/package.json +1 -1
  140. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  141. package/prebuilds/linux-x64/node.napi.node +0 -0
  142. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +0 -580
  143. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -476
  144. package/max_rev_operator.h +0 -100
package/BUILDING.md CHANGED
@@ -10,9 +10,9 @@
10
10
  - Copy `libfolly.a` to `/usr/lib/x86_64-linux-gnu`.
11
11
  - Copy headers to `/usr/lib/x86_64-linux-gnu/include`.
12
12
  - Copy boost headers from folly scratchpad to `/usr/lib/x86_64-linux-gnu/include`.
13
- - `npx prebuildify -t 18.11.0 --napi --strip --arch x64`
13
+ - `JOBS=8 npx prebuildify -t 18.11.0 --napi --strip --arch x64`
14
14
 
15
15
  # OSX
16
16
 
17
17
  - `brew install zstd`
18
- - `npx prebuildify -t 18.11.0 --napi --strip --arch arm64`
18
+ - `JOBS=8 npx prebuildify -t 18.11.0 --napi --strip --arch arm64`
package/binding.cc CHANGED
@@ -26,7 +26,6 @@
26
26
  #include <thread>
27
27
  #include <vector>
28
28
 
29
- #include "max_rev_operator.h"
30
29
  #include "util.h"
31
30
 
32
31
  class NullLogger : public rocksdb::Logger {
@@ -557,12 +556,8 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
557
556
  std::optional<std::string> mergeOperatorOpt;
558
557
  NAPI_STATUS_RETURN(GetProperty(env, options, "mergeOperator", mergeOperatorOpt));
559
558
  if (mergeOperatorOpt) {
560
- if (*mergeOperatorOpt == "maxRev") {
561
- columnOptions.merge_operator = std::make_shared<MaxRevOperator>();
562
- } else {
563
- ROCKS_STATUS_RETURN_NAPI(
564
- rocksdb::MergeOperator::CreateFromString(configOptions, *mergeOperatorOpt, &columnOptions.merge_operator));
565
- }
559
+ ROCKS_STATUS_RETURN_NAPI(
560
+ rocksdb::MergeOperator::CreateFromString(configOptions, *mergeOperatorOpt, &columnOptions.merge_operator));
566
561
  }
567
562
 
568
563
  std::optional<std::string> compactionPriority;
@@ -250,6 +250,8 @@ option(FORCE_SSE42 "force building with SSE4.2, even when PORTABLE=ON" OFF)
250
250
  option(FORCE_AVX "force building with AVX, even when PORTABLE=ON" OFF)
251
251
  option(FORCE_AVX2 "force building with AVX2, even when PORTABLE=ON" OFF)
252
252
  if(PORTABLE)
253
+ add_definitions(-DROCKSDB_PORTABLE)
254
+
253
255
  # MSVC does not need a separate compiler flag to enable SSE4.2; if nmmintrin.h
254
256
  # is available, it is available by default.
255
257
  if(FORCE_SSE42 AND NOT MSVC)
@@ -292,8 +294,7 @@ if(NOT MSVC)
292
294
  set(CMAKE_REQUIRED_FLAGS "-msse4.2 -mpclmul")
293
295
  endif()
294
296
 
295
- if (NOT PORTABLE OR FORCE_SSE42)
296
- CHECK_CXX_SOURCE_COMPILES("
297
+ CHECK_CXX_SOURCE_COMPILES("
297
298
  #include <cstdint>
298
299
  #include <nmmintrin.h>
299
300
  #include <wmmintrin.h>
@@ -305,12 +306,11 @@ int main() {
305
306
  auto d = _mm_cvtsi128_si64(c);
306
307
  }
307
308
  " HAVE_SSE42)
308
- if(HAVE_SSE42)
309
- add_definitions(-DHAVE_SSE42)
310
- add_definitions(-DHAVE_PCLMUL)
311
- elseif(FORCE_SSE42)
312
- message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
313
- endif()
309
+ if(HAVE_SSE42)
310
+ add_definitions(-DHAVE_SSE42)
311
+ add_definitions(-DHAVE_PCLMUL)
312
+ elseif(FORCE_SSE42)
313
+ message(FATAL_ERROR "FORCE_SSE42=ON but unable to compile with SSE4.2 enabled")
314
314
  endif()
315
315
 
316
316
  # Check if -latomic is required or not
@@ -653,8 +653,8 @@ set(SOURCES
653
653
  cache/charged_cache.cc
654
654
  cache/clock_cache.cc
655
655
  cache/compressed_secondary_cache.cc
656
- cache/fast_lru_cache.cc
657
656
  cache/lru_cache.cc
657
+ cache/secondary_cache.cc
658
658
  cache/sharded_cache.cc
659
659
  db/arena_wrapped_db_iter.cc
660
660
  db/blob/blob_contents.cc
@@ -831,6 +831,7 @@ set(SOURCES
831
831
  table/get_context.cc
832
832
  table/iterator.cc
833
833
  table/merging_iterator.cc
834
+ table/compaction_merging_iterator.cc
834
835
  table/meta_blocks.cc
835
836
  table/persistent_cache_helper.cc
836
837
  table/plain/plain_table_bloom.cc
@@ -2092,8 +2092,8 @@ ROCKSDB_JAVADOCS_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-javadoc.jar
2092
2092
  ROCKSDB_SOURCES_JAR = rocksdbjni-$(ROCKSDB_JAVA_VERSION)-sources.jar
2093
2093
  SHA256_CMD = sha256sum
2094
2094
 
2095
- ZLIB_VER ?= 1.2.12
2096
- ZLIB_SHA256 ?= 91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9
2095
+ ZLIB_VER ?= 1.2.13
2096
+ ZLIB_SHA256 ?= b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
2097
2097
  ZLIB_DOWNLOAD_BASE ?= http://zlib.net
2098
2098
  BZIP2_VER ?= 1.0.8
2099
2099
  BZIP2_SHA256 ?= ab5a03176ee106d3f0fa90e381da478ddae405918153cca248e682cd0c4a2269
@@ -16,8 +16,8 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
16
16
  "cache/charged_cache.cc",
17
17
  "cache/clock_cache.cc",
18
18
  "cache/compressed_secondary_cache.cc",
19
- "cache/fast_lru_cache.cc",
20
19
  "cache/lru_cache.cc",
20
+ "cache/secondary_cache.cc",
21
21
  "cache/sharded_cache.cc",
22
22
  "db/arena_wrapped_db_iter.cc",
23
23
  "db/blob/blob_contents.cc",
@@ -198,6 +198,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
198
198
  "table/block_based/reader_common.cc",
199
199
  "table/block_based/uncompression_dict_reader.cc",
200
200
  "table/block_fetcher.cc",
201
+ "table/compaction_merging_iterator.cc",
201
202
  "table/cuckoo/cuckoo_table_builder.cc",
202
203
  "table/cuckoo/cuckoo_table_factory.cc",
203
204
  "table/cuckoo/cuckoo_table_reader.cc",
@@ -356,8 +357,8 @@ cpp_library_wrapper(name="rocksdb_whole_archive_lib", srcs=[
356
357
  "cache/charged_cache.cc",
357
358
  "cache/clock_cache.cc",
358
359
  "cache/compressed_secondary_cache.cc",
359
- "cache/fast_lru_cache.cc",
360
360
  "cache/lru_cache.cc",
361
+ "cache/secondary_cache.cc",
361
362
  "cache/sharded_cache.cc",
362
363
  "db/arena_wrapped_db_iter.cc",
363
364
  "db/blob/blob_contents.cc",
@@ -538,6 +539,7 @@ cpp_library_wrapper(name="rocksdb_whole_archive_lib", srcs=[
538
539
  "table/block_based/reader_common.cc",
539
540
  "table/block_based/uncompression_dict_reader.cc",
540
541
  "table/block_fetcher.cc",
542
+ "table/compaction_merging_iterator.cc",
541
543
  "table/cuckoo/cuckoo_table_builder.cc",
542
544
  "table/cuckoo/cuckoo_table_factory.cc",
543
545
  "table/cuckoo/cuckoo_table_reader.cc",
@@ -13,7 +13,6 @@
13
13
  #include <set>
14
14
  #include <sstream>
15
15
 
16
- #include "cache/fast_lru_cache.h"
17
16
  #include "db/db_impl/db_impl.h"
18
17
  #include "monitoring/histogram.h"
19
18
  #include "port/port.h"
@@ -297,10 +296,6 @@ class CacheBench {
297
296
  cache_ = HyperClockCacheOptions(FLAGS_cache_size, FLAGS_value_bytes,
298
297
  FLAGS_num_shard_bits)
299
298
  .MakeSharedCache();
300
- } else if (FLAGS_cache_type == "fast_lru_cache") {
301
- cache_ = NewFastLRUCache(
302
- FLAGS_cache_size, FLAGS_value_bytes, FLAGS_num_shard_bits,
303
- false /*strict_capacity_limit*/, kDefaultCacheMetadataChargePolicy);
304
299
  } else if (FLAGS_cache_type == "lru_cache") {
305
300
  LRUCacheOptions opts(FLAGS_cache_size, FLAGS_num_shard_bits,
306
301
  false /* strict_capacity_limit */,
@@ -15,15 +15,14 @@
15
15
  #include <string>
16
16
  #include <vector>
17
17
 
18
- #include "cache/fast_lru_cache.h"
19
18
  #include "cache/lru_cache.h"
20
19
  #include "port/stack_trace.h"
21
20
  #include "test_util/testharness.h"
22
21
  #include "util/coding.h"
23
22
  #include "util/string_util.h"
24
23
 
25
- // FastLRUCache and HyperClockCache only support 16-byte keys, so some of
26
- // the tests originally wrote for LRUCache do not work on the other caches.
24
+ // HyperClockCache only supports 16-byte keys, so some of the tests
25
+ // originally written for LRUCache do not work on the other caches.
27
26
  // Those tests were adapted to use 16-byte keys. We kept the original ones.
28
27
  // TODO: Remove the original tests if they ever become unused.
29
28
 
@@ -76,7 +75,6 @@ void EraseDeleter2(const Slice& /*key*/, void* value) {
76
75
 
77
76
  const std::string kLRU = "lru";
78
77
  const std::string kHyperClock = "hyper_clock";
79
- const std::string kFast = "fast";
80
78
 
81
79
  } // anonymous namespace
82
80
 
@@ -86,7 +84,7 @@ class CacheTest : public testing::TestWithParam<std::string> {
86
84
  static std::string type_;
87
85
 
88
86
  static void Deleter(const Slice& key, void* v) {
89
- if (type_ == kFast || type_ == kHyperClock) {
87
+ if (type_ == kHyperClock) {
90
88
  current_->deleted_keys_.push_back(DecodeKey16Bytes(key));
91
89
  } else {
92
90
  current_->deleted_keys_.push_back(DecodeKey32Bits(key));
@@ -126,11 +124,6 @@ class CacheTest : public testing::TestWithParam<std::string> {
126
124
  capacity, estimated_value_size_ /*estimated_value_size*/)
127
125
  .MakeSharedCache();
128
126
  }
129
- if (type == kFast) {
130
- return NewFastLRUCache(
131
- capacity, estimated_value_size_, -1 /*num_shard_bits*/,
132
- false /*strict_capacity_limit*/, kDefaultCacheMetadataChargePolicy);
133
- }
134
127
  return nullptr;
135
128
  }
136
129
 
@@ -153,11 +146,6 @@ class CacheTest : public testing::TestWithParam<std::string> {
153
146
  nullptr /*allocator*/, charge_policy)
154
147
  .MakeSharedCache();
155
148
  }
156
- if (type == kFast) {
157
- return NewFastLRUCache(capacity, 1 /*estimated_value_size*/,
158
- num_shard_bits, strict_capacity_limit,
159
- charge_policy);
160
- }
161
149
  return nullptr;
162
150
  }
163
151
 
@@ -167,7 +155,7 @@ class CacheTest : public testing::TestWithParam<std::string> {
167
155
  // LRUCache doesn't, so the encoding depends on the cache type.
168
156
  std::string EncodeKey(int k) {
169
157
  auto type = GetParam();
170
- if (type == kFast || type == kHyperClock) {
158
+ if (type == kHyperClock) {
171
159
  return EncodeKey16Bytes(k);
172
160
  } else {
173
161
  return EncodeKey32Bits(k);
@@ -176,7 +164,7 @@ class CacheTest : public testing::TestWithParam<std::string> {
176
164
 
177
165
  int DecodeKey(const Slice& k) {
178
166
  auto type = GetParam();
179
- if (type == kFast || type == kHyperClock) {
167
+ if (type == kHyperClock) {
180
168
  return DecodeKey16Bytes(k);
181
169
  } else {
182
170
  return DecodeKey32Bits(k);
@@ -733,7 +721,7 @@ TEST_P(CacheTest, ReleaseWithoutErase) {
733
721
 
734
722
  TEST_P(CacheTest, SetCapacity) {
735
723
  auto type = GetParam();
736
- if (type == kFast || type == kHyperClock) {
724
+ if (type == kHyperClock) {
737
725
  ROCKSDB_GTEST_BYPASS(
738
726
  "FastLRUCache and HyperClockCache don't support arbitrary capacity "
739
727
  "adjustments.");
@@ -787,14 +775,6 @@ TEST_P(CacheTest, SetCapacity) {
787
775
  }
788
776
 
789
777
  TEST_P(LRUCacheTest, SetStrictCapacityLimit) {
790
- auto type = GetParam();
791
- if (type == kFast) {
792
- ROCKSDB_GTEST_BYPASS(
793
- "FastLRUCache only supports a limited number of "
794
- "inserts beyond "
795
- "capacity.");
796
- return;
797
- }
798
778
  // test1: set the flag to false. Insert more keys than capacity. See if they
799
779
  // all go through.
800
780
  std::shared_ptr<Cache> cache = NewCache(5, 0, false);
@@ -1045,9 +1025,8 @@ TEST_P(CacheTest, GetChargeAndDeleter) {
1045
1025
  }
1046
1026
 
1047
1027
  INSTANTIATE_TEST_CASE_P(CacheTestInstance, CacheTest,
1048
- testing::Values(kLRU, kHyperClock, kFast));
1049
- INSTANTIATE_TEST_CASE_P(CacheTestInstance, LRUCacheTest,
1050
- testing::Values(kLRU, kFast));
1028
+ testing::Values(kLRU, kHyperClock));
1029
+ INSTANTIATE_TEST_CASE_P(CacheTestInstance, LRUCacheTest, testing::Values(kLRU));
1051
1030
 
1052
1031
  } // namespace ROCKSDB_NAMESPACE
1053
1032
 
@@ -11,8 +11,10 @@
11
11
 
12
12
  #include <cassert>
13
13
  #include <functional>
14
+ #include <numeric>
14
15
 
15
16
  #include "cache/cache_key.h"
17
+ #include "logging/logging.h"
16
18
  #include "monitoring/perf_context_imp.h"
17
19
  #include "monitoring/statistics.h"
18
20
  #include "port/lang.h"
@@ -1152,6 +1154,16 @@ size_t ClockCacheShard<Table>::GetUsage() const {
1152
1154
  return table_.GetUsage();
1153
1155
  }
1154
1156
 
1157
+ template <class Table>
1158
+ size_t ClockCacheShard<Table>::GetDetachedUsage() const {
1159
+ return table_.GetDetachedUsage();
1160
+ }
1161
+
1162
+ template <class Table>
1163
+ size_t ClockCacheShard<Table>::GetCapacity() const {
1164
+ return capacity_;
1165
+ }
1166
+
1155
1167
  template <class Table>
1156
1168
  size_t ClockCacheShard<Table>::GetPinnedUsage() const {
1157
1169
  // Computes the pinned usage by scanning the whole hash table. This
@@ -1186,6 +1198,11 @@ size_t ClockCacheShard<Table>::GetOccupancyCount() const {
1186
1198
  return table_.GetOccupancy();
1187
1199
  }
1188
1200
 
1201
+ template <class Table>
1202
+ size_t ClockCacheShard<Table>::GetOccupancyLimit() const {
1203
+ return table_.GetOccupancyLimit();
1204
+ }
1205
+
1189
1206
  template <class Table>
1190
1207
  size_t ClockCacheShard<Table>::GetTableAddressCount() const {
1191
1208
  return table_.GetTableSize();
@@ -1227,6 +1244,135 @@ Cache::DeleterFn HyperClockCache::GetDeleter(Handle* handle) const {
1227
1244
  return h->deleter;
1228
1245
  }
1229
1246
 
1247
+ namespace {
1248
+
1249
+ // For each cache shard, estimate what the table load factor would be if
1250
+ // cache filled to capacity with average entries. This is considered
1251
+ // indicative of a potential problem if the shard is essentially operating
1252
+ // "at limit", which we define as high actual usage (>80% of capacity)
1253
+ // or actual occupancy very close to limit (>95% of limit).
1254
+ // Also, for each shard compute the recommended estimated_entry_charge,
1255
+ // and keep the minimum one for use as overall recommendation.
1256
+ void AddShardEvaluation(const HyperClockCache::Shard& shard,
1257
+ std::vector<double>& predicted_load_factors,
1258
+ size_t& min_recommendation) {
1259
+ size_t usage = shard.GetUsage() - shard.GetDetachedUsage();
1260
+ size_t capacity = shard.GetCapacity();
1261
+ double usage_ratio = 1.0 * usage / capacity;
1262
+
1263
+ size_t occupancy = shard.GetOccupancyCount();
1264
+ size_t occ_limit = shard.GetOccupancyLimit();
1265
+ double occ_ratio = 1.0 * occupancy / occ_limit;
1266
+ if (usage == 0 || occupancy == 0 || (usage_ratio < 0.8 && occ_ratio < 0.95)) {
1267
+ // Skip as described above
1268
+ return;
1269
+ }
1270
+
1271
+ // If filled to capacity, what would the occupancy ratio be?
1272
+ double ratio = occ_ratio / usage_ratio;
1273
+ // Given max load factor, what that load factor be?
1274
+ double lf = ratio * kStrictLoadFactor;
1275
+ predicted_load_factors.push_back(lf);
1276
+
1277
+ // Update min_recommendation also
1278
+ size_t recommendation = usage / occupancy;
1279
+ min_recommendation = std::min(min_recommendation, recommendation);
1280
+ }
1281
+
1282
+ } // namespace
1283
+
1284
+ void HyperClockCache::ReportProblems(
1285
+ const std::shared_ptr<Logger>& info_log) const {
1286
+ uint32_t shard_count = GetNumShards();
1287
+ std::vector<double> predicted_load_factors;
1288
+ size_t min_recommendation = SIZE_MAX;
1289
+ const_cast<HyperClockCache*>(this)->ForEachShard(
1290
+ [&](HyperClockCache::Shard* shard) {
1291
+ AddShardEvaluation(*shard, predicted_load_factors, min_recommendation);
1292
+ });
1293
+
1294
+ if (predicted_load_factors.empty()) {
1295
+ // None operating "at limit" -> nothing to report
1296
+ return;
1297
+ }
1298
+ std::sort(predicted_load_factors.begin(), predicted_load_factors.end());
1299
+
1300
+ // First, if the average load factor is within spec, we aren't going to
1301
+ // complain about a few shards being out of spec.
1302
+ // NOTE: this is only the average among cache shards operating "at limit,"
1303
+ // which should be representative of what we care about. It it normal, even
1304
+ // desirable, for a cache to operate "at limit" so this should not create
1305
+ // selection bias. See AddShardEvaluation().
1306
+ // TODO: Consider detecting cases where decreasing the number of shards
1307
+ // would be good, e.g. serious imbalance among shards.
1308
+ double average_load_factor =
1309
+ std::accumulate(predicted_load_factors.begin(),
1310
+ predicted_load_factors.end(), 0.0) /
1311
+ shard_count;
1312
+
1313
+ constexpr double kLowSpecLoadFactor = kLoadFactor / 2;
1314
+ constexpr double kMidSpecLoadFactor = kLoadFactor / 1.414;
1315
+ if (average_load_factor > kLoadFactor) {
1316
+ // Out of spec => Consider reporting load factor too high
1317
+ // Estimate effective overall capacity loss due to enforcing occupancy limit
1318
+ double lost_portion = 0.0;
1319
+ int over_count = 0;
1320
+ for (double lf : predicted_load_factors) {
1321
+ if (lf > kStrictLoadFactor) {
1322
+ ++over_count;
1323
+ lost_portion += (lf - kStrictLoadFactor) / lf / shard_count;
1324
+ }
1325
+ }
1326
+ // >= 20% loss -> error
1327
+ // >= 10% loss -> consistent warning
1328
+ // >= 1% loss -> intermittent warning
1329
+ InfoLogLevel level = InfoLogLevel::INFO_LEVEL;
1330
+ bool report = true;
1331
+ if (lost_portion > 0.2) {
1332
+ level = InfoLogLevel::ERROR_LEVEL;
1333
+ } else if (lost_portion > 0.1) {
1334
+ level = InfoLogLevel::WARN_LEVEL;
1335
+ } else if (lost_portion > 0.01) {
1336
+ int report_percent = static_cast<int>(lost_portion * 100.0);
1337
+ if (Random::GetTLSInstance()->PercentTrue(report_percent)) {
1338
+ level = InfoLogLevel::WARN_LEVEL;
1339
+ }
1340
+ } else {
1341
+ // don't report
1342
+ report = false;
1343
+ }
1344
+ if (report) {
1345
+ ROCKS_LOG_AT_LEVEL(
1346
+ info_log, level,
1347
+ "HyperClockCache@%p unable to use estimated %.1f%% capacity because "
1348
+ "of "
1349
+ "full occupancy in %d/%u cache shards (estimated_entry_charge too "
1350
+ "high). Recommend estimated_entry_charge=%zu",
1351
+ this, lost_portion * 100.0, over_count, (unsigned)shard_count,
1352
+ min_recommendation);
1353
+ }
1354
+ } else if (average_load_factor < kLowSpecLoadFactor) {
1355
+ // Out of spec => Consider reporting load factor too low
1356
+ // But cautiously because low is not as big of a problem.
1357
+
1358
+ // Only report if highest occupancy shard is also below
1359
+ // spec and only if average is substantially out of spec
1360
+ if (predicted_load_factors.back() < kLowSpecLoadFactor &&
1361
+ average_load_factor < kLowSpecLoadFactor / 1.414) {
1362
+ InfoLogLevel level = InfoLogLevel::INFO_LEVEL;
1363
+ if (average_load_factor < kLowSpecLoadFactor / 2) {
1364
+ level = InfoLogLevel::WARN_LEVEL;
1365
+ }
1366
+ ROCKS_LOG_AT_LEVEL(
1367
+ info_log, level,
1368
+ "HyperClockCache@%p table has low occupancy at full capacity. Higher "
1369
+ "estimated_entry_charge (about %.1fx) would likely improve "
1370
+ "performance. Recommend estimated_entry_charge=%zu",
1371
+ this, kMidSpecLoadFactor / average_load_factor, min_recommendation);
1372
+ }
1373
+ }
1374
+ }
1375
+
1230
1376
  } // namespace clock_cache
1231
1377
 
1232
1378
  // DEPRECATED (see public API)
@@ -32,7 +32,8 @@ namespace clock_cache {
32
32
  // Forward declaration of friend class.
33
33
  class ClockCacheTest;
34
34
 
35
- // HyperClockCache is an experimental alternative to LRUCache.
35
+ // HyperClockCache is an alternative to LRUCache specifically tailored for
36
+ // use as BlockBasedTableOptions::block_cache
36
37
  //
37
38
  // Benefits
38
39
  // --------
@@ -439,6 +440,8 @@ class HyperClockTable {
439
440
  return occupancy_.load(std::memory_order_relaxed);
440
441
  }
441
442
 
443
+ size_t GetOccupancyLimit() const { return occupancy_limit_; }
444
+
442
445
  size_t GetUsage() const { return usage_.load(std::memory_order_relaxed); }
443
446
 
444
447
  size_t GetDetachedUsage() const {
@@ -611,12 +614,18 @@ class ALIGN_AS(CACHE_LINE_SIZE) ClockCacheShard final : public CacheShardBase {
611
614
 
612
615
  void Erase(const Slice& key, const UniqueId64x2& hashed_key);
613
616
 
617
+ size_t GetCapacity() const;
618
+
614
619
  size_t GetUsage() const;
615
620
 
621
+ size_t GetDetachedUsage() const;
622
+
616
623
  size_t GetPinnedUsage() const;
617
624
 
618
625
  size_t GetOccupancyCount() const;
619
626
 
627
+ size_t GetOccupancyLimit() const;
628
+
620
629
  size_t GetTableAddressCount() const;
621
630
 
622
631
  void ApplyToSomeEntries(
@@ -682,6 +691,9 @@ class HyperClockCache
682
691
  size_t GetCharge(Handle* handle) const override;
683
692
 
684
693
  DeleterFn GetDeleter(Handle* handle) const override;
694
+
695
+ void ReportProblems(
696
+ const std::shared_ptr<Logger>& /*info_log*/) const override;
685
697
  }; // class HyperClockCache
686
698
 
687
699
  } // namespace clock_cache