@nxtedition/rocksdb 7.0.24 → 7.0.25

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 (146) hide show
  1. package/binding.cc +3 -1
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +5 -0
  3. package/deps/rocksdb/rocksdb/Makefile +6 -2
  4. package/deps/rocksdb/rocksdb/TARGETS +14 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +4 -1
  6. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +20 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +2 -2
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +44 -31
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +491 -722
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +468 -2
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -1
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +51 -52
  13. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +28 -16
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +12 -1
  15. package/deps/rocksdb/rocksdb/cache/lru_cache.h +1 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +170 -36
  17. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -1
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +63 -36
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +4 -6
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +57 -38
  21. package/deps/rocksdb/rocksdb/db/blob/blob_read_request.h +58 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +164 -74
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +42 -29
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +419 -62
  25. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +208 -8
  26. package/deps/rocksdb/rocksdb/db/c.cc +68 -0
  27. package/deps/rocksdb/rocksdb/db/c_test.c +95 -2
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +12 -3
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +92 -15
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +76 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +52 -1
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +30 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +126 -0
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +203 -1584
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +93 -26
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +87 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +314 -0
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +328 -0
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -6
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +4 -1
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +7 -3
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +174 -33
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +474 -7
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -2
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +825 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +46 -0
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +42 -0
  48. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +223 -0
  49. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +255 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +1253 -0
  51. package/deps/rocksdb/rocksdb/db/corruption_test.cc +32 -8
  52. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3 -1
  53. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -8
  54. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +376 -0
  55. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +103 -78
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +4 -6
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +0 -8
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +10 -3
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +21 -6
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +19 -1
  61. package/deps/rocksdb/rocksdb/db/db_iter.cc +91 -14
  62. package/deps/rocksdb/rocksdb/db/db_iter.h +5 -0
  63. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +33 -0
  64. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +79 -0
  65. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +2 -0
  66. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  67. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +5 -2
  68. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +185 -0
  69. package/deps/rocksdb/rocksdb/db/dbformat.cc +1 -4
  70. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -8
  71. package/deps/rocksdb/rocksdb/db/internal_stats.cc +71 -29
  72. package/deps/rocksdb/rocksdb/db/internal_stats.h +160 -5
  73. package/deps/rocksdb/rocksdb/db/log_reader.cc +29 -3
  74. package/deps/rocksdb/rocksdb/db/log_reader.h +12 -3
  75. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -3
  76. package/deps/rocksdb/rocksdb/db/version_edit.cc +6 -0
  77. package/deps/rocksdb/rocksdb/db/version_set.cc +93 -129
  78. package/deps/rocksdb/rocksdb/db/version_set.h +4 -4
  79. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -2
  80. package/deps/rocksdb/rocksdb/db/version_set_test.cc +42 -35
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +10 -2
  82. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +4 -1
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +10 -4
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -3
  85. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -2
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +5 -1
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +140 -8
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +12 -0
  90. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +46 -7
  91. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +7 -0
  92. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +27 -7
  93. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +8 -0
  94. package/deps/rocksdb/rocksdb/env/env_posix.cc +14 -0
  95. package/deps/rocksdb/rocksdb/env/env_test.cc +130 -1
  96. package/deps/rocksdb/rocksdb/env/fs_posix.cc +7 -1
  97. package/deps/rocksdb/rocksdb/env/io_posix.cc +18 -50
  98. package/deps/rocksdb/rocksdb/env/io_posix.h +53 -6
  99. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +8 -10
  100. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +3 -7
  101. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +239 -259
  102. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +84 -19
  103. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +24 -4
  104. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +1 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +31 -1
  106. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +11 -7
  107. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +2 -0
  108. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +14 -0
  109. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +20 -0
  110. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +37 -13
  111. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +7 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +14 -0
  113. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +9 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +13 -13
  115. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -2
  116. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +38 -0
  117. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +7 -1
  118. package/deps/rocksdb/rocksdb/port/win/env_win.cc +17 -0
  119. package/deps/rocksdb/rocksdb/port/win/env_win.h +8 -0
  120. package/deps/rocksdb/rocksdb/port/win/io_win.cc +6 -3
  121. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  122. package/deps/rocksdb/rocksdb/src.mk +5 -0
  123. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -2
  124. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
  125. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +5 -2
  126. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +1 -1
  127. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +15 -12
  128. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +5 -4
  129. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  130. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1 -1
  131. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -4
  132. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +1 -2
  133. package/deps/rocksdb/rocksdb/table/get_context.cc +1 -0
  134. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -2
  135. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +24 -4
  136. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  137. package/deps/rocksdb/rocksdb/util/compression.h +2 -0
  138. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +18 -1
  139. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +67 -4
  140. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +8 -0
  141. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +15 -12
  142. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -2
  143. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +1 -1
  144. package/deps/rocksdb/rocksdb.gyp +5 -1
  145. package/package.json +1 -1
  146. package/prebuilds/darwin-arm64/node.napi.node +0 -0
@@ -1818,6 +1818,85 @@ TEST_F(DBPropertiesTest, MinObsoleteSstNumberToKeep) {
1818
1818
  ASSERT_TRUE(listener->Validated());
1819
1819
  }
1820
1820
 
1821
+ TEST_F(DBPropertiesTest, BlobCacheProperties) {
1822
+ Options options;
1823
+ uint64_t value;
1824
+
1825
+ options.env = CurrentOptions().env;
1826
+
1827
+ // Test with empty blob cache.
1828
+ constexpr size_t kCapacity = 100;
1829
+ LRUCacheOptions co;
1830
+ co.capacity = kCapacity;
1831
+ co.num_shard_bits = 0;
1832
+ co.metadata_charge_policy = kDontChargeCacheMetadata;
1833
+ auto blob_cache = NewLRUCache(co);
1834
+ options.blob_cache = blob_cache;
1835
+
1836
+ Reopen(options);
1837
+
1838
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheCapacity, &value));
1839
+ ASSERT_EQ(kCapacity, value);
1840
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheUsage, &value));
1841
+ ASSERT_EQ(0, value);
1842
+ ASSERT_TRUE(
1843
+ db_->GetIntProperty(DB::Properties::kBlobCachePinnedUsage, &value));
1844
+ ASSERT_EQ(0, value);
1845
+
1846
+ // Insert unpinned blob to the cache and check size.
1847
+ constexpr size_t kSize1 = 70;
1848
+ ASSERT_OK(blob_cache->Insert("blob1", nullptr /*value*/, kSize1,
1849
+ nullptr /*deleter*/));
1850
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheCapacity, &value));
1851
+ ASSERT_EQ(kCapacity, value);
1852
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheUsage, &value));
1853
+ ASSERT_EQ(kSize1, value);
1854
+ ASSERT_TRUE(
1855
+ db_->GetIntProperty(DB::Properties::kBlobCachePinnedUsage, &value));
1856
+ ASSERT_EQ(0, value);
1857
+
1858
+ // Insert pinned blob to the cache and check size.
1859
+ constexpr size_t kSize2 = 60;
1860
+ Cache::Handle* blob2 = nullptr;
1861
+ ASSERT_OK(blob_cache->Insert("blob2", nullptr /*value*/, kSize2,
1862
+ nullptr /*deleter*/, &blob2));
1863
+ ASSERT_NE(nullptr, blob2);
1864
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheCapacity, &value));
1865
+ ASSERT_EQ(kCapacity, value);
1866
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheUsage, &value));
1867
+ // blob1 is evicted.
1868
+ ASSERT_EQ(kSize2, value);
1869
+ ASSERT_TRUE(
1870
+ db_->GetIntProperty(DB::Properties::kBlobCachePinnedUsage, &value));
1871
+ ASSERT_EQ(kSize2, value);
1872
+
1873
+ // Insert another pinned blob to make the cache over-sized.
1874
+ constexpr size_t kSize3 = 80;
1875
+ Cache::Handle* blob3 = nullptr;
1876
+ ASSERT_OK(blob_cache->Insert("blob3", nullptr /*value*/, kSize3,
1877
+ nullptr /*deleter*/, &blob3));
1878
+ ASSERT_NE(nullptr, blob3);
1879
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheCapacity, &value));
1880
+ ASSERT_EQ(kCapacity, value);
1881
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheUsage, &value));
1882
+ ASSERT_EQ(kSize2 + kSize3, value);
1883
+ ASSERT_TRUE(
1884
+ db_->GetIntProperty(DB::Properties::kBlobCachePinnedUsage, &value));
1885
+ ASSERT_EQ(kSize2 + kSize3, value);
1886
+
1887
+ // Check size after release.
1888
+ blob_cache->Release(blob2);
1889
+ blob_cache->Release(blob3);
1890
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheCapacity, &value));
1891
+ ASSERT_EQ(kCapacity, value);
1892
+ ASSERT_TRUE(db_->GetIntProperty(DB::Properties::kBlobCacheUsage, &value));
1893
+ // blob2 will be evicted, while blob3 remain in cache after release.
1894
+ ASSERT_EQ(kSize3, value);
1895
+ ASSERT_TRUE(
1896
+ db_->GetIntProperty(DB::Properties::kBlobCachePinnedUsage, &value));
1897
+ ASSERT_EQ(0, value);
1898
+ }
1899
+
1821
1900
  TEST_F(DBPropertiesTest, BlockCacheProperties) {
1822
1901
  Options options;
1823
1902
  uint64_t value;
@@ -401,6 +401,7 @@ TEST_F(DBRangeDelTest, ValidLevelSubcompactionBoundaries) {
401
401
  options.num_levels = 3;
402
402
  options.target_file_size_base = kFileBytes;
403
403
  options.target_file_size_multiplier = 1;
404
+ options.max_compaction_bytes = 1500;
404
405
  Reopen(options);
405
406
 
406
407
  Random rnd(301);
@@ -1028,6 +1029,7 @@ TEST_F(DBRangeDelTest, CompactionTreatsSplitInputLevelDeletionAtomically) {
1028
1029
  options.memtable_factory.reset(
1029
1030
  test::NewSpecialSkipListFactory(2 /* num_entries_flush */));
1030
1031
  options.target_file_size_base = kValueBytes;
1032
+ options.max_compaction_bytes = 1500;
1031
1033
  // i == 0: CompactFiles
1032
1034
  // i == 1: CompactRange
1033
1035
  // i == 2: automatic compaction
@@ -2371,7 +2371,7 @@ TEST_F(DBTest2, MaxCompactionBytesTest) {
2371
2371
  GenerateNewRandomFile(&rnd);
2372
2372
  }
2373
2373
  CompactRangeOptions cro;
2374
- cro.bottommost_level_compaction = BottommostLevelCompaction::kForceOptimized;
2374
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
2375
2375
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
2376
2376
  ASSERT_EQ("0,0,8", FilesPerLevel(0));
2377
2377
 
@@ -1449,7 +1449,7 @@ TEST_P(DBWALTestWithParams, kAbsoluteConsistency) {
1449
1449
  // fill with new date
1450
1450
  RecoveryTestHelper::FillData(this, &options);
1451
1451
  // corrupt the wal
1452
- RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1452
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .33,
1453
1453
  /*len%=*/.1, wal_file_id, trunc);
1454
1454
  // verify
1455
1455
  options.wal_recovery_mode = WALRecoveryMode::kAbsoluteConsistency;
@@ -1602,7 +1602,10 @@ TEST_P(DBWALTestWithParams, kPointInTimeRecovery) {
1602
1602
  const size_t row_count = RecoveryTestHelper::FillData(this, &options);
1603
1603
 
1604
1604
  // Corrupt the wal
1605
- RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .3,
1605
+ // The offset here was 0.3 which cuts off right at the end of a
1606
+ // valid fragment after wal zstd compression checksum is enabled,
1607
+ // so changed the value to 0.33.
1608
+ RecoveryTestHelper::CorruptWAL(this, options, corrupt_offset * .33,
1606
1609
  /*len%=*/.1, wal_file_id, trunc);
1607
1610
 
1608
1611
  // Verify
@@ -1065,6 +1065,191 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
1065
1065
  Close();
1066
1066
  }
1067
1067
 
1068
+ TEST_F(DBBasicTestWithTimestamp, BackwardIterateLowerTsBound) {
1069
+ constexpr int kNumKeysPerFile = 128;
1070
+ constexpr uint64_t kMaxKey = 1024;
1071
+ Options options = CurrentOptions();
1072
+ options.env = env_;
1073
+ options.create_if_missing = true;
1074
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1075
+ TestComparator test_cmp(kTimestampSize);
1076
+ options.comparator = &test_cmp;
1077
+ options.memtable_factory.reset(
1078
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
1079
+ DestroyAndReopen(options);
1080
+ const std::vector<std::string> write_timestamps = {Timestamp(1, 0),
1081
+ Timestamp(3, 0)};
1082
+ const std::vector<std::string> read_timestamps = {Timestamp(2, 0),
1083
+ Timestamp(4, 0)};
1084
+ const std::vector<std::string> read_timestamps_lb = {Timestamp(1, 0),
1085
+ Timestamp(1, 0)};
1086
+ for (size_t i = 0; i < write_timestamps.size(); ++i) {
1087
+ WriteOptions write_opts;
1088
+ for (uint64_t key = 0; key <= kMaxKey; ++key) {
1089
+ Status s = db_->Put(write_opts, Key1(key), write_timestamps[i],
1090
+ "value" + std::to_string(i));
1091
+ ASSERT_OK(s);
1092
+ }
1093
+ }
1094
+ for (size_t i = 0; i < read_timestamps.size(); ++i) {
1095
+ ReadOptions read_opts;
1096
+ Slice read_ts = read_timestamps[i];
1097
+ Slice read_ts_lb = read_timestamps_lb[i];
1098
+ read_opts.timestamp = &read_ts;
1099
+ read_opts.iter_start_ts = &read_ts_lb;
1100
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
1101
+ int count = 0;
1102
+ uint64_t key = 0;
1103
+ for (it->SeekForPrev(Key1(kMaxKey)), key = kMaxKey; it->Valid();
1104
+ it->Prev(), ++count, --key) {
1105
+ CheckIterEntry(it.get(), Key1(key), kTypeValue, "value0",
1106
+ write_timestamps[0]);
1107
+ if (i > 0) {
1108
+ it->Prev();
1109
+ CheckIterEntry(it.get(), Key1(key), kTypeValue, "value1",
1110
+ write_timestamps[1]);
1111
+ }
1112
+ }
1113
+ size_t expected_count = kMaxKey + 1;
1114
+ ASSERT_EQ(expected_count, count);
1115
+ }
1116
+ // Delete all keys@ts=5 and check iteration result with start ts set
1117
+ {
1118
+ std::string write_timestamp = Timestamp(5, 0);
1119
+ WriteOptions write_opts;
1120
+ for (uint64_t key = 0; key < kMaxKey + 1; ++key) {
1121
+ Status s = db_->Delete(write_opts, Key1(key), write_timestamp);
1122
+ ASSERT_OK(s);
1123
+ }
1124
+
1125
+ std::string read_timestamp = Timestamp(6, 0);
1126
+ ReadOptions read_opts;
1127
+ Slice read_ts = read_timestamp;
1128
+ read_opts.timestamp = &read_ts;
1129
+ std::string read_timestamp_lb = Timestamp(2, 0);
1130
+ Slice read_ts_lb = read_timestamp_lb;
1131
+ read_opts.iter_start_ts = &read_ts_lb;
1132
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
1133
+ int count = 0;
1134
+ uint64_t key = kMaxKey;
1135
+ for (it->SeekForPrev(Key1(key)), key = kMaxKey; it->Valid();
1136
+ it->Prev(), ++count, --key) {
1137
+ CheckIterEntry(it.get(), Key1(key), kTypeValue, "value1",
1138
+ Timestamp(3, 0));
1139
+ it->Prev();
1140
+ CheckIterEntry(it.get(), Key1(key), kTypeDeletionWithTimestamp, Slice(),
1141
+ write_timestamp);
1142
+ }
1143
+ ASSERT_EQ(kMaxKey + 1, count);
1144
+ }
1145
+ Close();
1146
+ }
1147
+
1148
+ TEST_F(DBBasicTestWithTimestamp, SimpleBackwardIterateLowerTsBound) {
1149
+ Options options = CurrentOptions();
1150
+ options.env = env_;
1151
+ options.create_if_missing = true;
1152
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1153
+ TestComparator test_cmp(kTimestampSize);
1154
+ options.comparator = &test_cmp;
1155
+ DestroyAndReopen(options);
1156
+
1157
+ std::string ts_ub_buf = Timestamp(5, 0);
1158
+ Slice ts_ub = ts_ub_buf;
1159
+ std::string ts_lb_buf = Timestamp(1, 0);
1160
+ Slice ts_lb = ts_lb_buf;
1161
+
1162
+ {
1163
+ ReadOptions read_opts;
1164
+ read_opts.timestamp = &ts_ub;
1165
+ read_opts.iter_start_ts = &ts_lb;
1166
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
1167
+ it->SeekToLast();
1168
+ ASSERT_FALSE(it->Valid());
1169
+ ASSERT_OK(it->status());
1170
+
1171
+ it->SeekForPrev("foo");
1172
+ ASSERT_FALSE(it->Valid());
1173
+ ASSERT_OK(it->status());
1174
+ }
1175
+
1176
+ // Test iterate_upper_bound
1177
+ ASSERT_OK(db_->Put(WriteOptions(), "a", Timestamp(0, 0), "v0"));
1178
+ ASSERT_OK(db_->SingleDelete(WriteOptions(), "a", Timestamp(1, 0)));
1179
+
1180
+ for (int i = 0; i < 5; ++i) {
1181
+ ASSERT_OK(db_->Put(WriteOptions(), "b", Timestamp(i, 0),
1182
+ "v" + std::to_string(i)));
1183
+ }
1184
+
1185
+ {
1186
+ ReadOptions read_opts;
1187
+ read_opts.timestamp = &ts_ub;
1188
+ read_opts.iter_start_ts = &ts_lb;
1189
+ std::string key_ub_str = "b"; // exclusive
1190
+ Slice key_ub = key_ub_str;
1191
+ read_opts.iterate_upper_bound = &key_ub;
1192
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
1193
+ it->SeekToLast();
1194
+ CheckIterEntry(it.get(), "a", kTypeSingleDeletion, Slice(),
1195
+ Timestamp(1, 0));
1196
+
1197
+ key_ub_str = "a"; // exclusive
1198
+ key_ub = key_ub_str;
1199
+ read_opts.iterate_upper_bound = &key_ub;
1200
+ it.reset(db_->NewIterator(read_opts));
1201
+ it->SeekToLast();
1202
+ ASSERT_FALSE(it->Valid());
1203
+ ASSERT_OK(it->status());
1204
+ }
1205
+
1206
+ Close();
1207
+ }
1208
+
1209
+ TEST_F(DBBasicTestWithTimestamp, BackwardIterateLowerTsBound_Reseek) {
1210
+ Options options = CurrentOptions();
1211
+ options.env = env_;
1212
+ options.create_if_missing = true;
1213
+ options.max_sequential_skip_in_iterations = 2;
1214
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1215
+ TestComparator test_cmp(kTimestampSize);
1216
+ options.comparator = &test_cmp;
1217
+ DestroyAndReopen(options);
1218
+
1219
+ for (int i = 0; i < 10; ++i) {
1220
+ ASSERT_OK(db_->Put(WriteOptions(), "a", Timestamp(i, 0),
1221
+ "v" + std::to_string(i)));
1222
+ }
1223
+
1224
+ for (int i = 0; i < 10; ++i) {
1225
+ ASSERT_OK(db_->Put(WriteOptions(), "b", Timestamp(i, 0),
1226
+ "v" + std::to_string(i)));
1227
+ }
1228
+
1229
+ {
1230
+ std::string ts_ub_buf = Timestamp(6, 0);
1231
+ Slice ts_ub = ts_ub_buf;
1232
+ std::string ts_lb_buf = Timestamp(4, 0);
1233
+ Slice ts_lb = ts_lb_buf;
1234
+
1235
+ ReadOptions read_opts;
1236
+ read_opts.timestamp = &ts_ub;
1237
+ read_opts.iter_start_ts = &ts_lb;
1238
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
1239
+ it->SeekToLast();
1240
+ for (int i = 0; i < 3 && it->Valid(); it->Prev(), ++i) {
1241
+ CheckIterEntry(it.get(), "b", kTypeValue, "v" + std::to_string(4 + i),
1242
+ Timestamp(4 + i, 0));
1243
+ }
1244
+ for (int i = 0; i < 3 && it->Valid(); it->Prev(), ++i) {
1245
+ CheckIterEntry(it.get(), "a", kTypeValue, "v" + std::to_string(4 + i),
1246
+ Timestamp(4 + i, 0));
1247
+ }
1248
+ }
1249
+
1250
+ Close();
1251
+ }
1252
+
1068
1253
  TEST_F(DBBasicTestWithTimestamp, ReseekToTargetTimestamp) {
1069
1254
  Options options = CurrentOptions();
1070
1255
  options.env = env_;
@@ -117,10 +117,7 @@ std::string InternalKey::DebugString(bool hex) const {
117
117
  }
118
118
 
119
119
  const char* InternalKeyComparator::Name() const {
120
- if (name_.empty()) {
121
- return "rocksdb.anonymous.InternalKeyComparator";
122
- }
123
- return name_.c_str();
120
+ return "rocksdb.anonymous.InternalKeyComparator";
124
121
  }
125
122
 
126
123
  int InternalKeyComparator::Compare(const ParsedInternalKey& a,
@@ -238,7 +238,6 @@ class InternalKeyComparator
238
238
  : public Comparator {
239
239
  private:
240
240
  UserComparatorWrapper user_comparator_;
241
- std::string name_;
242
241
 
243
242
  public:
244
243
  // `InternalKeyComparator`s constructed with the default constructor are not
@@ -250,13 +249,8 @@ class InternalKeyComparator
250
249
  // this constructor to precompute the result of `Name()`. To avoid this
251
250
  // overhead, set `named` to false. In that case, `Name()` will return a
252
251
  // generic name that is non-specific to the underlying comparator.
253
- explicit InternalKeyComparator(const Comparator* c, bool named = true)
254
- : Comparator(c->timestamp_size()), user_comparator_(c) {
255
- if (named) {
256
- name_ = "rocksdb.InternalKeyComparator:" +
257
- std::string(user_comparator_.Name());
258
- }
259
- }
252
+ explicit InternalKeyComparator(const Comparator* c)
253
+ : Comparator(c->timestamp_size()), user_comparator_(c) {}
260
254
  virtual ~InternalKeyComparator() {}
261
255
 
262
256
  virtual const char* Name() const override;
@@ -307,6 +307,9 @@ static const std::string total_blob_file_size = "total-blob-file-size";
307
307
  static const std::string live_blob_file_size = "live-blob-file-size";
308
308
  static const std::string live_blob_file_garbage_size =
309
309
  "live-blob-file-garbage-size";
310
+ static const std::string blob_cache_capacity = "blob-cache-capacity";
311
+ static const std::string blob_cache_usage = "blob-cache-usage";
312
+ static const std::string blob_cache_pinned_usage = "blob-cache-pinned-usage";
310
313
 
311
314
  const std::string DB::Properties::kNumFilesAtLevelPrefix =
312
315
  rocksdb_prefix + num_files_at_level_prefix;
@@ -409,6 +412,12 @@ const std::string DB::Properties::kLiveBlobFileSize =
409
412
  rocksdb_prefix + live_blob_file_size;
410
413
  const std::string DB::Properties::kLiveBlobFileGarbageSize =
411
414
  rocksdb_prefix + live_blob_file_garbage_size;
415
+ const std::string DB::Properties::kBlobCacheCapacity =
416
+ rocksdb_prefix + blob_cache_capacity;
417
+ const std::string DB::Properties::kBlobCacheUsage =
418
+ rocksdb_prefix + blob_cache_usage;
419
+ const std::string DB::Properties::kBlobCachePinnedUsage =
420
+ rocksdb_prefix + blob_cache_pinned_usage;
412
421
 
413
422
  const UnorderedMap<std::string, DBPropertyInfo>
414
423
  InternalStats::ppt_name_to_info = {
@@ -570,6 +579,15 @@ const UnorderedMap<std::string, DBPropertyInfo>
570
579
  {DB::Properties::kLiveBlobFileGarbageSize,
571
580
  {false, nullptr, &InternalStats::HandleLiveBlobFileGarbageSize,
572
581
  nullptr, nullptr}},
582
+ {DB::Properties::kBlobCacheCapacity,
583
+ {false, nullptr, &InternalStats::HandleBlobCacheCapacity, nullptr,
584
+ nullptr}},
585
+ {DB::Properties::kBlobCacheUsage,
586
+ {false, nullptr, &InternalStats::HandleBlobCacheUsage, nullptr,
587
+ nullptr}},
588
+ {DB::Properties::kBlobCachePinnedUsage,
589
+ {false, nullptr, &InternalStats::HandleBlobCachePinnedUsage, nullptr,
590
+ nullptr}},
573
591
  };
574
592
 
575
593
  InternalStats::InternalStats(int num_levels, SystemClock* clock,
@@ -585,10 +603,8 @@ InternalStats::InternalStats(int num_levels, SystemClock* clock,
585
603
  clock_(clock),
586
604
  cfd_(cfd),
587
605
  started_at_(clock->NowMicros()) {
588
- Cache* block_cache = nullptr;
589
- bool ok = GetBlockCacheForStats(&block_cache);
590
- if (ok) {
591
- assert(block_cache);
606
+ Cache* block_cache = GetBlockCacheForStats();
607
+ if (block_cache) {
592
608
  // Extract or create stats collector. Could fail in rare cases.
593
609
  Status s = CacheEntryStatsCollector<CacheEntryRoleStats>::GetShared(
594
610
  block_cache, clock_, &cache_entry_stats_collector_);
@@ -597,8 +613,6 @@ InternalStats::InternalStats(int num_levels, SystemClock* clock,
597
613
  } else {
598
614
  assert(!cache_entry_stats_collector_);
599
615
  }
600
- } else {
601
- assert(!block_cache);
602
616
  }
603
617
  }
604
618
 
@@ -851,6 +865,40 @@ bool InternalStats::HandleLiveBlobFileGarbageSize(uint64_t* value,
851
865
  return true;
852
866
  }
853
867
 
868
+ Cache* InternalStats::GetBlobCacheForStats() {
869
+ return cfd_->ioptions()->blob_cache.get();
870
+ }
871
+
872
+ bool InternalStats::HandleBlobCacheCapacity(uint64_t* value, DBImpl* /*db*/,
873
+ Version* /*version*/) {
874
+ Cache* blob_cache = GetBlobCacheForStats();
875
+ if (blob_cache) {
876
+ *value = static_cast<uint64_t>(blob_cache->GetCapacity());
877
+ return true;
878
+ }
879
+ return false;
880
+ }
881
+
882
+ bool InternalStats::HandleBlobCacheUsage(uint64_t* value, DBImpl* /*db*/,
883
+ Version* /*version*/) {
884
+ Cache* blob_cache = GetBlobCacheForStats();
885
+ if (blob_cache) {
886
+ *value = static_cast<uint64_t>(blob_cache->GetUsage());
887
+ return true;
888
+ }
889
+ return false;
890
+ }
891
+
892
+ bool InternalStats::HandleBlobCachePinnedUsage(uint64_t* value, DBImpl* /*db*/,
893
+ Version* /*version*/) {
894
+ Cache* blob_cache = GetBlobCacheForStats();
895
+ if (blob_cache) {
896
+ *value = static_cast<uint64_t>(blob_cache->GetPinnedUsage());
897
+ return true;
898
+ }
899
+ return false;
900
+ }
901
+
854
902
  const DBPropertyInfo* GetPropertyInfo(const Slice& property) {
855
903
  std::string ppt_name = GetPropertyNameAndArg(property).first.ToString();
856
904
  auto ppt_info_iter = InternalStats::ppt_name_to_info.find(ppt_name);
@@ -1313,46 +1361,40 @@ bool InternalStats::HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* /*db*/,
1313
1361
  return *value > 0 && *value < std::numeric_limits<uint64_t>::max();
1314
1362
  }
1315
1363
 
1316
- bool InternalStats::GetBlockCacheForStats(Cache** block_cache) {
1317
- assert(block_cache != nullptr);
1364
+ Cache* InternalStats::GetBlockCacheForStats() {
1318
1365
  auto* table_factory = cfd_->ioptions()->table_factory.get();
1319
1366
  assert(table_factory != nullptr);
1320
- *block_cache =
1321
- table_factory->GetOptions<Cache>(TableFactory::kBlockCacheOpts());
1322
- return *block_cache != nullptr;
1367
+ return table_factory->GetOptions<Cache>(TableFactory::kBlockCacheOpts());
1323
1368
  }
1324
1369
 
1325
1370
  bool InternalStats::HandleBlockCacheCapacity(uint64_t* value, DBImpl* /*db*/,
1326
1371
  Version* /*version*/) {
1327
- Cache* block_cache;
1328
- bool ok = GetBlockCacheForStats(&block_cache);
1329
- if (!ok) {
1330
- return false;
1372
+ Cache* block_cache = GetBlockCacheForStats();
1373
+ if (block_cache) {
1374
+ *value = static_cast<uint64_t>(block_cache->GetCapacity());
1375
+ return true;
1331
1376
  }
1332
- *value = static_cast<uint64_t>(block_cache->GetCapacity());
1333
- return true;
1377
+ return false;
1334
1378
  }
1335
1379
 
1336
1380
  bool InternalStats::HandleBlockCacheUsage(uint64_t* value, DBImpl* /*db*/,
1337
1381
  Version* /*version*/) {
1338
- Cache* block_cache;
1339
- bool ok = GetBlockCacheForStats(&block_cache);
1340
- if (!ok) {
1341
- return false;
1382
+ Cache* block_cache = GetBlockCacheForStats();
1383
+ if (block_cache) {
1384
+ *value = static_cast<uint64_t>(block_cache->GetUsage());
1385
+ return true;
1342
1386
  }
1343
- *value = static_cast<uint64_t>(block_cache->GetUsage());
1344
- return true;
1387
+ return false;
1345
1388
  }
1346
1389
 
1347
1390
  bool InternalStats::HandleBlockCachePinnedUsage(uint64_t* value, DBImpl* /*db*/,
1348
1391
  Version* /*version*/) {
1349
- Cache* block_cache;
1350
- bool ok = GetBlockCacheForStats(&block_cache);
1351
- if (!ok) {
1352
- return false;
1392
+ Cache* block_cache = GetBlockCacheForStats();
1393
+ if (block_cache) {
1394
+ *value = static_cast<uint64_t>(block_cache->GetPinnedUsage());
1395
+ return true;
1353
1396
  }
1354
- *value = static_cast<uint64_t>(block_cache->GetPinnedUsage());
1355
- return true;
1397
+ return false;
1356
1398
  }
1357
1399
 
1358
1400
  void InternalStats::DumpDBMapStats(