@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
@@ -764,6 +764,7 @@ TEST_F(CorruptionTest, ParanoidFileChecksOnCompact) {
764
764
  delete db_;
765
765
  db_ = nullptr;
766
766
  s = DestroyDB(dbname_, options);
767
+ ASSERT_OK(s);
767
768
  std::shared_ptr<mock::MockTableFactory> mock =
768
769
  std::make_shared<mock::MockTableFactory>();
769
770
  options.table_factory = mock;
@@ -1209,9 +1209,9 @@ TEST_F(DBBasicTest, DBCloseAllDirectoryFDs) {
1209
1209
  s = db->Close();
1210
1210
  auto* counted_fs =
1211
1211
  options.env->GetFileSystem()->CheckedCast<CountedFileSystem>();
1212
- assert(counted_fs);
1213
- ASSERT_TRUE(counted_fs->counters()->dir_opens ==
1214
- counted_fs->counters()->dir_closes);
1212
+ ASSERT_TRUE(counted_fs != nullptr);
1213
+ ASSERT_EQ(counted_fs->counters()->dir_opens,
1214
+ counted_fs->counters()->dir_closes);
1215
1215
  ASSERT_OK(s);
1216
1216
  delete db;
1217
1217
  }
@@ -2146,7 +2146,7 @@ class DBMultiGetAsyncIOTest : public DBBasicTest {
2146
2146
 
2147
2147
  // Put all keys in the bottommost level, and overwrite some keys
2148
2148
  // in L0 and L1
2149
- for (int i = 0; i < 128; ++i) {
2149
+ for (int i = 0; i < 256; ++i) {
2150
2150
  EXPECT_OK(Put(Key(i), "val_l2_" + std::to_string(i)));
2151
2151
  num_keys++;
2152
2152
  if (num_keys == 8) {
@@ -2172,6 +2172,21 @@ class DBMultiGetAsyncIOTest : public DBBasicTest {
2172
2172
  EXPECT_OK(Flush());
2173
2173
  num_keys = 0;
2174
2174
  }
2175
+ // Put some range deletes in L1
2176
+ for (int i = 128; i < 256; i += 32) {
2177
+ std::string range_begin = Key(i);
2178
+ std::string range_end = Key(i + 16);
2179
+ EXPECT_OK(dbfull()->DeleteRange(WriteOptions(),
2180
+ dbfull()->DefaultColumnFamily(),
2181
+ range_begin, range_end));
2182
+ // Also do some Puts to force creation of bloom filter
2183
+ for (int j = i + 16; j < i + 32; ++j) {
2184
+ if (j % 3 == 0) {
2185
+ EXPECT_OK(Put(Key(j), "val_l1_" + std::to_string(j)));
2186
+ }
2187
+ }
2188
+ EXPECT_OK(Flush());
2189
+ }
2175
2190
  MoveFilesToLevel(1);
2176
2191
 
2177
2192
  for (int i = 0; i < 128; i += 5) {
@@ -2338,6 +2353,60 @@ TEST_F(DBMultiGetAsyncIOTest, GetFromL1AndL2) {
2338
2353
  ASSERT_EQ(multiget_io_batch_size.count, 1);
2339
2354
  ASSERT_EQ(multiget_io_batch_size.max, 2);
2340
2355
  }
2356
+
2357
+ TEST_F(DBMultiGetAsyncIOTest, GetFromL2WithRangeOverlapL0L1) {
2358
+ std::vector<std::string> key_strs;
2359
+ std::vector<Slice> keys;
2360
+ std::vector<PinnableSlice> values;
2361
+ std::vector<Status> statuses;
2362
+
2363
+ // 19 and 26 are in L2, but overlap with L0 and L1 file ranges
2364
+ key_strs.push_back(Key(19));
2365
+ key_strs.push_back(Key(26));
2366
+ keys.push_back(key_strs[0]);
2367
+ keys.push_back(key_strs[1]);
2368
+ values.resize(keys.size());
2369
+ statuses.resize(keys.size());
2370
+
2371
+ ReadOptions ro;
2372
+ ro.async_io = true;
2373
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2374
+ keys.data(), values.data(), statuses.data());
2375
+ ASSERT_EQ(values.size(), 2);
2376
+ ASSERT_EQ(statuses[0], Status::OK());
2377
+ ASSERT_EQ(statuses[1], Status::OK());
2378
+ ASSERT_EQ(values[0], "val_l2_" + std::to_string(19));
2379
+ ASSERT_EQ(values[1], "val_l2_" + std::to_string(26));
2380
+
2381
+ // Bloom filters in L0/L1 will avoid the coroutine calls in those levels
2382
+ ASSERT_EQ(statistics()->getTickerCount(MULTIGET_COROUTINE_COUNT), 2);
2383
+ }
2384
+
2385
+ TEST_F(DBMultiGetAsyncIOTest, GetFromL2WithRangeDelInL1) {
2386
+ std::vector<std::string> key_strs;
2387
+ std::vector<Slice> keys;
2388
+ std::vector<PinnableSlice> values;
2389
+ std::vector<Status> statuses;
2390
+
2391
+ // 139 and 163 are in L2, but overlap with a range deletes in L1
2392
+ key_strs.push_back(Key(139));
2393
+ key_strs.push_back(Key(163));
2394
+ keys.push_back(key_strs[0]);
2395
+ keys.push_back(key_strs[1]);
2396
+ values.resize(keys.size());
2397
+ statuses.resize(keys.size());
2398
+
2399
+ ReadOptions ro;
2400
+ ro.async_io = true;
2401
+ dbfull()->MultiGet(ro, dbfull()->DefaultColumnFamily(), keys.size(),
2402
+ keys.data(), values.data(), statuses.data());
2403
+ ASSERT_EQ(values.size(), 2);
2404
+ ASSERT_EQ(statuses[0], Status::NotFound());
2405
+ ASSERT_EQ(statuses[1], Status::NotFound());
2406
+
2407
+ // Bloom filters in L0/L1 will avoid the coroutine calls in those levels
2408
+ ASSERT_EQ(statistics()->getTickerCount(MULTIGET_COROUTINE_COUNT), 2);
2409
+ }
2341
2410
  #endif // USE_COROUTINES
2342
2411
 
2343
2412
  TEST_F(DBBasicTest, MultiGetStats) {
@@ -1294,10 +1294,12 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
1294
1294
  const size_t capacity = size_t{1} << 25;
1295
1295
  int iterations_tested = 0;
1296
1296
  for (bool partition : {false, true}) {
1297
- for (std::shared_ptr<Cache> cache : {NewLRUCache(capacity)}) {
1298
- // This test doesn't support FastLRUCache nor ClockCache because the
1299
- // keys used are not 16B long.
1300
- // TODO(guido) Add support for FastLRUCache and ClockCache.
1297
+ for (std::shared_ptr<Cache> cache :
1298
+ {NewLRUCache(capacity),
1299
+ ExperimentalNewClockCache(capacity, 1 /*estimated_value_size*/,
1300
+ -1 /*num_shard_bits*/,
1301
+ false /*strict_capacity_limit*/,
1302
+ kDefaultCacheMetadataChargePolicy)}) {
1301
1303
  if (!cache) {
1302
1304
  // Skip clock cache when not supported
1303
1305
  continue;
@@ -1450,9 +1452,16 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
1450
1452
  // even if the cache is full
1451
1453
  ClearCache(cache.get());
1452
1454
  Cache::Handle* h = nullptr;
1453
- ASSERT_OK(cache->Insert("Fill-it-up", nullptr, capacity + 1,
1454
- GetNoopDeleterForRole<CacheEntryRole::kMisc>(),
1455
- &h, Cache::Priority::HIGH));
1455
+ if (strcmp(cache->Name(), "LRUCache") == 0) {
1456
+ ASSERT_OK(cache->Insert("Fill-it-up", nullptr, capacity + 1,
1457
+ GetNoopDeleterForRole<CacheEntryRole::kMisc>(),
1458
+ &h, Cache::Priority::HIGH));
1459
+ } else {
1460
+ // For ClockCache we use a 16-byte key.
1461
+ ASSERT_OK(cache->Insert("Fill-it-up-xxxxx", nullptr, capacity + 1,
1462
+ GetNoopDeleterForRole<CacheEntryRole::kMisc>(),
1463
+ &h, Cache::Priority::HIGH));
1464
+ }
1456
1465
  ASSERT_GT(cache->GetUsage(), cache->GetCapacity());
1457
1466
  expected = {};
1458
1467
  // For CacheEntryStatsCollector
@@ -1709,7 +1718,7 @@ TEST_P(DBBlockCacheKeyTest, StableCacheKeys) {
1709
1718
  delete metadata_ptr_;
1710
1719
  metadata_ptr_ = nullptr;
1711
1720
 
1712
- DestroyDB(export_files_dir, options);
1721
+ ASSERT_OK(DestroyDB(export_files_dir, options));
1713
1722
 
1714
1723
  ReopenWithColumnFamilies({"default", "yoyo"}, options);
1715
1724
 
@@ -2660,8 +2660,9 @@ TEST_F(DBCompactionTest, ManualAutoRace) {
2660
2660
  TEST_SYNC_POINT("DBCompactionTest::ManualAutoRace:1");
2661
2661
  // The auto compaction will wait until the manual compaction is registerd
2662
2662
  // before processing so that it will be cancelled.
2663
- ASSERT_OK(dbfull()->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
2664
- nullptr));
2663
+ CompactRangeOptions cro;
2664
+ cro.exclusive_manual_compaction = true;
2665
+ ASSERT_OK(dbfull()->CompactRange(cro, handles_[1], nullptr, nullptr));
2665
2666
  ASSERT_EQ("0,1", FilesPerLevel(1));
2666
2667
 
2667
2668
  // Eventually the cancelled compaction will be rescheduled and executed.
@@ -5511,6 +5512,74 @@ INSTANTIATE_TEST_CASE_P(RoundRobinSubcompactionsAgainstResources,
5511
5512
  std::make_tuple(5, 10),
5512
5513
  std::make_tuple(10, 10)));
5513
5514
 
5515
+ TEST_P(DBCompactionTestWithParam, RoundRobinWithoutAdditionalResources) {
5516
+ const int kKeysPerBuffer = 200;
5517
+ Options options = CurrentOptions();
5518
+ options.num_levels = 4;
5519
+ options.level0_file_num_compaction_trigger = 3;
5520
+ options.target_file_size_base = kKeysPerBuffer * 1024;
5521
+ options.compaction_pri = CompactionPri::kRoundRobin;
5522
+ options.max_bytes_for_level_base = 30 * kKeysPerBuffer * 1024;
5523
+ options.disable_auto_compactions = true;
5524
+ options.max_subcompactions = max_subcompactions_;
5525
+ options.max_background_compactions = 1;
5526
+ options.max_compaction_bytes = 100000000;
5527
+ // Similar experiment setting as above except the max_subcompactions
5528
+ // is given by max_subcompactions_ (1 or 4), and we fix the
5529
+ // additional resources as (1, 1) and thus no more extra resources
5530
+ // can be used
5531
+ DestroyAndReopen(options);
5532
+ env_->SetBackgroundThreads(1, Env::LOW);
5533
+
5534
+ Random rnd(301);
5535
+ const std::vector<int> files_per_level = {0, 33, 100};
5536
+ for (int lvl = 2; lvl > 0; lvl--) {
5537
+ for (int i = 0; i < files_per_level[lvl]; i++) {
5538
+ for (int j = 0; j < kKeysPerBuffer; j++) {
5539
+ // Add (lvl-1) to ensure nearly equivallent number of files
5540
+ // in L2 are overlapped with fils selected to compact from
5541
+ // L1
5542
+ ASSERT_OK(Put(Key(2 * i * kKeysPerBuffer + 2 * j + (lvl - 1)),
5543
+ rnd.RandomString(1010)));
5544
+ }
5545
+ ASSERT_OK(Flush());
5546
+ }
5547
+ MoveFilesToLevel(lvl);
5548
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
5549
+ ASSERT_EQ(files_per_level[lvl], NumTableFilesAtLevel(lvl, 0));
5550
+ }
5551
+
5552
+ // 33 files in L1; 100 files in L2
5553
+ // This is a variable for making sure the following callback is called
5554
+ // and the assertions in it are indeed excuted.
5555
+ bool num_planned_subcompactions_verified = false;
5556
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
5557
+ "CompactionJob::GenSubcompactionBoundaries:0", [&](void* arg) {
5558
+ uint64_t num_planned_subcompactions = *(static_cast<uint64_t*>(arg));
5559
+ // At most 4 files are selected for round-robin under auto
5560
+ // compaction. The number of planned subcompaction is restricted by
5561
+ // the max_subcompactions since no extra resources can be used
5562
+ ASSERT_EQ(num_planned_subcompactions, options.max_subcompactions);
5563
+ num_planned_subcompactions_verified = true;
5564
+ });
5565
+ // No need to setup dependency for pressure token since
5566
+ // AcquireSubcompactionResources may not be called and it anyway cannot
5567
+ // reserve any additional resources
5568
+ SyncPoint::GetInstance()->LoadDependency(
5569
+ {{"DBCompactionTest::RoundRobinWithoutAdditionalResources:0",
5570
+ "BackgroundCallCompaction:0"}});
5571
+ SyncPoint::GetInstance()->EnableProcessing();
5572
+
5573
+ ASSERT_OK(dbfull()->WaitForCompact());
5574
+ ASSERT_OK(dbfull()->EnableAutoCompaction({dbfull()->DefaultColumnFamily()}));
5575
+ TEST_SYNC_POINT("DBCompactionTest::RoundRobinWithoutAdditionalResources:0");
5576
+
5577
+ ASSERT_OK(dbfull()->WaitForCompact());
5578
+ ASSERT_TRUE(num_planned_subcompactions_verified);
5579
+ SyncPoint::GetInstance()->DisableProcessing();
5580
+ SyncPoint::GetInstance()->ClearAllCallBacks();
5581
+ }
5582
+
5514
5583
  TEST_F(DBCompactionTest, RoundRobinCutOutputAtCompactCursor) {
5515
5584
  Options options = CurrentOptions();
5516
5585
  options.num_levels = 3;
@@ -1674,9 +1674,16 @@ void DBImpl::BackgroundCallPurge() {
1674
1674
  }
1675
1675
 
1676
1676
  namespace {
1677
- struct IterState {
1678
- IterState(DBImpl* _db, InstrumentedMutex* _mu, SuperVersion* _super_version,
1679
- bool _background_purge)
1677
+
1678
+ // A `SuperVersionHandle` holds a non-null `SuperVersion*` pointing at a
1679
+ // `SuperVersion` referenced once for this object. It also contains the state
1680
+ // needed to clean up the `SuperVersion` reference from outside of `DBImpl`
1681
+ // using `CleanupSuperVersionHandle()`.
1682
+ struct SuperVersionHandle {
1683
+ // `_super_version` must be non-nullptr and `Ref()`'d once as long as the
1684
+ // `SuperVersionHandle` may use it.
1685
+ SuperVersionHandle(DBImpl* _db, InstrumentedMutex* _mu,
1686
+ SuperVersion* _super_version, bool _background_purge)
1680
1687
  : db(_db),
1681
1688
  mu(_mu),
1682
1689
  super_version(_super_version),
@@ -1688,35 +1695,49 @@ struct IterState {
1688
1695
  bool background_purge;
1689
1696
  };
1690
1697
 
1691
- static void CleanupIteratorState(void* arg1, void* /*arg2*/) {
1692
- IterState* state = reinterpret_cast<IterState*>(arg1);
1698
+ static void CleanupSuperVersionHandle(void* arg1, void* /*arg2*/) {
1699
+ SuperVersionHandle* sv_handle = reinterpret_cast<SuperVersionHandle*>(arg1);
1693
1700
 
1694
- if (state->super_version->Unref()) {
1701
+ if (sv_handle->super_version->Unref()) {
1695
1702
  // Job id == 0 means that this is not our background process, but rather
1696
1703
  // user thread
1697
1704
  JobContext job_context(0);
1698
1705
 
1699
- state->mu->Lock();
1700
- state->super_version->Cleanup();
1701
- state->db->FindObsoleteFiles(&job_context, false, true);
1702
- if (state->background_purge) {
1703
- state->db->ScheduleBgLogWriterClose(&job_context);
1704
- state->db->AddSuperVersionsToFreeQueue(state->super_version);
1705
- state->db->SchedulePurge();
1706
+ sv_handle->mu->Lock();
1707
+ sv_handle->super_version->Cleanup();
1708
+ sv_handle->db->FindObsoleteFiles(&job_context, false, true);
1709
+ if (sv_handle->background_purge) {
1710
+ sv_handle->db->ScheduleBgLogWriterClose(&job_context);
1711
+ sv_handle->db->AddSuperVersionsToFreeQueue(sv_handle->super_version);
1712
+ sv_handle->db->SchedulePurge();
1706
1713
  }
1707
- state->mu->Unlock();
1714
+ sv_handle->mu->Unlock();
1708
1715
 
1709
- if (!state->background_purge) {
1710
- delete state->super_version;
1716
+ if (!sv_handle->background_purge) {
1717
+ delete sv_handle->super_version;
1711
1718
  }
1712
1719
  if (job_context.HaveSomethingToDelete()) {
1713
- state->db->PurgeObsoleteFiles(job_context, state->background_purge);
1720
+ sv_handle->db->PurgeObsoleteFiles(job_context,
1721
+ sv_handle->background_purge);
1714
1722
  }
1715
1723
  job_context.Clean();
1716
1724
  }
1717
1725
 
1726
+ delete sv_handle;
1727
+ }
1728
+
1729
+ struct GetMergeOperandsState {
1730
+ MergeContext merge_context;
1731
+ PinnedIteratorsManager pinned_iters_mgr;
1732
+ SuperVersionHandle* sv_handle;
1733
+ };
1734
+
1735
+ static void CleanupGetMergeOperandsState(void* arg1, void* /*arg2*/) {
1736
+ GetMergeOperandsState* state = static_cast<GetMergeOperandsState*>(arg1);
1737
+ CleanupSuperVersionHandle(state->sv_handle /* arg1 */, nullptr /* arg2 */);
1718
1738
  delete state;
1719
1739
  }
1740
+
1720
1741
  } // namespace
1721
1742
 
1722
1743
  InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
@@ -1740,8 +1761,8 @@ InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
1740
1761
  std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter;
1741
1762
  Status s;
1742
1763
  if (!read_options.ignore_range_deletions) {
1743
- range_del_iter.reset(
1744
- super_version->mem->NewRangeTombstoneIterator(read_options, sequence));
1764
+ range_del_iter.reset(super_version->mem->NewRangeTombstoneIterator(
1765
+ read_options, sequence, false /* immutable_memtable */));
1745
1766
  range_del_agg->AddTombstones(std::move(range_del_iter));
1746
1767
  }
1747
1768
  // Collect all needed child iterators for immutable memtables
@@ -1761,11 +1782,11 @@ InternalIterator* DBImpl::NewInternalIterator(const ReadOptions& read_options,
1761
1782
  allow_unprepared_value);
1762
1783
  }
1763
1784
  internal_iter = merge_iter_builder.Finish();
1764
- IterState* cleanup =
1765
- new IterState(this, &mutex_, super_version,
1766
- read_options.background_purge_on_iterator_cleanup ||
1767
- immutable_db_options_.avoid_unnecessary_blocking_io);
1768
- internal_iter->RegisterCleanup(CleanupIteratorState, cleanup, nullptr);
1785
+ SuperVersionHandle* cleanup = new SuperVersionHandle(
1786
+ this, &mutex_, super_version,
1787
+ read_options.background_purge_on_iterator_cleanup ||
1788
+ immutable_db_options_.avoid_unnecessary_blocking_io);
1789
+ internal_iter->RegisterCleanup(CleanupSuperVersionHandle, cleanup, nullptr);
1769
1790
 
1770
1791
  return internal_iter;
1771
1792
  } else {
@@ -1801,6 +1822,34 @@ Status DBImpl::Get(const ReadOptions& read_options,
1801
1822
  return s;
1802
1823
  }
1803
1824
 
1825
+ bool DBImpl::ShouldReferenceSuperVersion(const MergeContext& merge_context) {
1826
+ // If both thresholds are reached, a function returning merge operands as
1827
+ // `PinnableSlice`s should reference the `SuperVersion` to avoid large and/or
1828
+ // numerous `memcpy()`s.
1829
+ //
1830
+ // The below constants enable the optimization conservatively. They are
1831
+ // verified to not regress `GetMergeOperands()` latency in the following
1832
+ // scenarios.
1833
+ //
1834
+ // - CPU: two socket Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
1835
+ // - `GetMergeOperands()` threads: 1 - 32
1836
+ // - Entry size: 32 bytes - 4KB
1837
+ // - Merges per key: 1 - 16K
1838
+ // - LSM component: memtable
1839
+ //
1840
+ // TODO(ajkr): expand measurement to SST files.
1841
+ static const size_t kNumBytesForSvRef = 32768;
1842
+ static const size_t kLog2AvgBytesForSvRef = 8; // 256 bytes
1843
+
1844
+ size_t num_bytes = 0;
1845
+ for (const Slice& sl : merge_context.GetOperands()) {
1846
+ num_bytes += sl.size();
1847
+ }
1848
+ return num_bytes >= kNumBytesForSvRef &&
1849
+ (num_bytes >> kLog2AvgBytesForSvRef) >=
1850
+ merge_context.GetOperands().size();
1851
+ }
1852
+
1804
1853
  Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
1805
1854
  GetImplOptions& get_impl_options) {
1806
1855
  assert(get_impl_options.value != nullptr ||
@@ -1848,6 +1897,14 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
1848
1897
  }
1849
1898
  }
1850
1899
 
1900
+ if (get_impl_options.get_merge_operands_options != nullptr) {
1901
+ for (int i = 0; i < get_impl_options.get_merge_operands_options
1902
+ ->expected_max_number_of_operands;
1903
+ ++i) {
1904
+ get_impl_options.merge_operands[i].Reset();
1905
+ }
1906
+ }
1907
+
1851
1908
  // Acquire SuperVersion
1852
1909
  SuperVersion* sv = GetAndRefSuperVersion(cfd);
1853
1910
 
@@ -1925,7 +1982,8 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
1925
1982
  if (get_impl_options.get_value) {
1926
1983
  if (sv->mem->Get(lkey, get_impl_options.value->GetSelf(), timestamp, &s,
1927
1984
  &merge_context, &max_covering_tombstone_seq,
1928
- read_options, get_impl_options.callback,
1985
+ read_options, false /* immutable_memtable */,
1986
+ get_impl_options.callback,
1929
1987
  get_impl_options.is_blob_index)) {
1930
1988
  done = true;
1931
1989
  get_impl_options.value->PinSelf();
@@ -1945,7 +2003,8 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
1945
2003
  // merged and raw values should be returned to the user.
1946
2004
  if (sv->mem->Get(lkey, /*value*/ nullptr, /*timestamp=*/nullptr, &s,
1947
2005
  &merge_context, &max_covering_tombstone_seq,
1948
- read_options, nullptr, nullptr, false)) {
2006
+ read_options, false /* immutable_memtable */, nullptr,
2007
+ nullptr, false)) {
1949
2008
  done = true;
1950
2009
  RecordTick(stats_, MEMTABLE_HIT);
1951
2010
  } else if ((s.ok() || s.IsMergeInProgress()) &&
@@ -1995,19 +2054,68 @@ Status DBImpl::GetImpl(const ReadOptions& read_options, const Slice& key,
1995
2054
  s = Status::Incomplete(
1996
2055
  Status::SubCode::KMergeOperandsInsufficientCapacity);
1997
2056
  } else {
1998
- for (const Slice& sl : merge_context.GetOperands()) {
1999
- size += sl.size();
2000
- get_impl_options.merge_operands->PinSelf(sl);
2001
- get_impl_options.merge_operands++;
2057
+ // Each operand depends on one of the following resources: `sv`,
2058
+ // `pinned_iters_mgr`, or `merge_context`. It would be crazy expensive
2059
+ // to reference `sv` for each operand relying on it because `sv` is
2060
+ // (un)ref'd in all threads using the DB. Furthermore, we do not track
2061
+ // on which resource each operand depends.
2062
+ //
2063
+ // To solve this, we bundle the resources in a `GetMergeOperandsState`
2064
+ // and manage them with a `SharedCleanablePtr` shared among the
2065
+ // `PinnableSlice`s we return. This bundle includes one `sv` reference
2066
+ // and ownership of the `merge_context` and `pinned_iters_mgr`
2067
+ // objects.
2068
+ bool ref_sv = ShouldReferenceSuperVersion(merge_context);
2069
+ if (ref_sv) {
2070
+ assert(!merge_context.GetOperands().empty());
2071
+ SharedCleanablePtr shared_cleanable;
2072
+ GetMergeOperandsState* state = nullptr;
2073
+ state = new GetMergeOperandsState();
2074
+ state->merge_context = std::move(merge_context);
2075
+ state->pinned_iters_mgr = std::move(pinned_iters_mgr);
2076
+
2077
+ sv->Ref();
2078
+
2079
+ state->sv_handle = new SuperVersionHandle(
2080
+ this, &mutex_, sv,
2081
+ immutable_db_options_.avoid_unnecessary_blocking_io);
2082
+
2083
+ shared_cleanable.Allocate();
2084
+ shared_cleanable->RegisterCleanup(CleanupGetMergeOperandsState,
2085
+ state /* arg1 */,
2086
+ nullptr /* arg2 */);
2087
+ for (size_t i = 0; i < state->merge_context.GetOperands().size();
2088
+ ++i) {
2089
+ const Slice& sl = state->merge_context.GetOperands()[i];
2090
+ size += sl.size();
2091
+
2092
+ get_impl_options.merge_operands->PinSlice(
2093
+ sl, nullptr /* cleanable */);
2094
+ if (i == state->merge_context.GetOperands().size() - 1) {
2095
+ shared_cleanable.MoveAsCleanupTo(
2096
+ get_impl_options.merge_operands);
2097
+ } else {
2098
+ shared_cleanable.RegisterCopyWith(
2099
+ get_impl_options.merge_operands);
2100
+ }
2101
+ get_impl_options.merge_operands++;
2102
+ }
2103
+ } else {
2104
+ for (const Slice& sl : merge_context.GetOperands()) {
2105
+ size += sl.size();
2106
+ get_impl_options.merge_operands->PinSelf(sl);
2107
+ get_impl_options.merge_operands++;
2108
+ }
2002
2109
  }
2003
2110
  }
2004
2111
  }
2005
2112
  RecordTick(stats_, BYTES_READ, size);
2006
2113
  PERF_COUNTER_ADD(get_read_bytes, size);
2007
2114
  }
2008
- RecordInHistogram(stats_, BYTES_PER_READ, size);
2009
2115
 
2010
2116
  ReturnAndCleanupSuperVersion(cfd, sv);
2117
+
2118
+ RecordInHistogram(stats_, BYTES_PER_READ, size);
2011
2119
  }
2012
2120
  return s;
2013
2121
  }
@@ -2146,6 +2254,7 @@ std::vector<Status> DBImpl::MultiGet(
2146
2254
  if (!skip_memtable) {
2147
2255
  if (super_version->mem->Get(lkey, value, timestamp, &s, &merge_context,
2148
2256
  &max_covering_tombstone_seq, read_options,
2257
+ false /* immutable_memtable */,
2149
2258
  read_callback)) {
2150
2259
  done = true;
2151
2260
  RecordTick(stats_, MEMTABLE_HIT);
@@ -2682,7 +2791,8 @@ Status DBImpl::MultiGetImpl(
2682
2791
  (read_options.read_tier == kPersistedTier &&
2683
2792
  has_unpersisted_data_.load(std::memory_order_relaxed));
2684
2793
  if (!skip_memtable) {
2685
- super_version->mem->MultiGet(read_options, &range, callback);
2794
+ super_version->mem->MultiGet(read_options, &range, callback,
2795
+ false /* immutable_memtable */);
2686
2796
  if (!range.empty()) {
2687
2797
  super_version->imm->MultiGet(read_options, &range, callback);
2688
2798
  }
@@ -4753,7 +4863,8 @@ Status DBImpl::GetLatestSequenceForKey(
4753
4863
  // Check if there is a record for this key in the latest memtable
4754
4864
  sv->mem->Get(lkey, /*value=*/nullptr, timestamp, &s, &merge_context,
4755
4865
  &max_covering_tombstone_seq, seq, read_options,
4756
- nullptr /*read_callback*/, is_blob_index);
4866
+ false /* immutable_memtable */, nullptr /*read_callback*/,
4867
+ is_blob_index);
4757
4868
 
4758
4869
  if (!(s.ok() || s.IsNotFound() || s.IsMergeInProgress())) {
4759
4870
  // unexpected error reading memtable.
@@ -118,7 +118,6 @@ class Directories {
118
118
  IOStatus Close(const IOOptions& options, IODebugContext* dbg) {
119
119
  // close all directories for all database paths
120
120
  IOStatus s = IOStatus::OK();
121
- IOStatus temp_s = IOStatus::OK();
122
121
 
123
122
  // The default implementation for Close() in Directory/FSDirectory class
124
123
  // "NotSupported" status, the upper level interface should be able to
@@ -127,53 +126,35 @@ class Directories {
127
126
  // `FSDirectory::Close()` yet
128
127
 
129
128
  if (db_dir_) {
130
- temp_s = db_dir_->Close(options, dbg);
131
- if (!temp_s.ok()) {
132
- if (temp_s.IsNotSupported()) {
133
- temp_s.PermitUncheckedError();
134
- } else {
135
- s = temp_s;
136
- }
129
+ IOStatus temp_s = db_dir_->Close(options, dbg);
130
+ if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
131
+ s = std::move(temp_s);
137
132
  }
138
133
  }
139
134
 
140
- if (!s.ok()) {
141
- return s;
142
- }
135
+ // Attempt to close everything even if one fails
136
+ s.PermitUncheckedError();
143
137
 
144
138
  if (wal_dir_) {
145
- s = wal_dir_->Close(options, dbg);
146
- if (!temp_s.ok()) {
147
- if (temp_s.IsNotSupported()) {
148
- temp_s.PermitUncheckedError();
149
- } else {
150
- s = temp_s;
151
- }
139
+ IOStatus temp_s = wal_dir_->Close(options, dbg);
140
+ if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
141
+ s = std::move(temp_s);
152
142
  }
153
143
  }
154
144
 
155
- if (!s.ok()) {
156
- return s;
157
- }
145
+ s.PermitUncheckedError();
158
146
 
159
- if (data_dirs_.size() > 0 && s.ok()) {
160
- for (auto& data_dir_ptr : data_dirs_) {
161
- if (data_dir_ptr) {
162
- temp_s = data_dir_ptr->Close(options, dbg);
163
- if (!temp_s.ok()) {
164
- if (temp_s.IsNotSupported()) {
165
- temp_s.PermitUncheckedError();
166
- } else {
167
- return temp_s;
168
- }
169
- }
147
+ for (auto& data_dir_ptr : data_dirs_) {
148
+ if (data_dir_ptr) {
149
+ IOStatus temp_s = data_dir_ptr->Close(options, dbg);
150
+ if (!temp_s.ok() && !temp_s.IsNotSupported() && s.ok()) {
151
+ s = std::move(temp_s);
170
152
  }
171
153
  }
172
154
  }
173
155
 
174
- // Mark temp_s as checked when temp_s is still the initial status
175
- // (IOStatus::OK(), not checked yet)
176
- temp_s.PermitUncheckedError();
156
+ // Ready for caller
157
+ s.MustCheck();
177
158
  return s;
178
159
  }
179
160
 
@@ -2279,6 +2260,8 @@ class DBImpl : public DB {
2279
2260
  Status IncreaseFullHistoryTsLowImpl(ColumnFamilyData* cfd,
2280
2261
  std::string ts_low);
2281
2262
 
2263
+ bool ShouldReferenceSuperVersion(const MergeContext& merge_context);
2264
+
2282
2265
  // Lock over the persistent DB state. Non-nullptr iff successfully acquired.
2283
2266
  FileLock* db_lock_;
2284
2267
 
@@ -109,12 +109,18 @@ IOStatus DBImpl::SyncClosedLogs(JobContext* job_context,
109
109
  ROCKS_LOG_INFO(immutable_db_options_.info_log,
110
110
  "[JOB %d] Syncing log #%" PRIu64, job_context->job_id,
111
111
  log->get_log_number());
112
+ if (error_handler_.IsRecoveryInProgress()) {
113
+ log->file()->reset_seen_error();
114
+ }
112
115
  io_s = log->file()->Sync(immutable_db_options_.use_fsync);
113
116
  if (!io_s.ok()) {
114
117
  break;
115
118
  }
116
119
 
117
120
  if (immutable_db_options_.recycle_log_file_num > 0) {
121
+ if (error_handler_.IsRecoveryInProgress()) {
122
+ log->file()->reset_seen_error();
123
+ }
118
124
  io_s = log->Close();
119
125
  if (!io_s.ok()) {
120
126
  break;
@@ -229,6 +235,8 @@ Status DBImpl::FlushMemTableToOutputFile(
229
235
  mutex_.Lock();
230
236
  if (log_io_s.ok() && synced_wals.IsWalAddition()) {
231
237
  log_io_s = status_to_io_status(ApplyWALToManifest(&synced_wals));
238
+ TEST_SYNC_POINT_CALLBACK("DBImpl::FlushMemTableToOutputFile:CommitWal:1",
239
+ nullptr);
232
240
  }
233
241
 
234
242
  if (!log_io_s.ok() && !log_io_s.IsShutdownInProgress() &&
@@ -1686,8 +1694,7 @@ Status DBImpl::ReFitLevel(ColumnFamilyData* cfd, int level, int target_level) {
1686
1694
  f->smallest, f->largest, f->fd.smallest_seqno, f->fd.largest_seqno,
1687
1695
  f->marked_for_compaction, f->temperature, f->oldest_blob_file_number,
1688
1696
  f->oldest_ancester_time, f->file_creation_time, f->file_checksum,
1689
- f->file_checksum_func_name, f->min_timestamp, f->max_timestamp,
1690
- f->unique_id);
1697
+ f->file_checksum_func_name, f->unique_id);
1691
1698
  }
1692
1699
  ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
1693
1700
  "[%s] Apply version edit:\n%s", cfd->GetName().c_str(),
@@ -1853,8 +1860,7 @@ Status DBImpl::RunManualCompaction(
1853
1860
  // jobs drops to zero. This used to be needed to ensure that this manual
1854
1861
  // compaction can compact any range of keys/files. Now it is optional
1855
1862
  // (see `CompactRangeOptions::exclusive_manual_compaction`). The use case for
1856
- // `exclusive_manual_compaction=true` (the default) is unclear beyond not
1857
- // trusting the new code.
1863
+ // `exclusive_manual_compaction=true` is unclear beyond not trusting the code.
1858
1864
  //
1859
1865
  // HasPendingManualCompaction() is true when at least one thread is inside
1860
1866
  // RunManualCompaction(), i.e. during that time no other compaction will
@@ -3314,7 +3320,7 @@ Status DBImpl::BackgroundCompaction(bool* made_progress,
3314
3320
  f->fd.largest_seqno, f->marked_for_compaction, f->temperature,
3315
3321
  f->oldest_blob_file_number, f->oldest_ancester_time,
3316
3322
  f->file_creation_time, f->file_checksum, f->file_checksum_func_name,
3317
- f->min_timestamp, f->max_timestamp, f->unique_id);
3323
+ f->unique_id);
3318
3324
 
3319
3325
  ROCKS_LOG_BUFFER(
3320
3326
  log_buffer,