@nxtedition/rocksdb 7.1.4 → 7.1.5

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 (151) hide show
  1. package/deps/rocksdb/iostats.patch +19 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +15 -1
  3. package/deps/rocksdb/rocksdb/cache/cache_test.cc +93 -58
  4. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -40
  5. package/deps/rocksdb/rocksdb/cache/clock_cache.h +57 -32
  6. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +103 -28
  7. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +33 -1
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +177 -38
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +3 -1
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -2
  11. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +125 -71
  12. package/deps/rocksdb/rocksdb/crash_test.mk +15 -1
  13. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +2 -2
  14. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +1 -1
  15. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +3 -5
  16. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +25 -19
  17. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  18. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +36 -0
  19. package/deps/rocksdb/rocksdb/db/column_family.cc +2 -15
  20. package/deps/rocksdb/rocksdb/db/column_family_test.cc +17 -4
  21. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +8 -8
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +0 -7
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +50 -52
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +33 -11
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +41 -10
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1 -2
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +143 -2
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +43 -18
  30. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +48 -65
  31. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -0
  32. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +73 -4
  33. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +17 -8
  34. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +71 -2
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -33
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +18 -35
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +11 -5
  38. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +7 -7
  39. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +15 -8
  40. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +2 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +3 -1
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +11 -0
  43. package/deps/rocksdb/rocksdb/db/db_iter.cc +69 -11
  44. package/deps/rocksdb/rocksdb/db/db_iter.h +16 -0
  45. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -1
  46. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  47. package/deps/rocksdb/rocksdb/db/db_test.cc +61 -28
  48. package/deps/rocksdb/rocksdb/db/db_test2.cc +18 -7
  49. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -0
  50. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +61 -0
  51. package/deps/rocksdb/rocksdb/db/db_write_test.cc +130 -0
  52. package/deps/rocksdb/rocksdb/db/experimental.cc +7 -8
  53. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +1 -2
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -7
  55. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +7 -1
  56. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +4 -2
  57. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +1 -1
  58. package/deps/rocksdb/rocksdb/db/log_reader.cc +48 -11
  59. package/deps/rocksdb/rocksdb/db/log_reader.h +8 -2
  60. package/deps/rocksdb/rocksdb/db/log_test.cc +10 -1
  61. package/deps/rocksdb/rocksdb/db/log_writer.cc +7 -1
  62. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/memtable.cc +49 -14
  64. package/deps/rocksdb/rocksdb/db/memtable.h +60 -14
  65. package/deps/rocksdb/rocksdb/db/memtable_list.cc +14 -8
  66. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +30 -10
  67. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -5
  68. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +5 -0
  69. package/deps/rocksdb/rocksdb/db/repair.cc +2 -3
  70. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +3 -7
  71. package/deps/rocksdb/rocksdb/db/table_cache.cc +72 -0
  72. package/deps/rocksdb/rocksdb/db/table_cache.h +19 -1
  73. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +8 -14
  74. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +2 -2
  75. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +35 -64
  76. package/deps/rocksdb/rocksdb/db/version_edit.cc +3 -32
  77. package/deps/rocksdb/rocksdb/db/version_edit.h +2 -12
  78. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +10 -23
  79. package/deps/rocksdb/rocksdb/db/version_set.cc +34 -10
  80. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  81. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -6
  82. package/deps/rocksdb/rocksdb/db/version_set_test.cc +17 -15
  83. package/deps/rocksdb/rocksdb/db/wal_manager.cc +0 -4
  84. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +2 -1
  85. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +137 -42
  86. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +21 -0
  87. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +1 -0
  88. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  89. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +4 -4
  90. package/deps/rocksdb/rocksdb/db/write_thread.cc +51 -46
  91. package/deps/rocksdb/rocksdb/db/write_thread.h +0 -4
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +6 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +6 -0
  95. package/deps/rocksdb/rocksdb/env/env_posix.cc +1 -1
  96. package/deps/rocksdb/rocksdb/env/env_test.cc +38 -8
  97. package/deps/rocksdb/rocksdb/env/file_system.cc +20 -0
  98. package/deps/rocksdb/rocksdb/env/fs_posix.cc +2 -46
  99. package/deps/rocksdb/rocksdb/env/io_posix.cc +1 -0
  100. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -5
  101. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +7 -0
  102. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -1
  103. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +4 -0
  104. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +7 -0
  106. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +10 -3
  107. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +3 -1
  108. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +1 -1
  109. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +2 -0
  110. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +12 -0
  111. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +9 -13
  112. package/deps/rocksdb/rocksdb/logging/env_logger.h +39 -13
  113. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +1 -1
  114. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -1
  115. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +6 -0
  116. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -1
  117. package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -3
  118. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -5
  119. package/deps/rocksdb/rocksdb/options/options_helper.cc +2 -1
  120. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +1 -0
  121. package/deps/rocksdb/rocksdb/options/options_test.cc +4 -2
  122. package/deps/rocksdb/rocksdb/port/util_logger.h +1 -3
  123. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +50 -8
  124. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -0
  125. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +7 -0
  126. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +28 -10
  127. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -1
  128. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +5 -2
  129. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +1 -0
  130. package/deps/rocksdb/rocksdb/table/get_context.cc +16 -6
  131. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  132. package/deps/rocksdb/rocksdb/table/table_test.cc +2 -1
  133. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +14 -1
  134. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +5 -2
  135. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +7 -8
  136. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +6 -6
  137. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +2 -0
  139. package/deps/rocksdb/rocksdb/util/stderr_logger.h +13 -0
  140. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +55 -46
  141. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -1
  142. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +10 -0
  143. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -2
  144. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +2 -2
  145. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
  146. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2 -2
  147. package/index.js +2 -2
  148. package/package.json +1 -1
  149. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  150. package/prebuilds/linux-x64/node.napi.node +0 -0
  151. package/deps/rocksdb/rocksdb/logging/posix_logger.h +0 -179
@@ -207,6 +207,9 @@ TEST_F(LRUCacheTest, EntriesWithPriority) {
207
207
  ValidateLRUList({"e", "f", "g", "Z", "d"}, 2);
208
208
  }
209
209
 
210
+ // TODO: FastLRUCache and ClockCache use the same tests. We can probably remove
211
+ // them from FastLRUCache after ClockCache becomes productive, and we don't plan
212
+ // to use or maintain FastLRUCache any more.
210
213
  namespace fast_lru_cache {
211
214
 
212
215
  // TODO(guido) Replicate LRU policy tests from LRUCache here.
@@ -225,11 +228,11 @@ class FastLRUCacheTest : public testing::Test {
225
228
 
226
229
  void NewCache(size_t capacity) {
227
230
  DeleteCache();
228
- cache_ = reinterpret_cast<fast_lru_cache::LRUCacheShard*>(
229
- port::cacheline_aligned_alloc(sizeof(fast_lru_cache::LRUCacheShard)));
230
- new (cache_) fast_lru_cache::LRUCacheShard(
231
- capacity, 1 /*estimated_value_size*/, false /*strict_capacity_limit*/,
232
- kDontChargeCacheMetadata);
231
+ cache_ = reinterpret_cast<LRUCacheShard*>(
232
+ port::cacheline_aligned_alloc(sizeof(LRUCacheShard)));
233
+ new (cache_) LRUCacheShard(capacity, 1 /*estimated_value_size*/,
234
+ false /*strict_capacity_limit*/,
235
+ kDontChargeCacheMetadata);
233
236
  }
234
237
 
235
238
  Status Insert(const std::string& key) {
@@ -243,25 +246,23 @@ class FastLRUCacheTest : public testing::Test {
243
246
  size_t CalcEstimatedHandleChargeWrapper(
244
247
  size_t estimated_value_size,
245
248
  CacheMetadataChargePolicy metadata_charge_policy) {
246
- return fast_lru_cache::LRUCacheShard::CalcEstimatedHandleCharge(
247
- estimated_value_size, metadata_charge_policy);
249
+ return LRUCacheShard::CalcEstimatedHandleCharge(estimated_value_size,
250
+ metadata_charge_policy);
248
251
  }
249
252
 
250
253
  int CalcHashBitsWrapper(size_t capacity, size_t estimated_value_size,
251
254
  CacheMetadataChargePolicy metadata_charge_policy) {
252
- return fast_lru_cache::LRUCacheShard::CalcHashBits(
253
- capacity, estimated_value_size, metadata_charge_policy);
255
+ return LRUCacheShard::CalcHashBits(capacity, estimated_value_size,
256
+ metadata_charge_policy);
254
257
  }
255
258
 
256
259
  // Maximum number of items that a shard can hold.
257
260
  double CalcMaxOccupancy(size_t capacity, size_t estimated_value_size,
258
261
  CacheMetadataChargePolicy metadata_charge_policy) {
259
- size_t handle_charge =
260
- fast_lru_cache::LRUCacheShard::CalcEstimatedHandleCharge(
261
- estimated_value_size, metadata_charge_policy);
262
- return capacity / (fast_lru_cache::kLoadFactor * handle_charge);
262
+ size_t handle_charge = LRUCacheShard::CalcEstimatedHandleCharge(
263
+ estimated_value_size, metadata_charge_policy);
264
+ return capacity / (kLoadFactor * handle_charge);
263
265
  }
264
-
265
266
  bool TableSizeIsAppropriate(int hash_bits, double max_occupancy) {
266
267
  if (hash_bits == 0) {
267
268
  return max_occupancy <= 1;
@@ -272,7 +273,7 @@ class FastLRUCacheTest : public testing::Test {
272
273
  }
273
274
 
274
275
  private:
275
- fast_lru_cache::LRUCacheShard* cache_ = nullptr;
276
+ LRUCacheShard* cache_ = nullptr;
276
277
  };
277
278
 
278
279
  TEST_F(FastLRUCacheTest, ValidateKeySize) {
@@ -292,7 +293,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
292
293
  double max_occupancy;
293
294
  int hash_bits;
294
295
  CacheMetadataChargePolicy metadata_charge_policy;
295
-
296
296
  // Vary the cache capacity, fix the element charge.
297
297
  for (int i = 0; i < 2048; i++) {
298
298
  capacity = i;
@@ -304,7 +304,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
304
304
  metadata_charge_policy);
305
305
  EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
306
306
  }
307
-
308
307
  // Fix the cache capacity, vary the element charge.
309
308
  for (int i = 0; i < 1024; i++) {
310
309
  capacity = 1024;
@@ -316,7 +315,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
316
315
  metadata_charge_policy);
317
316
  EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
318
317
  }
319
-
320
318
  // Zero-capacity cache, and only values have charge.
321
319
  capacity = 0;
322
320
  estimated_value_size = 1;
@@ -324,7 +322,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
324
322
  hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
325
323
  metadata_charge_policy);
326
324
  EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
327
-
328
325
  // Zero-capacity cache, and only metadata has charge.
329
326
  capacity = 0;
330
327
  estimated_value_size = 0;
@@ -332,7 +329,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
332
329
  hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
333
330
  metadata_charge_policy);
334
331
  EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
335
-
336
332
  // Small cache, large elements.
337
333
  capacity = 1024;
338
334
  estimated_value_size = 8192;
@@ -340,7 +336,6 @@ TEST_F(FastLRUCacheTest, CalcHashBitsTest) {
340
336
  hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
341
337
  metadata_charge_policy);
342
338
  EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
343
-
344
339
  // Large capacity.
345
340
  capacity = 31924172;
346
341
  estimated_value_size = 8192;
@@ -402,37 +397,38 @@ class ClockCacheTest : public testing::Test {
402
397
 
403
398
  void Erase(const std::string& key) { shard_->Erase(key, 0 /*hash*/); }
404
399
 
405
- // void ValidateLRUList(std::vector<std::string> keys,
406
- // size_t num_high_pri_pool_keys = 0) {
407
- // LRUHandle* lru;
408
- // LRUHandle* lru_low_pri;
409
- // cache_->TEST_GetLRUList(&lru, &lru_low_pri);
410
- // LRUHandle* iter = lru;
411
- // bool in_high_pri_pool = false;
412
- // size_t high_pri_pool_keys = 0;
413
- // if (iter == lru_low_pri) {
414
- // in_high_pri_pool = true;
415
- // }
416
- // for (const auto& key : keys) {
417
- // iter = iter->next;
418
- // ASSERT_NE(lru, iter);
419
- // ASSERT_EQ(key, iter->key().ToString());
420
- // ASSERT_EQ(in_high_pri_pool, iter->InHighPriPool());
421
- // if (in_high_pri_pool) {
422
- // high_pri_pool_keys++;
423
- // }
424
- // if (iter == lru_low_pri) {
425
- // ASSERT_FALSE(in_high_pri_pool);
426
- // in_high_pri_pool = true;
427
- // }
428
- // }
429
- // ASSERT_EQ(lru, iter->next);
430
- // ASSERT_TRUE(in_high_pri_pool);
431
- // ASSERT_EQ(num_high_pri_pool_keys, high_pri_pool_keys);
432
- // }
400
+ size_t CalcEstimatedHandleChargeWrapper(
401
+ size_t estimated_value_size,
402
+ CacheMetadataChargePolicy metadata_charge_policy) {
403
+ return ClockCacheShard::CalcEstimatedHandleCharge(estimated_value_size,
404
+ metadata_charge_policy);
405
+ }
406
+
407
+ int CalcHashBitsWrapper(size_t capacity, size_t estimated_value_size,
408
+ CacheMetadataChargePolicy metadata_charge_policy) {
409
+ return ClockCacheShard::CalcHashBits(capacity, estimated_value_size,
410
+ metadata_charge_policy);
411
+ }
412
+
413
+ // Maximum number of items that a shard can hold.
414
+ double CalcMaxOccupancy(size_t capacity, size_t estimated_value_size,
415
+ CacheMetadataChargePolicy metadata_charge_policy) {
416
+ size_t handle_charge = ClockCacheShard::CalcEstimatedHandleCharge(
417
+ estimated_value_size, metadata_charge_policy);
418
+ return capacity / (kLoadFactor * handle_charge);
419
+ }
420
+
421
+ bool TableSizeIsAppropriate(int hash_bits, double max_occupancy) {
422
+ if (hash_bits == 0) {
423
+ return max_occupancy <= 1;
424
+ } else {
425
+ return (1 << hash_bits >= max_occupancy) &&
426
+ (1 << (hash_bits - 1) <= max_occupancy);
427
+ }
428
+ }
433
429
 
434
430
  private:
435
- clock_cache::ClockCacheShard* shard_ = nullptr;
431
+ ClockCacheShard* shard_ = nullptr;
436
432
  };
437
433
 
438
434
  TEST_F(ClockCacheTest, Validate) {
@@ -447,31 +443,89 @@ TEST_F(ClockCacheTest, Validate) {
447
443
  }
448
444
 
449
445
  TEST_F(ClockCacheTest, ClockPriorityTest) {
450
- clock_cache::ClockHandle handle;
451
- EXPECT_EQ(handle.GetClockPriority(),
452
- clock_cache::ClockHandle::ClockPriority::NONE);
453
- handle.SetClockPriority(clock_cache::ClockHandle::ClockPriority::HIGH);
454
- EXPECT_EQ(handle.GetClockPriority(),
455
- clock_cache::ClockHandle::ClockPriority::HIGH);
446
+ ClockHandle handle;
447
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
448
+ handle.SetClockPriority(ClockHandle::ClockPriority::HIGH);
449
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::HIGH);
456
450
  handle.DecreaseClockPriority();
457
- EXPECT_EQ(handle.GetClockPriority(),
458
- clock_cache::ClockHandle::ClockPriority::MEDIUM);
451
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
459
452
  handle.DecreaseClockPriority();
460
- EXPECT_EQ(handle.GetClockPriority(),
461
- clock_cache::ClockHandle::ClockPriority::LOW);
462
- handle.SetClockPriority(clock_cache::ClockHandle::ClockPriority::MEDIUM);
463
- EXPECT_EQ(handle.GetClockPriority(),
464
- clock_cache::ClockHandle::ClockPriority::MEDIUM);
465
- handle.SetClockPriority(clock_cache::ClockHandle::ClockPriority::NONE);
466
- EXPECT_EQ(handle.GetClockPriority(),
467
- clock_cache::ClockHandle::ClockPriority::NONE);
468
- handle.SetClockPriority(clock_cache::ClockHandle::ClockPriority::MEDIUM);
469
- EXPECT_EQ(handle.GetClockPriority(),
470
- clock_cache::ClockHandle::ClockPriority::MEDIUM);
453
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::LOW);
454
+ handle.SetClockPriority(ClockHandle::ClockPriority::MEDIUM);
455
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
456
+ handle.SetClockPriority(ClockHandle::ClockPriority::NONE);
457
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
458
+ handle.SetClockPriority(ClockHandle::ClockPriority::MEDIUM);
459
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::MEDIUM);
471
460
  handle.DecreaseClockPriority();
472
461
  handle.DecreaseClockPriority();
473
- EXPECT_EQ(handle.GetClockPriority(),
474
- clock_cache::ClockHandle::ClockPriority::NONE);
462
+ EXPECT_EQ(handle.GetClockPriority(), ClockHandle::ClockPriority::NONE);
463
+ }
464
+
465
+ TEST_F(ClockCacheTest, CalcHashBitsTest) {
466
+ size_t capacity;
467
+ size_t estimated_value_size;
468
+ double max_occupancy;
469
+ int hash_bits;
470
+ CacheMetadataChargePolicy metadata_charge_policy;
471
+
472
+ // Vary the cache capacity, fix the element charge.
473
+ for (int i = 0; i < 2048; i++) {
474
+ capacity = i;
475
+ estimated_value_size = 0;
476
+ metadata_charge_policy = kFullChargeCacheMetadata;
477
+ max_occupancy = CalcMaxOccupancy(capacity, estimated_value_size,
478
+ metadata_charge_policy);
479
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
480
+ metadata_charge_policy);
481
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
482
+ }
483
+
484
+ // Fix the cache capacity, vary the element charge.
485
+ for (int i = 0; i < 1024; i++) {
486
+ capacity = 1024;
487
+ estimated_value_size = i;
488
+ metadata_charge_policy = kFullChargeCacheMetadata;
489
+ max_occupancy = CalcMaxOccupancy(capacity, estimated_value_size,
490
+ metadata_charge_policy);
491
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
492
+ metadata_charge_policy);
493
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
494
+ }
495
+
496
+ // Zero-capacity cache, and only values have charge.
497
+ capacity = 0;
498
+ estimated_value_size = 1;
499
+ metadata_charge_policy = kDontChargeCacheMetadata;
500
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
501
+ metadata_charge_policy);
502
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
503
+
504
+ // Zero-capacity cache, and only metadata has charge.
505
+ capacity = 0;
506
+ estimated_value_size = 0;
507
+ metadata_charge_policy = kFullChargeCacheMetadata;
508
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
509
+ metadata_charge_policy);
510
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
511
+
512
+ // Small cache, large elements.
513
+ capacity = 1024;
514
+ estimated_value_size = 8192;
515
+ metadata_charge_policy = kFullChargeCacheMetadata;
516
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
517
+ metadata_charge_policy);
518
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, 0 /* max_occupancy */));
519
+
520
+ // Large capacity.
521
+ capacity = 31924172;
522
+ estimated_value_size = 8192;
523
+ metadata_charge_policy = kFullChargeCacheMetadata;
524
+ max_occupancy =
525
+ CalcMaxOccupancy(capacity, estimated_value_size, metadata_charge_policy);
526
+ hash_bits = CalcHashBitsWrapper(capacity, estimated_value_size,
527
+ metadata_charge_policy);
528
+ EXPECT_TRUE(TableSizeIsAppropriate(hash_bits, max_occupancy));
475
529
  }
476
530
 
477
531
  } // namespace clock_cache
@@ -18,7 +18,9 @@ CRASHTEST_PY=$(PYTHON) -u tools/db_crashtest.py --stress_cmd=$(DB_STRESS_CMD)
18
18
  whitebox_crash_test whitebox_crash_test_with_atomic_flush \
19
19
  whitebox_crash_test_with_txn whitebox_crash_test_with_ts \
20
20
  blackbox_crash_test_with_multiops_wc_txn \
21
- blackbox_crash_test_with_multiops_wp_txn
21
+ blackbox_crash_test_with_multiops_wp_txn \
22
+ crash_test_with_tiered_storage blackbox_crash_test_with_tiered_storage \
23
+ whitebox_crash_test_with_tiered_storage \
22
24
 
23
25
  crash_test: $(DB_STRESS_CMD)
24
26
  # Do not parallelize
@@ -42,6 +44,11 @@ crash_test_with_ts: $(DB_STRESS_CMD)
42
44
  $(CRASHTEST_MAKE) whitebox_crash_test_with_ts
43
45
  $(CRASHTEST_MAKE) blackbox_crash_test_with_ts
44
46
 
47
+ crash_test_with_tiered_storage: $(DB_STRESS_CMD)
48
+ # Do not parallelize
49
+ $(CRASHTEST_MAKE) whitebox_crash_test_with_tiered_storage
50
+ $(CRASHTEST_MAKE) blackbox_crash_test_with_tiered_storage
51
+
45
52
  crash_test_with_multiops_wc_txn: $(DB_STRESS_CMD)
46
53
  $(CRASHTEST_MAKE) blackbox_crash_test_with_multiops_wc_txn
47
54
 
@@ -70,6 +77,9 @@ blackbox_crash_test_with_multiops_wc_txn: $(DB_STRESS_CMD)
70
77
  blackbox_crash_test_with_multiops_wp_txn: $(DB_STRESS_CMD)
71
78
  $(CRASHTEST_PY) --test_multiops_txn --write_policy write_prepared blackbox $(CRASH_TEST_EXT_ARGS)
72
79
 
80
+ blackbox_crash_test_with_tiered_storage: $(DB_STRESS_CMD)
81
+ $(CRASHTEST_PY) --enable_tiered_storage blackbox $(CRASH_TEST_EXT_ARGS)
82
+
73
83
  ifeq ($(CRASH_TEST_KILL_ODD),)
74
84
  CRASH_TEST_KILL_ODD=888887
75
85
  endif
@@ -91,3 +101,7 @@ whitebox_crash_test_with_txn: $(DB_STRESS_CMD)
91
101
  whitebox_crash_test_with_ts: $(DB_STRESS_CMD)
92
102
  $(CRASHTEST_PY) --enable_ts whitebox --random_kill_odd \
93
103
  $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
104
+
105
+ whitebox_crash_test_with_tiered_storage: $(DB_STRESS_CMD)
106
+ $(CRASHTEST_PY) --enable_tiered_storage whitebox --random_kill_odd \
107
+ $(CRASH_TEST_KILL_ODD) $(CRASH_TEST_EXT_ARGS)
@@ -89,8 +89,8 @@ Status ArenaWrappedDBIter::Refresh() {
89
89
  ReadRangeDelAggregator* range_del_agg =
90
90
  db_iter_->GetRangeDelAggregator();
91
91
  std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter;
92
- range_del_iter.reset(
93
- sv->mem->NewRangeTombstoneIterator(read_options_, latest_seq));
92
+ range_del_iter.reset(sv->mem->NewRangeTombstoneIterator(
93
+ read_options_, latest_seq, false /* immutable_memtable */));
94
94
  range_del_agg->AddTombstones(std::move(range_del_iter));
95
95
  cfd_->ReturnThreadLocalSuperVersion(sv);
96
96
  }
@@ -92,7 +92,7 @@ class BlobIndex {
92
92
  }
93
93
 
94
94
  Status DecodeFrom(Slice slice) {
95
- static const std::string kErrorMessage = "Error while decoding blob index";
95
+ const char* kErrorMessage = "Error while decoding blob index";
96
96
  assert(slice.size() > 0);
97
97
  type_ = static_cast<Type>(*slice.data());
98
98
  if (type_ >= Type::kUnknown) {
@@ -26,8 +26,7 @@ void BlobLogHeader::EncodeTo(std::string* dst) {
26
26
  }
27
27
 
28
28
  Status BlobLogHeader::DecodeFrom(Slice src) {
29
- static const std::string kErrorMessage =
30
- "Error while decoding blob log header";
29
+ const char* kErrorMessage = "Error while decoding blob log header";
31
30
  if (src.size() != BlobLogHeader::kSize) {
32
31
  return Status::Corruption(kErrorMessage,
33
32
  "Unexpected blob file header size");
@@ -71,8 +70,7 @@ void BlobLogFooter::EncodeTo(std::string* dst) {
71
70
  }
72
71
 
73
72
  Status BlobLogFooter::DecodeFrom(Slice src) {
74
- static const std::string kErrorMessage =
75
- "Error while decoding blob log footer";
73
+ const char* kErrorMessage = "Error while decoding blob log footer";
76
74
  if (src.size() != BlobLogFooter::kSize) {
77
75
  return Status::Corruption(kErrorMessage,
78
76
  "Unexpected blob file footer size");
@@ -112,7 +110,7 @@ void BlobLogRecord::EncodeHeaderTo(std::string* dst) {
112
110
  }
113
111
 
114
112
  Status BlobLogRecord::DecodeHeaderFrom(Slice src) {
115
- static const std::string kErrorMessage = "Error while decoding blob record";
113
+ const char* kErrorMessage = "Error while decoding blob record";
116
114
  if (src.size() != BlobLogRecord::kHeaderSize) {
117
115
  return Status::Corruption(kErrorMessage,
118
116
  "Unexpected blob record header size");
@@ -70,32 +70,38 @@ Status BlobLogWriter::AppendFooter(BlobLogFooter& footer,
70
70
  std::string str;
71
71
  footer.EncodeTo(&str);
72
72
 
73
- Status s = dest_->Append(Slice(str));
74
- if (s.ok()) {
75
- block_offset_ += str.size();
76
-
77
- s = Sync();
78
-
73
+ Status s;
74
+ if (dest_->seen_error()) {
75
+ s.PermitUncheckedError();
76
+ return Status::IOError("Seen Error. Skip closing.");
77
+ } else {
78
+ s = dest_->Append(Slice(str));
79
79
  if (s.ok()) {
80
- s = dest_->Close();
80
+ block_offset_ += str.size();
81
+
82
+ s = Sync();
81
83
 
82
84
  if (s.ok()) {
83
- assert(!!checksum_method == !!checksum_value);
85
+ s = dest_->Close();
84
86
 
85
- if (checksum_method) {
86
- assert(checksum_method->empty());
87
+ if (s.ok()) {
88
+ assert(!!checksum_method == !!checksum_value);
87
89
 
88
- std::string method = dest_->GetFileChecksumFuncName();
89
- if (method != kUnknownFileChecksumFuncName) {
90
- *checksum_method = std::move(method);
90
+ if (checksum_method) {
91
+ assert(checksum_method->empty());
92
+
93
+ std::string method = dest_->GetFileChecksumFuncName();
94
+ if (method != kUnknownFileChecksumFuncName) {
95
+ *checksum_method = std::move(method);
96
+ }
91
97
  }
92
- }
93
- if (checksum_value) {
94
- assert(checksum_value->empty());
98
+ if (checksum_value) {
99
+ assert(checksum_value->empty());
95
100
 
96
- std::string value = dest_->GetFileChecksum();
97
- if (value != kUnknownFileChecksum) {
98
- *checksum_value = std::move(value);
101
+ std::string value = dest_->GetFileChecksum();
102
+ if (value != kUnknownFileChecksum) {
103
+ *checksum_value = std::move(value);
104
+ }
99
105
  }
100
106
  }
101
107
  }
@@ -135,6 +135,8 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
135
135
  block_based_options.cache_index_and_filter_blocks = true;
136
136
  options.table_factory.reset(NewBlockBasedTableFactory(block_based_options));
137
137
 
138
+ options.statistics = CreateDBStatistics();
139
+
138
140
  Reopen(options);
139
141
 
140
142
  int num_blobs = 5;
@@ -165,6 +167,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
165
167
  ++i;
166
168
  }
167
169
  ASSERT_EQ(i, num_blobs);
170
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
168
171
  }
169
172
 
170
173
  {
@@ -180,6 +183,7 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
180
183
  iter->SeekToFirst();
181
184
  ASSERT_NOK(iter->status());
182
185
  ASSERT_FALSE(iter->Valid());
186
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
183
187
  }
184
188
 
185
189
  {
@@ -198,6 +202,8 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
198
202
  ++i;
199
203
  }
200
204
  ASSERT_EQ(i, num_blobs);
205
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD),
206
+ num_blobs);
201
207
  }
202
208
 
203
209
  {
@@ -217,6 +223,149 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCache) {
217
223
  ++i;
218
224
  }
219
225
  ASSERT_EQ(i, num_blobs);
226
+ ASSERT_EQ(options.statistics->getAndResetTickerCount(BLOB_DB_CACHE_ADD), 0);
227
+ }
228
+ }
229
+
230
+ TEST_F(DBBlobBasicTest, IterateBlobsFromCachePinning) {
231
+ constexpr size_t min_blob_size = 6;
232
+
233
+ Options options = GetDefaultOptions();
234
+
235
+ LRUCacheOptions cache_options;
236
+ cache_options.capacity = 2048;
237
+ cache_options.num_shard_bits = 0;
238
+ cache_options.metadata_charge_policy = kDontChargeCacheMetadata;
239
+
240
+ options.blob_cache = NewLRUCache(cache_options);
241
+ options.enable_blob_files = true;
242
+ options.min_blob_size = min_blob_size;
243
+
244
+ Reopen(options);
245
+
246
+ // Put then iterate over three key-values. The second value is below the size
247
+ // limit and is thus stored inline; the other two are stored separately as
248
+ // blobs. We expect to have something pinned in the cache iff we are
249
+ // positioned on a blob.
250
+
251
+ constexpr char first_key[] = "first_key";
252
+ constexpr char first_value[] = "long_value";
253
+ static_assert(sizeof(first_value) - 1 >= min_blob_size,
254
+ "first_value too short to be stored as blob");
255
+
256
+ ASSERT_OK(Put(first_key, first_value));
257
+
258
+ constexpr char second_key[] = "second_key";
259
+ constexpr char second_value[] = "short";
260
+ static_assert(sizeof(second_value) - 1 < min_blob_size,
261
+ "second_value too long to be inlined");
262
+
263
+ ASSERT_OK(Put(second_key, second_value));
264
+
265
+ constexpr char third_key[] = "third_key";
266
+ constexpr char third_value[] = "other_long_value";
267
+ static_assert(sizeof(third_value) - 1 >= min_blob_size,
268
+ "third_value too short to be stored as blob");
269
+
270
+ ASSERT_OK(Put(third_key, third_value));
271
+
272
+ ASSERT_OK(Flush());
273
+
274
+ {
275
+ ReadOptions read_options;
276
+ read_options.fill_cache = true;
277
+
278
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
279
+
280
+ iter->SeekToFirst();
281
+ ASSERT_TRUE(iter->Valid());
282
+ ASSERT_OK(iter->status());
283
+ ASSERT_EQ(iter->key(), first_key);
284
+ ASSERT_EQ(iter->value(), first_value);
285
+
286
+ iter->Next();
287
+ ASSERT_TRUE(iter->Valid());
288
+ ASSERT_OK(iter->status());
289
+ ASSERT_EQ(iter->key(), second_key);
290
+ ASSERT_EQ(iter->value(), second_value);
291
+
292
+ iter->Next();
293
+ ASSERT_TRUE(iter->Valid());
294
+ ASSERT_OK(iter->status());
295
+ ASSERT_EQ(iter->key(), third_key);
296
+ ASSERT_EQ(iter->value(), third_value);
297
+
298
+ iter->Next();
299
+ ASSERT_FALSE(iter->Valid());
300
+ ASSERT_OK(iter->status());
301
+ }
302
+
303
+ {
304
+ ReadOptions read_options;
305
+ read_options.fill_cache = false;
306
+ read_options.read_tier = kBlockCacheTier;
307
+
308
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
309
+
310
+ iter->SeekToFirst();
311
+ ASSERT_TRUE(iter->Valid());
312
+ ASSERT_OK(iter->status());
313
+ ASSERT_EQ(iter->key(), first_key);
314
+ ASSERT_EQ(iter->value(), first_value);
315
+ ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
316
+
317
+ iter->Next();
318
+ ASSERT_TRUE(iter->Valid());
319
+ ASSERT_OK(iter->status());
320
+ ASSERT_EQ(iter->key(), second_key);
321
+ ASSERT_EQ(iter->value(), second_value);
322
+ ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
323
+
324
+ iter->Next();
325
+ ASSERT_TRUE(iter->Valid());
326
+ ASSERT_OK(iter->status());
327
+ ASSERT_EQ(iter->key(), third_key);
328
+ ASSERT_EQ(iter->value(), third_value);
329
+ ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
330
+
331
+ iter->Next();
332
+ ASSERT_FALSE(iter->Valid());
333
+ ASSERT_OK(iter->status());
334
+ ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
335
+ }
336
+
337
+ {
338
+ ReadOptions read_options;
339
+ read_options.fill_cache = false;
340
+ read_options.read_tier = kBlockCacheTier;
341
+
342
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
343
+
344
+ iter->SeekToLast();
345
+ ASSERT_TRUE(iter->Valid());
346
+ ASSERT_OK(iter->status());
347
+ ASSERT_EQ(iter->key(), third_key);
348
+ ASSERT_EQ(iter->value(), third_value);
349
+ ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
350
+
351
+ iter->Prev();
352
+ ASSERT_TRUE(iter->Valid());
353
+ ASSERT_OK(iter->status());
354
+ ASSERT_EQ(iter->key(), second_key);
355
+ ASSERT_EQ(iter->value(), second_value);
356
+ ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
357
+
358
+ iter->Prev();
359
+ ASSERT_TRUE(iter->Valid());
360
+ ASSERT_OK(iter->status());
361
+ ASSERT_EQ(iter->key(), first_key);
362
+ ASSERT_EQ(iter->value(), first_value);
363
+ ASSERT_GT(options.blob_cache->GetPinnedUsage(), 0);
364
+
365
+ iter->Prev();
366
+ ASSERT_FALSE(iter->Valid());
367
+ ASSERT_OK(iter->status());
368
+ ASSERT_EQ(options.blob_cache->GetPinnedUsage(), 0);
220
369
  }
221
370
  }
222
371
 
@@ -798,6 +798,42 @@ TEST_F(DBBlobCompactionTest, CompactionReadaheadMerge) {
798
798
  Close();
799
799
  }
800
800
 
801
+ TEST_F(DBBlobCompactionTest, CompactionDoNotFillCache) {
802
+ Options options = GetDefaultOptions();
803
+
804
+ options.enable_blob_files = true;
805
+ options.min_blob_size = 0;
806
+ options.enable_blob_garbage_collection = true;
807
+ options.blob_garbage_collection_age_cutoff = 1.0;
808
+ options.disable_auto_compactions = true;
809
+ options.statistics = CreateDBStatistics();
810
+
811
+ LRUCacheOptions cache_options;
812
+ cache_options.capacity = 1 << 20;
813
+ cache_options.metadata_charge_policy = kDontChargeCacheMetadata;
814
+
815
+ options.blob_cache = NewLRUCache(cache_options);
816
+
817
+ Reopen(options);
818
+
819
+ ASSERT_OK(Put("key", "lime"));
820
+ ASSERT_OK(Put("foo", "bar"));
821
+ ASSERT_OK(Flush());
822
+
823
+ ASSERT_OK(Put("key", "pie"));
824
+ ASSERT_OK(Put("foo", "baz"));
825
+ ASSERT_OK(Flush());
826
+
827
+ constexpr Slice* begin = nullptr;
828
+ constexpr Slice* end = nullptr;
829
+
830
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), begin, end));
831
+
832
+ ASSERT_EQ(options.statistics->getTickerCount(BLOB_DB_CACHE_ADD), 0);
833
+
834
+ Close();
835
+ }
836
+
801
837
  } // namespace ROCKSDB_NAMESPACE
802
838
 
803
839
  int main(int argc, char** argv) {