@nxtedition/rocksdb 7.0.25 → 7.0.28

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 (120) hide show
  1. package/binding.cc +9 -2
  2. package/chained-batch.js +1 -1
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -0
  4. package/deps/rocksdb/rocksdb/Makefile +3 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +17 -7
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +1 -0
  9. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +117 -0
  10. package/deps/rocksdb/rocksdb/cache/charged_cache.h +121 -0
  11. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +270 -180
  12. package/deps/rocksdb/rocksdb/cache/clock_cache.h +412 -124
  13. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +1 -0
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +1 -1
  15. package/deps/rocksdb/rocksdb/cache/lru_cache.h +2 -2
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +71 -9
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +11 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +21 -14
  21. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +68 -7
  22. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +16 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +519 -12
  24. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +120 -0
  25. package/deps/rocksdb/rocksdb/db/builder.cc +15 -5
  26. package/deps/rocksdb/rocksdb/db/builder.h +3 -0
  27. package/deps/rocksdb/rocksdb/db/c.cc +18 -0
  28. package/deps/rocksdb/rocksdb/db/c_test.c +18 -0
  29. package/deps/rocksdb/rocksdb/db/column_family.h +2 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +3 -2
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +9 -4
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +15 -10
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +36 -34
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +50 -13
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +12 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +2 -1
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -17
  39. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +26 -9
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +0 -11
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +93 -0
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +16 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3 -8
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -1
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +17 -5
  46. package/deps/rocksdb/rocksdb/db/db_test.cc +0 -3
  47. package/deps/rocksdb/rocksdb/db/db_test2.cc +39 -12
  48. package/deps/rocksdb/rocksdb/db/db_test_util.cc +9 -0
  49. package/deps/rocksdb/rocksdb/db/db_test_util.h +2 -0
  50. package/deps/rocksdb/rocksdb/db/dbformat.cc +0 -38
  51. package/deps/rocksdb/rocksdb/db/dbformat.h +14 -13
  52. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +5 -2
  53. package/deps/rocksdb/rocksdb/db/event_helpers.cc +13 -1
  54. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +0 -10
  55. package/deps/rocksdb/rocksdb/db/flush_job.cc +19 -15
  56. package/deps/rocksdb/rocksdb/db/flush_job.h +7 -0
  57. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +21 -15
  58. package/deps/rocksdb/rocksdb/db/forward_iterator.h +4 -3
  59. package/deps/rocksdb/rocksdb/db/memtable_list.cc +9 -0
  60. package/deps/rocksdb/rocksdb/db/memtable_list.h +5 -0
  61. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +53 -12
  62. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +14 -2
  63. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +10 -10
  64. package/deps/rocksdb/rocksdb/db/repair.cc +8 -6
  65. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +890 -0
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +324 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +186 -0
  68. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -0
  69. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +13 -4
  70. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +23 -2
  71. package/deps/rocksdb/rocksdb/env/env_test.cc +74 -1
  72. package/deps/rocksdb/rocksdb/env/io_posix.cc +11 -8
  73. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +28 -0
  74. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +14 -1
  75. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +4 -4
  76. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +30 -23
  77. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1 -1
  78. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +3 -13
  79. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +5 -0
  80. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +1 -2
  81. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -0
  82. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  83. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  84. package/deps/rocksdb/rocksdb/options/cf_options.cc +14 -1
  85. package/deps/rocksdb/rocksdb/options/cf_options.h +5 -0
  86. package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -56
  87. package/deps/rocksdb/rocksdb/options/db_options.cc +4 -5
  88. package/deps/rocksdb/rocksdb/options/options.cc +11 -1
  89. package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -0
  90. package/deps/rocksdb/rocksdb/options/options_helper.h +4 -0
  91. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +4 -0
  92. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -0
  93. package/deps/rocksdb/rocksdb/src.mk +3 -0
  94. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +6 -1
  95. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +4 -0
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +36 -3
  97. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +36 -1
  98. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +14 -3
  99. package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
  100. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +6 -0
  101. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +5 -0
  102. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +3 -0
  103. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -7
  104. package/deps/rocksdb/rocksdb/table/table_builder.h +7 -3
  105. package/deps/rocksdb/rocksdb/table/table_properties.cc +9 -0
  106. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +3 -2
  107. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +58 -30
  108. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  109. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +20 -0
  110. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +29 -154
  111. package/deps/rocksdb/rocksdb/util/rate_limiter.h +16 -34
  112. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +0 -92
  113. package/deps/rocksdb/rocksdb/util/timer.h +6 -0
  114. package/deps/rocksdb/rocksdb/util/vector_iterator.h +4 -3
  115. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -45
  116. package/deps/rocksdb/rocksdb/utilities/debug.cc +40 -0
  117. package/deps/rocksdb/rocksdb.gyp +2 -0
  118. package/package.json +1 -1
  119. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  120. package/{deps/rocksdb/rocksdb/prebuilds → prebuilds}/linux-x64/node.napi.node +0 -0
package/binding.cc CHANGED
@@ -14,6 +14,7 @@
14
14
  #include <rocksdb/slice_transform.h>
15
15
  #include <rocksdb/table.h>
16
16
  #include <rocksdb/write_batch.h>
17
+ #include <rocksdb/merge_operator.h>
17
18
 
18
19
  #include <array>
19
20
  #include <memory>
@@ -701,6 +702,8 @@ struct OpenWorker final : public Worker {
701
702
 
702
703
  template <typename T, typename U>
703
704
  rocksdb::Status InitOptions(napi_env env, T& columnOptions, const U& options) {
705
+ rocksdb::ConfigOptions configOptions;
706
+
704
707
  const auto memtable_memory_budget = Uint32Property(env, options, "memtableMemoryBudget").value_or(256 * 1024 * 1024);
705
708
 
706
709
  const auto compaction = StringProperty(env, options, "compaction").value_or("level");
@@ -746,18 +749,22 @@ rocksdb::Status InitOptions(napi_env env, T& columnOptions, const U& options) {
746
749
 
747
750
  const auto prefixExtractorOpt = StringProperty(env, options, "prefixExtractor");
748
751
  if (prefixExtractorOpt) {
749
- rocksdb::ConfigOptions configOptions;
750
752
  ROCKS_STATUS_RETURN(
751
753
  rocksdb::SliceTransform::CreateFromString(configOptions, *prefixExtractorOpt, &columnOptions.prefix_extractor));
752
754
  }
753
755
 
754
756
  const auto comparatorOpt = StringProperty(env, options, "comparator");
755
757
  if (comparatorOpt) {
756
- rocksdb::ConfigOptions configOptions;
757
758
  ROCKS_STATUS_RETURN(
758
759
  rocksdb::Comparator::CreateFromString(configOptions, *comparatorOpt, &columnOptions.comparator));
759
760
  }
760
761
 
762
+ const auto mergeOperatorOpt = StringProperty(env, options, "mergeOperator");
763
+ if (mergeOperatorOpt) {
764
+ ROCKS_STATUS_RETURN(
765
+ rocksdb::MergeOperator::CreateFromString(configOptions, *mergeOperatorOpt, &columnOptions.merge_operator));
766
+ }
767
+
761
768
  const auto cacheSize = Uint32Property(env, options, "cacheSize").value_or(8 << 20);
762
769
 
763
770
  rocksdb::BlockBasedTableOptions tableOptions;
package/chained-batch.js CHANGED
@@ -44,7 +44,7 @@ class ChainedBatch extends AbstractChainedBatch {
44
44
  binding.batch_put_log_data(this[kDbContext], this[kBatchContext], data, options)
45
45
  }
46
46
 
47
- merge (key, value, options) {
47
+ merge (key, value, options = {}) {
48
48
  // TODO (fix): Check if open...
49
49
  binding.batch_merge(this[kDbContext], this[kBatchContext], key, value, options)
50
50
  }
@@ -598,6 +598,7 @@ set(SOURCES
598
598
  cache/cache_entry_roles.cc
599
599
  cache/cache_key.cc
600
600
  cache/cache_reservation_manager.cc
601
+ cache/charged_cache.cc
601
602
  cache/clock_cache.cc
602
603
  cache/compressed_secondary_cache.cc
603
604
  cache/fast_lru_cache.cc
@@ -670,6 +671,7 @@ set(SOURCES
670
671
  db/range_del_aggregator.cc
671
672
  db/range_tombstone_fragmenter.cc
672
673
  db/repair.cc
674
+ db/seqno_to_time_mapping.cc
673
675
  db/snapshot_impl.cc
674
676
  db/table_cache.cc
675
677
  db/table_properties_collector.cc
@@ -1296,6 +1298,7 @@ if(WITH_TESTS)
1296
1298
  db/perf_context_test.cc
1297
1299
  db/periodic_work_scheduler_test.cc
1298
1300
  db/plain_table_db_test.cc
1301
+ db/seqno_time_test.cc
1299
1302
  db/prefix_test.cc
1300
1303
  db/range_del_aggregator_test.cc
1301
1304
  db/range_tombstone_fragmenter_test.cc
@@ -1504,6 +1504,9 @@ db_table_properties_test: $(OBJ_DIR)/db/db_table_properties_test.o $(TEST_LIBRAR
1504
1504
  log_write_bench: $(OBJ_DIR)/util/log_write_bench.o $(TEST_LIBRARY) $(LIBRARY)
1505
1505
  $(AM_LINK) $(PROFILING_FLAGS)
1506
1506
 
1507
+ seqno_time_test: $(OBJ_DIR)/db/seqno_time_test.o $(TEST_LIBRARY) $(LIBRARY)
1508
+ $(AM_LINK)
1509
+
1507
1510
  plain_table_db_test: $(OBJ_DIR)/db/plain_table_db_test.o $(TEST_LIBRARY) $(LIBRARY)
1508
1511
  $(AM_LINK)
1509
1512
 
@@ -13,6 +13,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
13
13
  "cache/cache_entry_roles.cc",
14
14
  "cache/cache_key.cc",
15
15
  "cache/cache_reservation_manager.cc",
16
+ "cache/charged_cache.cc",
16
17
  "cache/clock_cache.cc",
17
18
  "cache/compressed_secondary_cache.cc",
18
19
  "cache/fast_lru_cache.cc",
@@ -85,6 +86,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
85
86
  "db/range_del_aggregator.cc",
86
87
  "db/range_tombstone_fragmenter.cc",
87
88
  "db/repair.cc",
89
+ "db/seqno_to_time_mapping.cc",
88
90
  "db/snapshot_impl.cc",
89
91
  "db/table_cache.cc",
90
92
  "db/table_properties_collector.cc",
@@ -347,6 +349,7 @@ cpp_library_wrapper(name="rocksdb_whole_archive_lib", srcs=[
347
349
  "cache/cache_entry_roles.cc",
348
350
  "cache/cache_key.cc",
349
351
  "cache/cache_reservation_manager.cc",
352
+ "cache/charged_cache.cc",
350
353
  "cache/clock_cache.cc",
351
354
  "cache/compressed_secondary_cache.cc",
352
355
  "cache/fast_lru_cache.cc",
@@ -419,6 +422,7 @@ cpp_library_wrapper(name="rocksdb_whole_archive_lib", srcs=[
419
422
  "db/range_del_aggregator.cc",
420
423
  "db/range_tombstone_fragmenter.cc",
421
424
  "db/repair.cc",
425
+ "db/seqno_to_time_mapping.cc",
422
426
  "db/snapshot_impl.cc",
423
427
  "db/table_cache.cc",
424
428
  "db/table_properties_collector.cc",
@@ -5688,6 +5692,12 @@ cpp_unittest_wrapper(name="ribbon_test",
5688
5692
  extra_compiler_flags=[])
5689
5693
 
5690
5694
 
5695
+ cpp_unittest_wrapper(name="seqno_time_test",
5696
+ srcs=["db/seqno_time_test.cc"],
5697
+ deps=[":rocksdb_test_lib"],
5698
+ extra_compiler_flags=[])
5699
+
5700
+
5691
5701
  cpp_unittest_wrapper(name="sim_cache_test",
5692
5702
  srcs=["utilities/simulator_cache/sim_cache_test.cc"],
5693
5703
  deps=[":rocksdb_test_lib"],
@@ -74,6 +74,11 @@ DEFINE_uint32(
74
74
  DEFINE_uint32(gather_stats_entries_per_lock, 256,
75
75
  "For Cache::ApplyToAllEntries");
76
76
  DEFINE_bool(skewed, false, "If true, skew the key access distribution");
77
+
78
+ DEFINE_bool(lean, false,
79
+ "If true, no additional computation is performed besides cache "
80
+ "operations.");
81
+
77
82
  #ifndef ROCKSDB_LITE
78
83
  DEFINE_string(secondary_cache_uri, "",
79
84
  "Full URI for creating a custom secondary cache object");
@@ -522,7 +527,6 @@ class CacheBench {
522
527
  StopWatchNano timer(clock);
523
528
 
524
529
  for (uint64_t i = 0; i < FLAGS_ops_per_thread; i++) {
525
- timer.Start();
526
530
  Slice key = gen.GetRand(thread->rnd, max_key_, max_log_);
527
531
  uint64_t random_op = thread->rnd.Next();
528
532
  Cache::CreateCallback create_cb = [](const void* buf, size_t size,
@@ -534,6 +538,8 @@ class CacheBench {
534
538
  return Status::OK();
535
539
  };
536
540
 
541
+ timer.Start();
542
+
537
543
  if (random_op < lookup_insert_threshold_) {
538
544
  if (handle) {
539
545
  cache_->Release(handle);
@@ -543,9 +549,11 @@ class CacheBench {
543
549
  handle = cache_->Lookup(key, &helper2, create_cb, Cache::Priority::LOW,
544
550
  true);
545
551
  if (handle) {
546
- // do something with the data
547
- result += NPHash64(static_cast<char*>(cache_->Value(handle)),
548
- FLAGS_value_bytes);
552
+ if (!FLAGS_lean) {
553
+ // do something with the data
554
+ result += NPHash64(static_cast<char*>(cache_->Value(handle)),
555
+ FLAGS_value_bytes);
556
+ }
549
557
  } else {
550
558
  // do insert
551
559
  Status s = cache_->Insert(key, createValue(thread->rnd), &helper2,
@@ -570,9 +578,11 @@ class CacheBench {
570
578
  handle = cache_->Lookup(key, &helper2, create_cb, Cache::Priority::LOW,
571
579
  true);
572
580
  if (handle) {
573
- // do something with the data
574
- result += NPHash64(static_cast<char*>(cache_->Value(handle)),
575
- FLAGS_value_bytes);
581
+ if (!FLAGS_lean) {
582
+ // do something with the data
583
+ result += NPHash64(static_cast<char*>(cache_->Value(handle)),
584
+ FLAGS_value_bytes);
585
+ }
576
586
  }
577
587
  } else if (random_op < erase_threshold_) {
578
588
  // do erase
@@ -23,6 +23,7 @@ std::array<std::string, kNumCacheEntryRoles> kCacheEntryRoleToCamelString{{
23
23
  "FilterConstruction",
24
24
  "BlockBasedTableReader",
25
25
  "FileMetadata",
26
+ "BlobCache",
26
27
  "Misc",
27
28
  }};
28
29
 
@@ -38,6 +39,7 @@ std::array<std::string, kNumCacheEntryRoles> kCacheEntryRoleToHyphenString{{
38
39
  "filter-construction",
39
40
  "block-based-table-reader",
40
41
  "file-metadata",
42
+ "blob-cache",
41
43
  "misc",
42
44
  }};
43
45
 
@@ -181,4 +181,5 @@ template class CacheReservationManagerImpl<CacheEntryRole::kFilterConstruction>;
181
181
  template class CacheReservationManagerImpl<CacheEntryRole::kMisc>;
182
182
  template class CacheReservationManagerImpl<CacheEntryRole::kWriteBuffer>;
183
183
  template class CacheReservationManagerImpl<CacheEntryRole::kFileMetadata>;
184
+ template class CacheReservationManagerImpl<CacheEntryRole::kBlobCache>;
184
185
  } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,117 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "cache/charged_cache.h"
7
+
8
+ #include "cache/cache_reservation_manager.h"
9
+
10
+ namespace ROCKSDB_NAMESPACE {
11
+
12
+ ChargedCache::ChargedCache(std::shared_ptr<Cache> cache,
13
+ std::shared_ptr<Cache> block_cache)
14
+ : cache_(cache),
15
+ cache_res_mgr_(std::make_shared<ConcurrentCacheReservationManager>(
16
+ std::make_shared<
17
+ CacheReservationManagerImpl<CacheEntryRole::kBlobCache>>(
18
+ block_cache))) {}
19
+
20
+ Status ChargedCache::Insert(const Slice& key, void* value, size_t charge,
21
+ DeleterFn deleter, Handle** handle,
22
+ Priority priority) {
23
+ Status s = cache_->Insert(key, value, charge, deleter, handle, priority);
24
+ if (s.ok()) {
25
+ // Insert may cause the cache entry eviction if the cache is full. So we
26
+ // directly call the reservation manager to update the total memory used
27
+ // in the cache.
28
+ assert(cache_res_mgr_);
29
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
30
+ .PermitUncheckedError();
31
+ }
32
+ return s;
33
+ }
34
+
35
+ Status ChargedCache::Insert(const Slice& key, void* value,
36
+ const CacheItemHelper* helper, size_t charge,
37
+ Handle** handle, Priority priority) {
38
+ Status s = cache_->Insert(key, value, helper, charge, handle, priority);
39
+ if (s.ok()) {
40
+ // Insert may cause the cache entry eviction if the cache is full. So we
41
+ // directly call the reservation manager to update the total memory used
42
+ // in the cache.
43
+ assert(cache_res_mgr_);
44
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
45
+ .PermitUncheckedError();
46
+ }
47
+ return s;
48
+ }
49
+
50
+ Cache::Handle* ChargedCache::Lookup(const Slice& key, Statistics* stats) {
51
+ return cache_->Lookup(key, stats);
52
+ }
53
+
54
+ Cache::Handle* ChargedCache::Lookup(const Slice& key,
55
+ const CacheItemHelper* helper,
56
+ const CreateCallback& create_cb,
57
+ Priority priority, bool wait,
58
+ Statistics* stats) {
59
+ auto handle = cache_->Lookup(key, helper, create_cb, priority, wait, stats);
60
+ // Lookup may promote the KV pair from the secondary cache to the primary
61
+ // cache. So we directly call the reservation manager to update the total
62
+ // memory used in the cache.
63
+ assert(cache_res_mgr_);
64
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
65
+ .PermitUncheckedError();
66
+ return handle;
67
+ }
68
+
69
+ bool ChargedCache::Release(Cache::Handle* handle, bool useful,
70
+ bool erase_if_last_ref) {
71
+ size_t memory_used_delta = cache_->GetUsage(handle);
72
+ bool erased = cache_->Release(handle, useful, erase_if_last_ref);
73
+ if (erased) {
74
+ assert(cache_res_mgr_);
75
+ cache_res_mgr_
76
+ ->UpdateCacheReservation(memory_used_delta, /* increase */ false)
77
+ .PermitUncheckedError();
78
+ }
79
+ return erased;
80
+ }
81
+
82
+ bool ChargedCache::Release(Cache::Handle* handle, bool erase_if_last_ref) {
83
+ size_t memory_used_delta = cache_->GetUsage(handle);
84
+ bool erased = cache_->Release(handle, erase_if_last_ref);
85
+ if (erased) {
86
+ assert(cache_res_mgr_);
87
+ cache_res_mgr_
88
+ ->UpdateCacheReservation(memory_used_delta, /* increase */ false)
89
+ .PermitUncheckedError();
90
+ }
91
+ return erased;
92
+ }
93
+
94
+ void ChargedCache::Erase(const Slice& key) {
95
+ cache_->Erase(key);
96
+ assert(cache_res_mgr_);
97
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
98
+ .PermitUncheckedError();
99
+ }
100
+
101
+ void ChargedCache::EraseUnRefEntries() {
102
+ cache_->EraseUnRefEntries();
103
+ assert(cache_res_mgr_);
104
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
105
+ .PermitUncheckedError();
106
+ }
107
+
108
+ void ChargedCache::SetCapacity(size_t capacity) {
109
+ cache_->SetCapacity(capacity);
110
+ // SetCapacity can result in evictions when the cache capacity is decreased,
111
+ // so we would want to update the cache reservation here as well.
112
+ assert(cache_res_mgr_);
113
+ cache_res_mgr_->UpdateCacheReservation(cache_->GetUsage())
114
+ .PermitUncheckedError();
115
+ }
116
+
117
+ } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,121 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #pragma once
7
+
8
+ #include <string>
9
+
10
+ #include "port/port.h"
11
+ #include "rocksdb/cache.h"
12
+
13
+ namespace ROCKSDB_NAMESPACE {
14
+
15
+ class ConcurrentCacheReservationManager;
16
+
17
+ // A cache interface which wraps around another cache and takes care of
18
+ // reserving space in block cache towards a single global memory limit, and
19
+ // forwards all the calls to the underlying cache.
20
+ class ChargedCache : public Cache {
21
+ public:
22
+ ChargedCache(std::shared_ptr<Cache> cache,
23
+ std::shared_ptr<Cache> block_cache);
24
+ ~ChargedCache() override = default;
25
+
26
+ Status Insert(const Slice& key, void* value, size_t charge, DeleterFn deleter,
27
+ Handle** handle, Priority priority) override;
28
+ Status Insert(const Slice& key, void* value, const CacheItemHelper* helper,
29
+ size_t charge, Handle** handle = nullptr,
30
+ Priority priority = Priority::LOW) override;
31
+
32
+ Cache::Handle* Lookup(const Slice& key, Statistics* stats) override;
33
+ Cache::Handle* Lookup(const Slice& key, const CacheItemHelper* helper,
34
+ const CreateCallback& create_cb, Priority priority,
35
+ bool wait, Statistics* stats = nullptr) override;
36
+
37
+ bool Release(Cache::Handle* handle, bool useful,
38
+ bool erase_if_last_ref = false) override;
39
+ bool Release(Cache::Handle* handle, bool erase_if_last_ref = false) override;
40
+
41
+ void Erase(const Slice& key) override;
42
+ void EraseUnRefEntries() override;
43
+
44
+ static const char* kClassName() { return "ChargedCache"; }
45
+ const char* Name() const override { return kClassName(); }
46
+
47
+ uint64_t NewId() override { return cache_->NewId(); }
48
+
49
+ void SetCapacity(size_t capacity) override;
50
+
51
+ void SetStrictCapacityLimit(bool strict_capacity_limit) override {
52
+ cache_->SetStrictCapacityLimit(strict_capacity_limit);
53
+ }
54
+
55
+ bool HasStrictCapacityLimit() const override {
56
+ return cache_->HasStrictCapacityLimit();
57
+ }
58
+
59
+ void* Value(Cache::Handle* handle) override { return cache_->Value(handle); }
60
+
61
+ bool IsReady(Cache::Handle* handle) override {
62
+ return cache_->IsReady(handle);
63
+ }
64
+
65
+ void Wait(Cache::Handle* handle) override { cache_->Wait(handle); }
66
+
67
+ void WaitAll(std::vector<Handle*>& handles) override {
68
+ cache_->WaitAll(handles);
69
+ }
70
+
71
+ bool Ref(Cache::Handle* handle) override { return cache_->Ref(handle); }
72
+
73
+ size_t GetCapacity() const override { return cache_->GetCapacity(); }
74
+
75
+ size_t GetUsage() const override { return cache_->GetUsage(); }
76
+
77
+ size_t GetUsage(Cache::Handle* handle) const override {
78
+ return cache_->GetUsage(handle);
79
+ }
80
+
81
+ size_t GetPinnedUsage() const override { return cache_->GetPinnedUsage(); }
82
+
83
+ size_t GetCharge(Cache::Handle* handle) const override {
84
+ return cache_->GetCharge(handle);
85
+ }
86
+
87
+ Cache::DeleterFn GetDeleter(Cache::Handle* handle) const override {
88
+ return cache_->GetDeleter(handle);
89
+ }
90
+
91
+ void ApplyToAllEntries(
92
+ const std::function<void(const Slice& key, void* value, size_t charge,
93
+ Cache::DeleterFn deleter)>& callback,
94
+ const Cache::ApplyToAllEntriesOptions& opts) override {
95
+ cache_->ApplyToAllEntries(callback, opts);
96
+ }
97
+
98
+ void ApplyToAllCacheEntries(void (*callback)(void* value, size_t charge),
99
+ bool thread_safe) override {
100
+ cache_->ApplyToAllCacheEntries(callback, thread_safe);
101
+ }
102
+
103
+ std::string GetPrintableOptions() const override {
104
+ return cache_->GetPrintableOptions();
105
+ }
106
+
107
+ void DisownData() override { return cache_->DisownData(); }
108
+
109
+ inline Cache* GetCache() const { return cache_.get(); }
110
+
111
+ inline ConcurrentCacheReservationManager* TEST_GetCacheReservationManager()
112
+ const {
113
+ return cache_res_mgr_.get();
114
+ }
115
+
116
+ private:
117
+ std::shared_ptr<Cache> cache_;
118
+ std::shared_ptr<ConcurrentCacheReservationManager> cache_res_mgr_;
119
+ };
120
+
121
+ } // namespace ROCKSDB_NAMESPACE