@nxtedition/rocksdb 11.0.2 → 11.0.4

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 (134) hide show
  1. package/binding.cc +133 -122
  2. package/deps/rocksdb/rocksdb/db/column_family_test.cc +15 -7
  3. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  4. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -4
  5. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +11 -7
  6. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +17 -11
  7. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +15 -0
  8. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +155 -0
  9. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +564 -461
  10. package/deps/rocksdb/rocksdb/db/db_follower_test.cc +8 -4
  11. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +40 -24
  12. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +8 -1
  13. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +7 -4
  14. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
  15. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -1
  16. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +19 -1
  17. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +20 -16
  18. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +27 -0
  19. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +10 -2
  20. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +85 -0
  21. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +55 -2
  22. package/deps/rocksdb/rocksdb/db/db_test2.cc +231 -0
  23. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  24. package/deps/rocksdb/rocksdb/db/db_test_util.h +10 -1
  25. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +0 -1
  26. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +175 -1
  27. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +64 -0
  28. package/deps/rocksdb/rocksdb/db/dbformat.h +5 -6
  29. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +8 -8
  30. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
  31. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2 -4
  32. package/deps/rocksdb/rocksdb/db/flush_job.cc +7 -2
  33. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +4 -2
  34. package/deps/rocksdb/rocksdb/db/listener_test.cc +5 -5
  35. package/deps/rocksdb/rocksdb/db/log_writer.cc +12 -3
  36. package/deps/rocksdb/rocksdb/db/memtable.cc +83 -23
  37. package/deps/rocksdb/rocksdb/db/memtable.h +11 -3
  38. package/deps/rocksdb/rocksdb/db/memtable_list.cc +7 -5
  39. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +21 -0
  40. package/deps/rocksdb/rocksdb/db/version_builder.cc +462 -33
  41. package/deps/rocksdb/rocksdb/db/version_builder.h +70 -23
  42. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +95 -207
  43. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +54 -35
  44. package/deps/rocksdb/rocksdb/db/version_set.cc +13 -11
  45. package/deps/rocksdb/rocksdb/db/version_set_test.cc +313 -59
  46. package/deps/rocksdb/rocksdb/db/write_batch.cc +124 -64
  47. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -3
  48. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +1 -1
  49. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -1
  50. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +9 -0
  51. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +4 -32
  52. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -3
  53. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +60 -172
  54. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +57 -2
  55. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +23 -15
  56. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +2 -3
  57. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +1 -1
  58. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +4 -1
  59. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +200 -92
  60. package/deps/rocksdb/rocksdb/env/file_system.cc +3 -3
  61. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +124 -23
  62. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +61 -8
  63. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +141 -2
  64. package/deps/rocksdb/rocksdb/file/file_util.cc +17 -2
  65. package/deps/rocksdb/rocksdb/file/file_util.h +10 -0
  66. package/deps/rocksdb/rocksdb/file/filename.cc +11 -3
  67. package/deps/rocksdb/rocksdb/file/filename.h +2 -1
  68. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +18 -0
  69. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +27 -4
  70. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +8 -1
  71. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +8 -13
  72. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -0
  73. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  74. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -2
  75. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +2 -1
  76. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +34 -0
  77. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -1
  78. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  79. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +27 -9
  80. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +2 -0
  81. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +12 -0
  82. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
  83. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  84. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +29 -1
  85. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +102 -33
  86. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +46 -3
  87. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +4 -0
  88. package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -0
  89. package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
  90. package/deps/rocksdb/rocksdb/options/db_options.cc +15 -1
  91. package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
  92. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -0
  93. package/deps/rocksdb/rocksdb/options/options_parser.cc +3 -2
  94. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -2
  95. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +75 -35
  96. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -0
  97. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +4 -0
  98. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +8 -1
  99. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +40 -15
  100. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +98 -17
  101. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +14 -2
  102. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +21 -91
  103. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +13 -21
  104. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +14 -5
  105. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +62 -53
  106. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +60 -38
  107. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +175 -78
  108. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +65 -36
  109. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +25 -15
  110. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +13 -1
  111. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +18 -4
  112. package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
  113. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +11 -0
  114. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2 -2
  115. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +47 -18
  116. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +1 -2
  117. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +95 -0
  118. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +26 -15
  119. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +62 -19
  120. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +73 -34
  121. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  122. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +10 -3
  123. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +2 -1
  124. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +8 -5
  125. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +7 -4
  126. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +225 -0
  127. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -1
  128. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -0
  129. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +5 -2
  130. package/index.js +5 -17
  131. package/iterator.js +9 -1
  132. package/package.json +1 -1
  133. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  134. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -11,6 +11,7 @@
11
11
 
12
12
  #include <algorithm>
13
13
 
14
+ #include "db/blob/blob_log_writer.h"
14
15
  #include "db/db_impl/db_impl.h"
15
16
  #include "db/db_test_util.h"
16
17
  #include "db/log_writer.h"
@@ -1345,18 +1346,27 @@ class VersionSetTestBase {
1345
1346
  std::string key; // the only key
1346
1347
  int level = 0;
1347
1348
  uint64_t epoch_number;
1349
+ bool file_missing = false;
1350
+ uint64_t oldest_blob_file_number = kInvalidBlobFileNumber;
1348
1351
  SstInfo(uint64_t file_num, const std::string& cf_name,
1349
1352
  const std::string& _key,
1350
- uint64_t _epoch_number = kUnknownEpochNumber)
1351
- : SstInfo(file_num, cf_name, _key, 0, _epoch_number) {}
1353
+ uint64_t _epoch_number = kUnknownEpochNumber,
1354
+ bool _file_missing = false,
1355
+ uint64_t _oldest_blob_file_number = kInvalidBlobFileNumber)
1356
+ : SstInfo(file_num, cf_name, _key, 0, _epoch_number, _file_missing,
1357
+ _oldest_blob_file_number) {}
1352
1358
  SstInfo(uint64_t file_num, const std::string& cf_name,
1353
1359
  const std::string& _key, int lvl,
1354
- uint64_t _epoch_number = kUnknownEpochNumber)
1360
+ uint64_t _epoch_number = kUnknownEpochNumber,
1361
+ bool _file_missing = false,
1362
+ uint64_t _oldest_blob_file_number = kInvalidBlobFileNumber)
1355
1363
  : file_number(file_num),
1356
1364
  column_family(cf_name),
1357
1365
  key(_key),
1358
1366
  level(lvl),
1359
- epoch_number(_epoch_number) {}
1367
+ epoch_number(_epoch_number),
1368
+ file_missing(_file_missing),
1369
+ oldest_blob_file_number(_oldest_blob_file_number) {}
1360
1370
  };
1361
1371
 
1362
1372
  // Create dummy sst, return their metadata. Note that only file name and size
@@ -1395,22 +1405,32 @@ class VersionSetTestBase {
1395
1405
  ASSERT_NE(0, file_size);
1396
1406
  file_metas->emplace_back(
1397
1407
  file_num, /*file_path_id=*/0, file_size, ikey, ikey, 0, 0, false,
1398
- Temperature::kUnknown, 0, 0, 0, info.epoch_number,
1399
- kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2,
1400
- 0, 0, /* user_defined_timestamps_persisted */ true);
1408
+ Temperature::kUnknown, info.oldest_blob_file_number, 0, 0,
1409
+ info.epoch_number, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
1410
+ kNullUniqueId64x2, 0, 0,
1411
+ /* user_defined_timestamps_persisted */ true);
1412
+ if (info.file_missing) {
1413
+ ASSERT_OK(fs_->DeleteFile(fname, IOOptions(), nullptr));
1414
+ }
1401
1415
  }
1402
1416
  }
1403
1417
 
1418
+ void CreateCurrentFile() {
1419
+ // Make "CURRENT" file point to the new manifest file.
1420
+ ASSERT_OK(SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
1421
+ Temperature::kUnknown,
1422
+ /* dir_contains_current_file */ nullptr));
1423
+ }
1424
+
1404
1425
  // Create DB with 3 column families.
1405
1426
  void NewDB() {
1406
1427
  SequenceNumber last_seqno;
1407
1428
  std::unique_ptr<log::Writer> log_writer;
1408
- ASSERT_OK(SetIdentityFile(WriteOptions(), env_, dbname_));
1429
+ ASSERT_OK(
1430
+ SetIdentityFile(WriteOptions(), env_, dbname_, Temperature::kUnknown));
1409
1431
  PrepareManifest(&column_families_, &last_seqno, &log_writer);
1410
1432
  log_writer.reset();
1411
- // Make "CURRENT" file point to the new manifest file.
1412
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr);
1413
- ASSERT_OK(s);
1433
+ CreateCurrentFile();
1414
1434
 
1415
1435
  EXPECT_OK(versions_->Recover(column_families_, false));
1416
1436
  EXPECT_EQ(column_families_.size(),
@@ -2586,7 +2606,7 @@ class VersionSetAtomicGroupTest : public VersionSetTestBase,
2586
2606
  edits_[i].MarkAtomicGroup(--remaining);
2587
2607
  edits_[i].SetLastSequence(last_seqno_++);
2588
2608
  }
2589
- ASSERT_OK(SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr));
2609
+ CreateCurrentFile();
2590
2610
  }
2591
2611
 
2592
2612
  void SetupIncompleteTrailingAtomicGroup(int atomic_group_size) {
@@ -2598,7 +2618,7 @@ class VersionSetAtomicGroupTest : public VersionSetTestBase,
2598
2618
  edits_[i].MarkAtomicGroup(--remaining);
2599
2619
  edits_[i].SetLastSequence(last_seqno_++);
2600
2620
  }
2601
- ASSERT_OK(SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr));
2621
+ CreateCurrentFile();
2602
2622
  }
2603
2623
 
2604
2624
  void SetupCorruptedAtomicGroup(int atomic_group_size) {
@@ -2612,7 +2632,7 @@ class VersionSetAtomicGroupTest : public VersionSetTestBase,
2612
2632
  }
2613
2633
  edits_[i].SetLastSequence(last_seqno_++);
2614
2634
  }
2615
- ASSERT_OK(SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr));
2635
+ CreateCurrentFile();
2616
2636
  }
2617
2637
 
2618
2638
  void SetupIncorrectAtomicGroup(int atomic_group_size) {
@@ -2628,7 +2648,7 @@ class VersionSetAtomicGroupTest : public VersionSetTestBase,
2628
2648
  }
2629
2649
  edits_[i].SetLastSequence(last_seqno_++);
2630
2650
  }
2631
- ASSERT_OK(SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr));
2651
+ CreateCurrentFile();
2632
2652
  }
2633
2653
 
2634
2654
  void SetupTestSyncPoints() {
@@ -3394,8 +3414,7 @@ TEST_P(VersionSetTestDropOneCF, HandleDroppedColumnFamilyInAtomicGroup) {
3394
3414
  SequenceNumber last_seqno;
3395
3415
  std::unique_ptr<log::Writer> log_writer;
3396
3416
  PrepareManifest(&column_families, &last_seqno, &log_writer);
3397
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr);
3398
- ASSERT_OK(s);
3417
+ CreateCurrentFile();
3399
3418
 
3400
3419
  EXPECT_OK(versions_->Recover(column_families, false /* read_only */));
3401
3420
  EXPECT_EQ(column_families.size(),
@@ -3417,7 +3436,7 @@ TEST_P(VersionSetTestDropOneCF, HandleDroppedColumnFamilyInAtomicGroup) {
3417
3436
  cfd_to_drop->Ref();
3418
3437
  drop_cf_edit.SetColumnFamily(cfd_to_drop->GetID());
3419
3438
  mutex_.Lock();
3420
- s = versions_->LogAndApply(
3439
+ Status s = versions_->LogAndApply(
3421
3440
  cfd_to_drop, *cfd_to_drop->GetLatestMutableCFOptions(), read_options,
3422
3441
  write_options, &drop_cf_edit, &mutex_, nullptr);
3423
3442
  mutex_.Unlock();
@@ -3527,9 +3546,7 @@ class EmptyDefaultCfNewManifest : public VersionSetTestBase,
3527
3546
  TEST_F(EmptyDefaultCfNewManifest, Recover) {
3528
3547
  PrepareManifest(nullptr, nullptr, &log_writer_);
3529
3548
  log_writer_.reset();
3530
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3531
- /* dir_contains_current_file */ nullptr);
3532
- ASSERT_OK(s);
3549
+ CreateCurrentFile();
3533
3550
  std::string manifest_path;
3534
3551
  VerifyManifest(&manifest_path);
3535
3552
  std::vector<ColumnFamilyDescriptor> column_families;
@@ -3538,7 +3555,7 @@ TEST_F(EmptyDefaultCfNewManifest, Recover) {
3538
3555
  cf_options_);
3539
3556
  std::string db_id;
3540
3557
  bool has_missing_table_file = false;
3541
- s = versions_->TryRecoverFromOneManifest(
3558
+ Status s = versions_->TryRecoverFromOneManifest(
3542
3559
  manifest_path, column_families, false, &db_id, &has_missing_table_file);
3543
3560
  ASSERT_OK(s);
3544
3561
  ASSERT_FALSE(has_missing_table_file);
@@ -3559,7 +3576,8 @@ class VersionSetTestEmptyDb
3559
3576
  assert(nullptr != log_writer);
3560
3577
  VersionEdit new_db;
3561
3578
  if (db_options_.write_dbid_to_manifest) {
3562
- ASSERT_OK(SetIdentityFile(WriteOptions(), env_, dbname_));
3579
+ ASSERT_OK(SetIdentityFile(WriteOptions(), env_, dbname_,
3580
+ Temperature::kUnknown));
3563
3581
  DBOptions tmp_db_options;
3564
3582
  tmp_db_options.env = env_;
3565
3583
  std::unique_ptr<DBImpl> impl(new DBImpl(tmp_db_options, dbname_));
@@ -3592,9 +3610,7 @@ TEST_P(VersionSetTestEmptyDb, OpenFromIncompleteManifest0) {
3592
3610
  db_options_.write_dbid_to_manifest = std::get<0>(GetParam());
3593
3611
  PrepareManifest(nullptr, nullptr, &log_writer_);
3594
3612
  log_writer_.reset();
3595
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3596
- /* dir_contains_current_file */ nullptr);
3597
- ASSERT_OK(s);
3613
+ CreateCurrentFile();
3598
3614
 
3599
3615
  std::string manifest_path;
3600
3616
  VerifyManifest(&manifest_path);
@@ -3609,9 +3625,9 @@ TEST_P(VersionSetTestEmptyDb, OpenFromIncompleteManifest0) {
3609
3625
 
3610
3626
  std::string db_id;
3611
3627
  bool has_missing_table_file = false;
3612
- s = versions_->TryRecoverFromOneManifest(manifest_path, column_families,
3613
- read_only, &db_id,
3614
- &has_missing_table_file);
3628
+ Status s = versions_->TryRecoverFromOneManifest(
3629
+ manifest_path, column_families, read_only, &db_id,
3630
+ &has_missing_table_file);
3615
3631
  auto iter =
3616
3632
  std::find(cf_names.begin(), cf_names.end(), kDefaultColumnFamilyName);
3617
3633
  if (iter == cf_names.end()) {
@@ -3637,9 +3653,7 @@ TEST_P(VersionSetTestEmptyDb, OpenFromIncompleteManifest1) {
3637
3653
  ASSERT_OK(s);
3638
3654
  }
3639
3655
  log_writer_.reset();
3640
- s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3641
- /* dir_contains_current_file */ nullptr);
3642
- ASSERT_OK(s);
3656
+ CreateCurrentFile();
3643
3657
 
3644
3658
  std::string manifest_path;
3645
3659
  VerifyManifest(&manifest_path);
@@ -3685,9 +3699,7 @@ TEST_P(VersionSetTestEmptyDb, OpenFromInCompleteManifest2) {
3685
3699
  ASSERT_OK(s);
3686
3700
  }
3687
3701
  log_writer_.reset();
3688
- s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3689
- /* dir_contains_current_file */ nullptr);
3690
- ASSERT_OK(s);
3702
+ CreateCurrentFile();
3691
3703
 
3692
3704
  std::string manifest_path;
3693
3705
  VerifyManifest(&manifest_path);
@@ -3744,9 +3756,7 @@ TEST_P(VersionSetTestEmptyDb, OpenManifestWithUnknownCF) {
3744
3756
  ASSERT_OK(s);
3745
3757
  }
3746
3758
  log_writer_.reset();
3747
- s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3748
- /* dir_contains_current_file */ nullptr);
3749
- ASSERT_OK(s);
3759
+ CreateCurrentFile();
3750
3760
 
3751
3761
  std::string manifest_path;
3752
3762
  VerifyManifest(&manifest_path);
@@ -3802,9 +3812,7 @@ TEST_P(VersionSetTestEmptyDb, OpenCompleteManifest) {
3802
3812
  ASSERT_OK(s);
3803
3813
  }
3804
3814
  log_writer_.reset();
3805
- s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1,
3806
- /* dir_contains_current_file */ nullptr);
3807
- ASSERT_OK(s);
3815
+ CreateCurrentFile();
3808
3816
 
3809
3817
  std::string manifest_path;
3810
3818
  VerifyManifest(&manifest_path);
@@ -3869,8 +3877,9 @@ INSTANTIATE_TEST_CASE_P(
3869
3877
  class VersionSetTestMissingFiles : public VersionSetTestBase,
3870
3878
  public testing::Test {
3871
3879
  public:
3872
- VersionSetTestMissingFiles()
3873
- : VersionSetTestBase("version_set_test_missing_files"),
3880
+ explicit VersionSetTestMissingFiles(
3881
+ const std::string& test_name = "version_set_test_missing_files")
3882
+ : VersionSetTestBase(test_name),
3874
3883
  internal_comparator_(
3875
3884
  std::make_shared<InternalKeyComparator>(options_.comparator)) {}
3876
3885
 
@@ -3947,7 +3956,8 @@ class VersionSetTestMissingFiles : public VersionSetTestBase,
3947
3956
  // This method updates last_sequence_.
3948
3957
  void WriteFileAdditionAndDeletionToManifest(
3949
3958
  uint32_t cf, const std::vector<std::pair<int, FileMetaData>>& added_files,
3950
- const std::vector<std::pair<int, uint64_t>>& deleted_files) {
3959
+ const std::vector<std::pair<int, uint64_t>>& deleted_files,
3960
+ const std::vector<BlobFileAddition>& blob_files = {}) {
3951
3961
  VersionEdit edit;
3952
3962
  edit.SetColumnFamily(cf);
3953
3963
  for (const auto& elem : added_files) {
@@ -3958,6 +3968,9 @@ class VersionSetTestMissingFiles : public VersionSetTestBase,
3958
3968
  int level = elem.first;
3959
3969
  edit.DeleteFile(level, elem.second);
3960
3970
  }
3971
+ for (const auto& elem : blob_files) {
3972
+ edit.AddBlobFile(elem);
3973
+ }
3961
3974
  edit.SetLastSequence(last_seqno_);
3962
3975
  ++last_seqno_;
3963
3976
  assert(log_writer_.get() != nullptr);
@@ -4006,15 +4019,14 @@ TEST_F(VersionSetTestMissingFiles, ManifestFarBehindSst) {
4006
4019
  WriteFileAdditionAndDeletionToManifest(
4007
4020
  /*cf=*/0, std::vector<std::pair<int, FileMetaData>>(), deleted_files);
4008
4021
  log_writer_.reset();
4009
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr);
4010
- ASSERT_OK(s);
4022
+ CreateCurrentFile();
4011
4023
  std::string manifest_path;
4012
4024
  VerifyManifest(&manifest_path);
4013
4025
  std::string db_id;
4014
4026
  bool has_missing_table_file = false;
4015
- s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
4016
- /*read_only=*/false, &db_id,
4017
- &has_missing_table_file);
4027
+ Status s = versions_->TryRecoverFromOneManifest(
4028
+ manifest_path, column_families_,
4029
+ /*read_only=*/false, &db_id, &has_missing_table_file);
4018
4030
  ASSERT_OK(s);
4019
4031
  ASSERT_TRUE(has_missing_table_file);
4020
4032
  for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
@@ -4064,15 +4076,14 @@ TEST_F(VersionSetTestMissingFiles, ManifestAheadofSst) {
4064
4076
  WriteFileAdditionAndDeletionToManifest(
4065
4077
  /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>());
4066
4078
  log_writer_.reset();
4067
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr);
4068
- ASSERT_OK(s);
4079
+ CreateCurrentFile();
4069
4080
  std::string manifest_path;
4070
4081
  VerifyManifest(&manifest_path);
4071
4082
  std::string db_id;
4072
4083
  bool has_missing_table_file = false;
4073
- s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
4074
- /*read_only=*/false, &db_id,
4075
- &has_missing_table_file);
4084
+ Status s = versions_->TryRecoverFromOneManifest(
4085
+ manifest_path, column_families_,
4086
+ /*read_only=*/false, &db_id, &has_missing_table_file);
4076
4087
  ASSERT_OK(s);
4077
4088
  ASSERT_TRUE(has_missing_table_file);
4078
4089
  for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
@@ -4118,15 +4129,14 @@ TEST_F(VersionSetTestMissingFiles, NoFileMissing) {
4118
4129
  WriteFileAdditionAndDeletionToManifest(
4119
4130
  /*cf=*/0, std::vector<std::pair<int, FileMetaData>>(), deleted_files);
4120
4131
  log_writer_.reset();
4121
- Status s = SetCurrentFile(WriteOptions(), fs_.get(), dbname_, 1, nullptr);
4122
- ASSERT_OK(s);
4132
+ CreateCurrentFile();
4123
4133
  std::string manifest_path;
4124
4134
  VerifyManifest(&manifest_path);
4125
4135
  std::string db_id;
4126
4136
  bool has_missing_table_file = false;
4127
- s = versions_->TryRecoverFromOneManifest(manifest_path, column_families_,
4128
- /*read_only=*/false, &db_id,
4129
- &has_missing_table_file);
4137
+ Status s = versions_->TryRecoverFromOneManifest(
4138
+ manifest_path, column_families_,
4139
+ /*read_only=*/false, &db_id, &has_missing_table_file);
4130
4140
  ASSERT_OK(s);
4131
4141
  ASSERT_FALSE(has_missing_table_file);
4132
4142
  for (ColumnFamilyData* cfd : *(versions_->GetColumnFamilySet())) {
@@ -4171,6 +4181,250 @@ TEST_F(VersionSetTestMissingFiles, MinLogNumberToKeep2PC) {
4171
4181
  }
4172
4182
  }
4173
4183
 
4184
+ class BestEffortsRecoverIncompleteVersionTest
4185
+ : public VersionSetTestMissingFiles {
4186
+ public:
4187
+ BestEffortsRecoverIncompleteVersionTest()
4188
+ : VersionSetTestMissingFiles("best_efforts_recover_incomplete_version") {}
4189
+
4190
+ struct BlobInfo {
4191
+ uint64_t file_number;
4192
+ bool file_missing;
4193
+ std::string key;
4194
+ std::string blob;
4195
+ BlobInfo(uint64_t _file_number, bool _file_missing, std::string _key,
4196
+ std::string _blob)
4197
+ : file_number(_file_number),
4198
+ file_missing(_file_missing),
4199
+ key(_key),
4200
+ blob(_blob) {}
4201
+ };
4202
+
4203
+ void CreateDummyBlobFiles(const std::vector<BlobInfo>& infos,
4204
+ std::vector<BlobFileAddition>* blob_metas) {
4205
+ for (const auto& info : infos) {
4206
+ if (!info.file_missing) {
4207
+ WriteDummyBlobFile(info.file_number, info.key, info.blob);
4208
+ }
4209
+ blob_metas->emplace_back(
4210
+ info.file_number, 1 /*total_blob_count*/,
4211
+ info.key.size() + info.blob.size() /*total_blob_bytes*/,
4212
+ "" /*checksum_method*/, "" /*check_sum_value*/);
4213
+ }
4214
+ }
4215
+ // Creates a test blob file that is valid so it can pass the
4216
+ // `VersionEditHandlerPointInTime::VerifyBlobFile` check.
4217
+ void WriteDummyBlobFile(uint64_t blob_file_number, const Slice& key,
4218
+ const Slice& blob) {
4219
+ ImmutableOptions options;
4220
+ std::string blob_file_path = BlobFileName(dbname_, blob_file_number);
4221
+
4222
+ std::unique_ptr<FSWritableFile> file;
4223
+ ASSERT_OK(
4224
+ fs_->NewWritableFile(blob_file_path, FileOptions(), &file, nullptr));
4225
+
4226
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
4227
+ std::move(file), blob_file_path, FileOptions(), options.clock));
4228
+
4229
+ BlobLogWriter blob_log_writer(std::move(file_writer), options.clock,
4230
+ /*statistics*/ nullptr, blob_file_number,
4231
+ /*use_fsync*/ true,
4232
+ /*do_flush*/ false);
4233
+
4234
+ constexpr ExpirationRange expiration_range;
4235
+ BlobLogHeader header(/*column_family_id*/ 0, kNoCompression,
4236
+ /*has_ttl*/ false, expiration_range);
4237
+ ASSERT_OK(blob_log_writer.WriteHeader(WriteOptions(), header));
4238
+ std::string compressed_blob;
4239
+ uint64_t key_offset = 0;
4240
+ uint64_t blob_offset = 0;
4241
+ ASSERT_OK(blob_log_writer.AddRecord(WriteOptions(), key, blob, &key_offset,
4242
+ &blob_offset));
4243
+ BlobLogFooter footer;
4244
+ footer.blob_count = 1;
4245
+ footer.expiration_range = expiration_range;
4246
+ std::string checksum_method;
4247
+ std::string checksum_value;
4248
+ ASSERT_OK(blob_log_writer.AppendFooter(WriteOptions(), footer,
4249
+ &checksum_method, &checksum_value));
4250
+ }
4251
+
4252
+ void RecoverFromManifestWithMissingFiles(
4253
+ const std::vector<std::pair<int, FileMetaData>>& added_files,
4254
+ const std::vector<BlobFileAddition>& blob_files) {
4255
+ PrepareManifest(&column_families_, &last_seqno_, &log_writer_);
4256
+ WriteFileAdditionAndDeletionToManifest(
4257
+ /*cf=*/0, added_files, std::vector<std::pair<int, uint64_t>>(),
4258
+ blob_files);
4259
+ log_writer_.reset();
4260
+ CreateCurrentFile();
4261
+ std::string manifest_path;
4262
+ VerifyManifest(&manifest_path);
4263
+ std::string db_id;
4264
+ bool has_missing_table_file = false;
4265
+ Status s = versions_->TryRecoverFromOneManifest(
4266
+ manifest_path, column_families_,
4267
+ /*read_only=*/false, &db_id, &has_missing_table_file);
4268
+ ASSERT_OK(s);
4269
+ ASSERT_TRUE(has_missing_table_file);
4270
+ }
4271
+ };
4272
+
4273
+ TEST_F(BestEffortsRecoverIncompleteVersionTest, NonL0MissingFiles) {
4274
+ std::vector<SstInfo> sst_files = {
4275
+ SstInfo(100, kDefaultColumnFamilyName, "a", 1 /* level */,
4276
+ 100 /* epoch_number */, true /* file_missing */),
4277
+ SstInfo(101, kDefaultColumnFamilyName, "a", 0 /* level */,
4278
+ 101 /* epoch_number */, false /* file_missing */),
4279
+ SstInfo(102, kDefaultColumnFamilyName, "a", 0 /* level */,
4280
+ 102 /* epoch_number */, false /* file_missing */),
4281
+ };
4282
+ std::vector<FileMetaData> file_metas;
4283
+ CreateDummyTableFiles(sst_files, &file_metas);
4284
+
4285
+ std::vector<std::pair<int, FileMetaData>> added_files;
4286
+ for (size_t i = 0; i < sst_files.size(); i++) {
4287
+ const auto& info = sst_files[i];
4288
+ const auto& meta = file_metas[i];
4289
+ added_files.emplace_back(info.level, meta);
4290
+ }
4291
+ RecoverFromManifestWithMissingFiles(added_files,
4292
+ std::vector<BlobFileAddition>());
4293
+ std::vector<uint64_t> all_table_files;
4294
+ std::vector<uint64_t> all_blob_files;
4295
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
4296
+ ASSERT_TRUE(all_table_files.empty());
4297
+ }
4298
+
4299
+ TEST_F(BestEffortsRecoverIncompleteVersionTest, MissingNonSuffixL0Files) {
4300
+ std::vector<SstInfo> sst_files = {
4301
+ SstInfo(100, kDefaultColumnFamilyName, "a", 1 /* level */,
4302
+ 100 /* epoch_number */, false /* file_missing */),
4303
+ SstInfo(101, kDefaultColumnFamilyName, "a", 0 /* level */,
4304
+ 101 /* epoch_number */, true /* file_missing */),
4305
+ SstInfo(102, kDefaultColumnFamilyName, "a", 0 /* level */,
4306
+ 102 /* epoch_number */, false /* file_missing */),
4307
+ };
4308
+ std::vector<FileMetaData> file_metas;
4309
+ CreateDummyTableFiles(sst_files, &file_metas);
4310
+
4311
+ std::vector<std::pair<int, FileMetaData>> added_files;
4312
+ for (size_t i = 0; i < sst_files.size(); i++) {
4313
+ const auto& info = sst_files[i];
4314
+ const auto& meta = file_metas[i];
4315
+ added_files.emplace_back(info.level, meta);
4316
+ }
4317
+ RecoverFromManifestWithMissingFiles(added_files,
4318
+ std::vector<BlobFileAddition>());
4319
+ std::vector<uint64_t> all_table_files;
4320
+ std::vector<uint64_t> all_blob_files;
4321
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
4322
+ ASSERT_TRUE(all_table_files.empty());
4323
+ }
4324
+
4325
+ TEST_F(BestEffortsRecoverIncompleteVersionTest, MissingBlobFiles) {
4326
+ std::vector<SstInfo> sst_files = {
4327
+ SstInfo(100, kDefaultColumnFamilyName, "a", 0 /* level */,
4328
+ 100 /* epoch_number */, false /* file_missing */,
4329
+ 102 /*oldest_blob_file_number*/),
4330
+ SstInfo(101, kDefaultColumnFamilyName, "a", 0 /* level */,
4331
+ 101 /* epoch_number */, false /* file_missing */,
4332
+ 103 /*oldest_blob_file_number*/),
4333
+ };
4334
+ std::vector<FileMetaData> file_metas;
4335
+ CreateDummyTableFiles(sst_files, &file_metas);
4336
+
4337
+ std::vector<BlobInfo> blob_files = {
4338
+ BlobInfo(102, true /*file_missing*/, "a", "blob1"),
4339
+ BlobInfo(103, true /*file_missing*/, "a", "blob2"),
4340
+ };
4341
+ std::vector<BlobFileAddition> blob_meta;
4342
+ CreateDummyBlobFiles(blob_files, &blob_meta);
4343
+
4344
+ std::vector<std::pair<int, FileMetaData>> added_files;
4345
+ for (size_t i = 0; i < sst_files.size(); i++) {
4346
+ const auto& info = sst_files[i];
4347
+ const auto& meta = file_metas[i];
4348
+ added_files.emplace_back(info.level, meta);
4349
+ }
4350
+ RecoverFromManifestWithMissingFiles(added_files, blob_meta);
4351
+ std::vector<uint64_t> all_table_files;
4352
+ std::vector<uint64_t> all_blob_files;
4353
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
4354
+ ASSERT_TRUE(all_table_files.empty());
4355
+ }
4356
+
4357
+ TEST_F(BestEffortsRecoverIncompleteVersionTest, MissingL0SuffixOnly) {
4358
+ std::vector<SstInfo> sst_files = {
4359
+ SstInfo(100, kDefaultColumnFamilyName, "a", 1 /* level */,
4360
+ 100 /* epoch_number */, false /* file_missing */),
4361
+ SstInfo(101, kDefaultColumnFamilyName, "a", 0 /* level */,
4362
+ 101 /* epoch_number */, false /* file_missing */),
4363
+ SstInfo(102, kDefaultColumnFamilyName, "a", 0 /* level */,
4364
+ 102 /* epoch_number */, true /* file_missing */),
4365
+ };
4366
+ std::vector<FileMetaData> file_metas;
4367
+ CreateDummyTableFiles(sst_files, &file_metas);
4368
+
4369
+ std::vector<std::pair<int, FileMetaData>> added_files;
4370
+ for (size_t i = 0; i < sst_files.size(); i++) {
4371
+ const auto& info = sst_files[i];
4372
+ const auto& meta = file_metas[i];
4373
+ added_files.emplace_back(info.level, meta);
4374
+ }
4375
+ RecoverFromManifestWithMissingFiles(added_files,
4376
+ std::vector<BlobFileAddition>());
4377
+ std::vector<uint64_t> all_table_files;
4378
+ std::vector<uint64_t> all_blob_files;
4379
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
4380
+ ASSERT_EQ(2, all_table_files.size());
4381
+ ColumnFamilyData* cfd = versions_->GetColumnFamilySet()->GetDefault();
4382
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
4383
+ ASSERT_EQ(1, vstorage->LevelFiles(0).size());
4384
+ ASSERT_EQ(1, vstorage->LevelFiles(1).size());
4385
+ }
4386
+
4387
+ TEST_F(BestEffortsRecoverIncompleteVersionTest,
4388
+ MissingL0SuffixAndTheirBlobFiles) {
4389
+ std::vector<SstInfo> sst_files = {
4390
+ SstInfo(100, kDefaultColumnFamilyName, "a", 1 /* level */,
4391
+ 100 /* epoch_number */, false /* file_missing */),
4392
+ SstInfo(101, kDefaultColumnFamilyName, "a", 0 /* level */,
4393
+ 101 /* epoch_number */, false /* file_missing */,
4394
+ 103 /*oldest_blob_file_number*/),
4395
+ SstInfo(102, kDefaultColumnFamilyName, "a", 0 /* level */,
4396
+ 102 /* epoch_number */, true /* file_missing */,
4397
+ 104 /*oldest_blob_file_number*/),
4398
+ };
4399
+ std::vector<FileMetaData> file_metas;
4400
+ CreateDummyTableFiles(sst_files, &file_metas);
4401
+
4402
+ std::vector<BlobInfo> blob_files = {
4403
+ BlobInfo(103, false /*file_missing*/, "a", "blob1"),
4404
+ BlobInfo(104, true /*file_missing*/, "a", "blob2"),
4405
+ };
4406
+ std::vector<BlobFileAddition> blob_meta;
4407
+ CreateDummyBlobFiles(blob_files, &blob_meta);
4408
+
4409
+ std::vector<std::pair<int, FileMetaData>> added_files;
4410
+ for (size_t i = 0; i < sst_files.size(); i++) {
4411
+ const auto& info = sst_files[i];
4412
+ const auto& meta = file_metas[i];
4413
+ added_files.emplace_back(info.level, meta);
4414
+ }
4415
+ RecoverFromManifestWithMissingFiles(added_files, blob_meta);
4416
+ std::vector<uint64_t> all_table_files;
4417
+ std::vector<uint64_t> all_blob_files;
4418
+ versions_->AddLiveFiles(&all_table_files, &all_blob_files);
4419
+ ASSERT_EQ(2, all_table_files.size());
4420
+ ASSERT_EQ(1, all_blob_files.size());
4421
+ ColumnFamilyData* cfd = versions_->GetColumnFamilySet()->GetDefault();
4422
+ VersionStorageInfo* vstorage = cfd->current()->storage_info();
4423
+ ASSERT_EQ(1, vstorage->LevelFiles(0).size());
4424
+ ASSERT_EQ(1, vstorage->LevelFiles(1).size());
4425
+ ASSERT_EQ(1, vstorage->GetBlobFiles().size());
4426
+ }
4427
+
4174
4428
  class ChargeFileMetadataTest : public DBTestBase {
4175
4429
  public:
4176
4430
  ChargeFileMetadataTest()