@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.
Files changed (67) hide show
  1. package/binding.cc +32 -14
  2. package/deps/rocksdb/rocksdb/cache/cache.cc +4 -0
  3. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +6 -8
  4. package/deps/rocksdb/rocksdb/cache/cache_key.cc +184 -164
  5. package/deps/rocksdb/rocksdb/cache/cache_key.h +38 -29
  6. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +4 -4
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +4 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +11 -9
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +1 -1
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +28 -18
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +86 -17
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +48 -8
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +356 -153
  14. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +3 -7
  15. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +4 -5
  16. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +2 -3
  17. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +12 -4
  18. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +69 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +6 -1
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -1
  21. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +222 -182
  22. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +239 -23
  23. package/deps/rocksdb/rocksdb/db/db_test2.cc +6 -2
  24. package/deps/rocksdb/rocksdb/db/event_helpers.cc +2 -1
  25. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +6 -0
  26. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -0
  27. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  28. package/deps/rocksdb/rocksdb/db/kv_checksum.h +8 -4
  29. package/deps/rocksdb/rocksdb/db/memtable.cc +173 -33
  30. package/deps/rocksdb/rocksdb/db/memtable.h +10 -0
  31. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -1
  32. package/deps/rocksdb/rocksdb/db/version_set.cc +37 -18
  33. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -1
  34. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  35. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +6 -0
  36. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2 -0
  37. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +15 -0
  38. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +31 -6
  39. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/options/cf_options.cc +4 -0
  41. package/deps/rocksdb/rocksdb/options/cf_options.h +4 -0
  42. package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -0
  43. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  44. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -6
  45. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +1 -0
  46. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +2 -4
  47. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -7
  48. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -1
  49. package/deps/rocksdb/rocksdb/table/unique_id.cc +22 -24
  50. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +2 -1
  51. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +7 -0
  52. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +27 -3
  53. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -1
  54. package/deps/rocksdb/rocksdb/util/async_file_reader.h +3 -3
  55. package/deps/rocksdb/rocksdb/util/coro_utils.h +2 -1
  56. package/deps/rocksdb/rocksdb/util/hash_test.cc +67 -0
  57. package/deps/rocksdb/rocksdb/util/math.h +41 -0
  58. package/deps/rocksdb/rocksdb/util/math128.h +6 -0
  59. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +2 -1
  60. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +3 -6
  61. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +5 -0
  62. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +6 -0
  63. package/index.js +15 -6
  64. package/package.json +1 -1
  65. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  66. package/prebuilds/darwin-x64/node.napi.node +0 -0
  67. 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
- // The blob file during flush is unknown to be exactly how big it is.
403
- // Therefore, we set the file size to kMaxOffsetStandardEncoding. For any
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::LOW;
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::LOW;
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::LOW,
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