@nxtedition/rocksdb 7.1.5 → 7.1.8
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 +32 -14
- package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
- package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +4 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +11 -9
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +1 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +28 -18
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +86 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +356 -153
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +69 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -1
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +222 -182
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
- package/deps/rocksdb/rocksdb/db/db_test2.cc +6 -2
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +6 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
- package/deps/rocksdb/rocksdb/db/memtable.cc +173 -33
- package/deps/rocksdb/rocksdb/db/memtable.h +10 -0
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_set.cc +37 -18
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/options/cf_options.cc +4 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +4 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +2 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -1
- package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +27 -3
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
- package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
- package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
- package/deps/rocksdb/rocksdb/util/math.h +41 -0
- package/deps/rocksdb/rocksdb/util/math128.h +6 -0
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
- package/index.js +15 -6
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -399,16 +399,12 @@ Status BlobFileBuilder::PutBlobIntoCacheIfNeeded(const Slice& blob,
|
|
|
399
399
|
creation_reason_ == BlobFileCreationReason::kFlush;
|
|
400
400
|
|
|
401
401
|
if (blob_cache && warm_cache) {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
// max_offset <= this value, the same encoding scheme is guaranteed.
|
|
405
|
-
const OffsetableCacheKey base_cache_key(
|
|
406
|
-
db_id_, db_session_id_, blob_file_number,
|
|
407
|
-
OffsetableCacheKey::kMaxOffsetStandardEncoding);
|
|
402
|
+
const OffsetableCacheKey base_cache_key(db_id_, db_session_id_,
|
|
403
|
+
blob_file_number);
|
|
408
404
|
const CacheKey cache_key = base_cache_key.WithOffset(blob_offset);
|
|
409
405
|
const Slice key = cache_key.AsSlice();
|
|
410
406
|
|
|
411
|
-
const Cache::Priority priority = Cache::Priority::
|
|
407
|
+
const Cache::Priority priority = Cache::Priority::BOTTOM;
|
|
412
408
|
|
|
413
409
|
// Objects to be put into the cache have to be heap-allocated and
|
|
414
410
|
// self-contained, i.e. own their contents. The Cache has to be able to
|
|
@@ -70,7 +70,7 @@ Status BlobSource::PutBlobIntoCache(const Slice& cache_key,
|
|
|
70
70
|
assert(blob_cache_);
|
|
71
71
|
|
|
72
72
|
Status s;
|
|
73
|
-
const Cache::Priority priority = Cache::Priority::
|
|
73
|
+
const Cache::Priority priority = Cache::Priority::BOTTOM;
|
|
74
74
|
|
|
75
75
|
// Objects to be put into the cache have to be heap-allocated and
|
|
76
76
|
// self-contained, i.e. own their contents. The Cache has to be able to take
|
|
@@ -108,7 +108,7 @@ Cache::Handle* BlobSource::GetEntryFromCache(const Slice& key) const {
|
|
|
108
108
|
return Status::OK();
|
|
109
109
|
};
|
|
110
110
|
cache_handle = blob_cache_->Lookup(key, GetCacheItemHelper(), create_cb,
|
|
111
|
-
Cache::Priority::
|
|
111
|
+
Cache::Priority::BOTTOM,
|
|
112
112
|
true /* wait_for_cache */, statistics_);
|
|
113
113
|
} else {
|
|
114
114
|
cache_handle = blob_cache_->Lookup(key, statistics_);
|
|
@@ -286,7 +286,7 @@ void BlobSource::MultiGetBlob(const ReadOptions& read_options,
|
|
|
286
286
|
|
|
287
287
|
void BlobSource::MultiGetBlobFromOneFile(const ReadOptions& read_options,
|
|
288
288
|
uint64_t file_number,
|
|
289
|
-
uint64_t file_size
|
|
289
|
+
uint64_t /*file_size*/,
|
|
290
290
|
autovector<BlobReadRequest>& blob_reqs,
|
|
291
291
|
uint64_t* bytes_read) {
|
|
292
292
|
const size_t num_blobs = blob_reqs.size();
|
|
@@ -303,8 +303,7 @@ void BlobSource::MultiGetBlobFromOneFile(const ReadOptions& read_options,
|
|
|
303
303
|
Mask cache_hit_mask = 0;
|
|
304
304
|
|
|
305
305
|
uint64_t total_bytes = 0;
|
|
306
|
-
const OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number
|
|
307
|
-
file_size);
|
|
306
|
+
const OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number);
|
|
308
307
|
|
|
309
308
|
if (blob_cache_) {
|
|
310
309
|
size_t cached_blob_count = 0;
|
|
@@ -118,10 +118,9 @@ class BlobSource {
|
|
|
118
118
|
size_t charge, Cache::Handle** cache_handle,
|
|
119
119
|
Cache::Priority priority) const;
|
|
120
120
|
|
|
121
|
-
inline CacheKey GetCacheKey(uint64_t file_number, uint64_t file_size
|
|
121
|
+
inline CacheKey GetCacheKey(uint64_t file_number, uint64_t /*file_size*/,
|
|
122
122
|
uint64_t offset) const {
|
|
123
|
-
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number
|
|
124
|
-
file_size);
|
|
123
|
+
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number);
|
|
125
124
|
return base_cache_key.WithOffset(offset);
|
|
126
125
|
}
|
|
127
126
|
|
|
@@ -121,6 +121,8 @@ class BlobSourceTest : public DBTestBase {
|
|
|
121
121
|
co.capacity = 8 << 20;
|
|
122
122
|
co.num_shard_bits = 2;
|
|
123
123
|
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
124
|
+
co.high_pri_pool_ratio = 0.2;
|
|
125
|
+
co.low_pri_pool_ratio = 0.2;
|
|
124
126
|
options_.blob_cache = NewLRUCache(co);
|
|
125
127
|
options_.lowest_used_cache_tier = CacheTier::kVolatileTier;
|
|
126
128
|
|
|
@@ -1042,6 +1044,8 @@ class BlobSecondaryCacheTest : public DBTestBase {
|
|
|
1042
1044
|
lru_cache_ops_.num_shard_bits = 0;
|
|
1043
1045
|
lru_cache_ops_.strict_capacity_limit = true;
|
|
1044
1046
|
lru_cache_ops_.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
1047
|
+
lru_cache_ops_.high_pri_pool_ratio = 0.2;
|
|
1048
|
+
lru_cache_ops_.low_pri_pool_ratio = 0.2;
|
|
1045
1049
|
|
|
1046
1050
|
secondary_cache_opts_.capacity = 8 << 20; // 8 MB
|
|
1047
1051
|
secondary_cache_opts_.num_shard_bits = 0;
|
|
@@ -1168,8 +1172,7 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
|
|
|
1168
1172
|
ASSERT_TRUE(
|
|
1169
1173
|
blob_source.TEST_BlobInCache(file_number, file_size, blob_offsets[1]));
|
|
1170
1174
|
|
|
1171
|
-
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number
|
|
1172
|
-
file_size);
|
|
1175
|
+
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, file_number);
|
|
1173
1176
|
|
|
1174
1177
|
// blob_cache here only looks at the primary cache since we didn't provide
|
|
1175
1178
|
// the cache item helper for the secondary cache. However, since key0 is
|
|
@@ -1276,7 +1279,13 @@ class BlobSourceCacheReservationTest : public DBTestBase {
|
|
|
1276
1279
|
co.capacity = kCacheCapacity;
|
|
1277
1280
|
co.num_shard_bits = kNumShardBits;
|
|
1278
1281
|
co.metadata_charge_policy = kDontChargeCacheMetadata;
|
|
1282
|
+
|
|
1283
|
+
co.high_pri_pool_ratio = 0.0;
|
|
1284
|
+
co.low_pri_pool_ratio = 0.0;
|
|
1279
1285
|
std::shared_ptr<Cache> blob_cache = NewLRUCache(co);
|
|
1286
|
+
|
|
1287
|
+
co.high_pri_pool_ratio = 0.5;
|
|
1288
|
+
co.low_pri_pool_ratio = 0.5;
|
|
1280
1289
|
std::shared_ptr<Cache> block_cache = NewLRUCache(co);
|
|
1281
1290
|
|
|
1282
1291
|
options_.blob_cache = blob_cache;
|
|
@@ -1412,8 +1421,7 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
|
|
|
1412
1421
|
}
|
|
1413
1422
|
|
|
1414
1423
|
{
|
|
1415
|
-
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, kBlobFileNumber
|
|
1416
|
-
blob_file_size_);
|
|
1424
|
+
OffsetableCacheKey base_cache_key(db_id_, db_session_id_, kBlobFileNumber);
|
|
1417
1425
|
size_t blob_bytes = options_.blob_cache->GetUsage();
|
|
1418
1426
|
|
|
1419
1427
|
for (size_t i = 0; i < kNumBlobs; ++i) {
|
|
@@ -54,6 +54,26 @@ class FilterByKeyLength : public CompactionFilter {
|
|
|
54
54
|
size_t length_threshold_;
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
+
class FilterByValueLength : public CompactionFilter {
|
|
58
|
+
public:
|
|
59
|
+
explicit FilterByValueLength(size_t len) : length_threshold_(len) {}
|
|
60
|
+
const char* Name() const override {
|
|
61
|
+
return "rocksdb.compaction.filter.by.value.length";
|
|
62
|
+
}
|
|
63
|
+
CompactionFilter::Decision FilterV2(
|
|
64
|
+
int /*level*/, const Slice& /*key*/, ValueType /*value_type*/,
|
|
65
|
+
const Slice& existing_value, std::string* /*new_value*/,
|
|
66
|
+
std::string* /*skip_until*/) const override {
|
|
67
|
+
if (existing_value.size() < length_threshold_) {
|
|
68
|
+
return CompactionFilter::Decision::kRemove;
|
|
69
|
+
}
|
|
70
|
+
return CompactionFilter::Decision::kKeep;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private:
|
|
74
|
+
size_t length_threshold_;
|
|
75
|
+
};
|
|
76
|
+
|
|
57
77
|
class BadBlobCompactionFilter : public CompactionFilter {
|
|
58
78
|
public:
|
|
59
79
|
explicit BadBlobCompactionFilter(std::string prefix,
|
|
@@ -243,6 +263,55 @@ TEST_F(DBBlobCompactionTest, FilterByKeyLength) {
|
|
|
243
263
|
Close();
|
|
244
264
|
}
|
|
245
265
|
|
|
266
|
+
TEST_F(DBBlobCompactionTest, FilterByValueLength) {
|
|
267
|
+
Options options = GetDefaultOptions();
|
|
268
|
+
options.enable_blob_files = true;
|
|
269
|
+
options.min_blob_size = 5;
|
|
270
|
+
options.create_if_missing = true;
|
|
271
|
+
constexpr size_t kValueLength = 5;
|
|
272
|
+
std::unique_ptr<CompactionFilter> compaction_filter_guard(
|
|
273
|
+
new FilterByValueLength(kValueLength));
|
|
274
|
+
options.compaction_filter = compaction_filter_guard.get();
|
|
275
|
+
|
|
276
|
+
const std::vector<std::string> short_value_keys = {"a", "e", "j"};
|
|
277
|
+
constexpr char short_value[] = "val";
|
|
278
|
+
const std::vector<std::string> long_value_keys = {"b", "f", "k"};
|
|
279
|
+
constexpr char long_value[] = "valuevalue";
|
|
280
|
+
|
|
281
|
+
DestroyAndReopen(options);
|
|
282
|
+
for (size_t i = 0; i < short_value_keys.size(); ++i) {
|
|
283
|
+
ASSERT_OK(Put(short_value_keys[i], short_value));
|
|
284
|
+
}
|
|
285
|
+
for (size_t i = 0; i < short_value_keys.size(); ++i) {
|
|
286
|
+
ASSERT_OK(Put(long_value_keys[i], long_value));
|
|
287
|
+
}
|
|
288
|
+
ASSERT_OK(Flush());
|
|
289
|
+
CompactRangeOptions cro;
|
|
290
|
+
ASSERT_OK(db_->CompactRange(cro, /*begin=*/nullptr, /*end=*/nullptr));
|
|
291
|
+
std::string value;
|
|
292
|
+
for (size_t i = 0; i < short_value_keys.size(); ++i) {
|
|
293
|
+
ASSERT_TRUE(
|
|
294
|
+
db_->Get(ReadOptions(), short_value_keys[i], &value).IsNotFound());
|
|
295
|
+
value.clear();
|
|
296
|
+
}
|
|
297
|
+
for (size_t i = 0; i < long_value_keys.size(); ++i) {
|
|
298
|
+
ASSERT_OK(db_->Get(ReadOptions(), long_value_keys[i], &value));
|
|
299
|
+
ASSERT_EQ(long_value, value);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
#ifndef ROCKSDB_LITE
|
|
303
|
+
const auto& compaction_stats = GetCompactionStats();
|
|
304
|
+
ASSERT_GE(compaction_stats.size(), 2);
|
|
305
|
+
|
|
306
|
+
// Filter decides between kKeep and kRemove based on value;
|
|
307
|
+
// this involves reading but not writing blobs
|
|
308
|
+
ASSERT_GT(compaction_stats[1].bytes_read_blob, 0);
|
|
309
|
+
ASSERT_EQ(compaction_stats[1].bytes_written_blob, 0);
|
|
310
|
+
#endif // ROCKSDB_LITE
|
|
311
|
+
|
|
312
|
+
Close();
|
|
313
|
+
}
|
|
314
|
+
|
|
246
315
|
#ifndef ROCKSDB_LITE
|
|
247
316
|
TEST_F(DBBlobCompactionTest, BlobCompactWithStartingLevel) {
|
|
248
317
|
Options options = GetDefaultOptions();
|
|
@@ -222,7 +222,6 @@ bool CompactionIterator::InvokeFilterIfNeeded(bool* need_skip,
|
|
|
222
222
|
{
|
|
223
223
|
StopWatchNano timer(clock_, report_detailed_time_);
|
|
224
224
|
if (kTypeBlobIndex == ikey_.type) {
|
|
225
|
-
blob_value_.Reset();
|
|
226
225
|
filter = compaction_filter_->FilterBlobByKey(
|
|
227
226
|
level_, filter_key, &compaction_filter_value_,
|
|
228
227
|
compaction_filter_skip_until_.rep());
|
|
@@ -367,6 +366,7 @@ void CompactionIterator::NextFromInput() {
|
|
|
367
366
|
!IsShuttingDown()) {
|
|
368
367
|
key_ = input_.key();
|
|
369
368
|
value_ = input_.value();
|
|
369
|
+
blob_value_.Reset();
|
|
370
370
|
iter_stats_.num_input_records++;
|
|
371
371
|
|
|
372
372
|
Status pik_status = ParseInternalKey(key_, &ikey_, allow_data_in_errors_);
|
|
@@ -937,6 +937,11 @@ void CompactionIterator::NextFromInput() {
|
|
|
937
937
|
if (IsPausingManualCompaction()) {
|
|
938
938
|
status_ = Status::Incomplete(Status::SubCode::kManualCompactionPaused);
|
|
939
939
|
}
|
|
940
|
+
|
|
941
|
+
// Propagate corruption status from memtable itereator
|
|
942
|
+
if (!input_.Valid() && input_.status().IsCorruption()) {
|
|
943
|
+
status_ = input_.status();
|
|
944
|
+
}
|
|
940
945
|
}
|
|
941
946
|
|
|
942
947
|
bool CompactionIterator::ExtractLargeValueIfNeededImpl() {
|
|
@@ -1961,7 +1961,10 @@ void CompactionJob::LogCompaction() {
|
|
|
1961
1961
|
stream.EndArray();
|
|
1962
1962
|
}
|
|
1963
1963
|
stream << "score" << compaction->score() << "input_data_size"
|
|
1964
|
-
<< compaction->CalculateTotalInputSize()
|
|
1964
|
+
<< compaction->CalculateTotalInputSize() << "oldest_snapshot_seqno"
|
|
1965
|
+
<< (existing_snapshots_.empty()
|
|
1966
|
+
? int64_t{-1} // Use -1 for "none"
|
|
1967
|
+
: static_cast<int64_t>(existing_snapshots_[0]));
|
|
1965
1968
|
}
|
|
1966
1969
|
}
|
|
1967
1970
|
|