@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.
- package/binding.cc +3 -1
- package/deps/rocksdb/rocksdb/CMakeLists.txt +5 -0
- package/deps/rocksdb/rocksdb/Makefile +6 -2
- package/deps/rocksdb/rocksdb/TARGETS +14 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +4 -1
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +20 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +44 -31
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +491 -722
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +468 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +51 -52
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +28 -16
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +12 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +1 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +170 -36
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +63 -36
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +4 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +57 -38
- package/deps/rocksdb/rocksdb/db/blob/blob_read_request.h +58 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +164 -74
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +42 -29
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +419 -62
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +208 -8
- package/deps/rocksdb/rocksdb/db/c.cc +68 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +95 -2
- package/deps/rocksdb/rocksdb/db/column_family.cc +12 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +92 -15
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +76 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +52 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +30 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +126 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +203 -1584
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +93 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +87 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +314 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +328 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +7 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +174 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +474 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +825 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +46 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +42 -0
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +223 -0
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +255 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +1253 -0
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +32 -8
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -8
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +376 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +103 -78
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +4 -6
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +0 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +10 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +21 -6
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +19 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +91 -14
- package/deps/rocksdb/rocksdb/db/db_iter.h +5 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +33 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +79 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +5 -2
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +185 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +1 -4
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -8
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +71 -29
- package/deps/rocksdb/rocksdb/db/internal_stats.h +160 -5
- package/deps/rocksdb/rocksdb/db/log_reader.cc +29 -3
- package/deps/rocksdb/rocksdb/db/log_reader.h +12 -3
- package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/version_edit.cc +6 -0
- package/deps/rocksdb/rocksdb/db/version_set.cc +93 -129
- package/deps/rocksdb/rocksdb/db/version_set.h +4 -4
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +42 -35
- package/deps/rocksdb/rocksdb/db/write_batch.cc +10 -2
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +10 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +5 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +140 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +12 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +46 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +27 -7
- package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/env/env_posix.cc +14 -0
- package/deps/rocksdb/rocksdb/env/env_test.cc +130 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +7 -1
- package/deps/rocksdb/rocksdb/env/io_posix.cc +18 -50
- package/deps/rocksdb/rocksdb/env/io_posix.h +53 -6
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +8 -10
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +3 -7
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +239 -259
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +84 -19
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +24 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +31 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +11 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +37 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +13 -13
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -2
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +38 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +7 -1
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +17 -0
- package/deps/rocksdb/rocksdb/port/win/env_win.h +8 -0
- package/deps/rocksdb/rocksdb/port/win/io_win.cc +6 -3
- package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/src.mk +5 -0
- package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +15 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +5 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +1 -2
- package/deps/rocksdb/rocksdb/table/get_context.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +24 -4
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/util/compression.h +2 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +18 -1
- package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +67 -4
- package/deps/rocksdb/rocksdb/util/threadpool_imp.h +8 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +15 -12
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -2
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb.gyp +5 -1
- package/package.json +1 -1
- 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::
|
|
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 * .
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
589
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1329
|
-
|
|
1330
|
-
return
|
|
1372
|
+
Cache* block_cache = GetBlockCacheForStats();
|
|
1373
|
+
if (block_cache) {
|
|
1374
|
+
*value = static_cast<uint64_t>(block_cache->GetCapacity());
|
|
1375
|
+
return true;
|
|
1331
1376
|
}
|
|
1332
|
-
|
|
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
|
-
|
|
1340
|
-
|
|
1341
|
-
return
|
|
1382
|
+
Cache* block_cache = GetBlockCacheForStats();
|
|
1383
|
+
if (block_cache) {
|
|
1384
|
+
*value = static_cast<uint64_t>(block_cache->GetUsage());
|
|
1385
|
+
return true;
|
|
1342
1386
|
}
|
|
1343
|
-
|
|
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
|
-
|
|
1351
|
-
|
|
1352
|
-
return
|
|
1392
|
+
Cache* block_cache = GetBlockCacheForStats();
|
|
1393
|
+
if (block_cache) {
|
|
1394
|
+
*value = static_cast<uint64_t>(block_cache->GetPinnedUsage());
|
|
1395
|
+
return true;
|
|
1353
1396
|
}
|
|
1354
|
-
|
|
1355
|
-
return true;
|
|
1397
|
+
return false;
|
|
1356
1398
|
}
|
|
1357
1399
|
|
|
1358
1400
|
void InternalStats::DumpDBMapStats(
|