@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.
- package/binding.cc +133 -122
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +15 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +11 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +17 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +15 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +155 -0
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +564 -461
- package/deps/rocksdb/rocksdb/db/db_follower_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +40 -24
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +8 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +7 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +19 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +20 -16
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +27 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +10 -2
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +85 -0
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +55 -2
- package/deps/rocksdb/rocksdb/db/db_test2.cc +231 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +10 -1
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +175 -1
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +64 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +5 -6
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +7 -2
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/listener_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/log_writer.cc +12 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +83 -23
- package/deps/rocksdb/rocksdb/db/memtable.h +11 -3
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +7 -5
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/version_builder.cc +462 -33
- package/deps/rocksdb/rocksdb/db/version_builder.h +70 -23
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +95 -207
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +54 -35
- package/deps/rocksdb/rocksdb/db/version_set.cc +13 -11
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +313 -59
- package/deps/rocksdb/rocksdb/db/write_batch.cc +124 -64
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +2 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +9 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +4 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +60 -172
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +57 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +23 -15
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +2 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +200 -92
- package/deps/rocksdb/rocksdb/env/file_system.cc +3 -3
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +124 -23
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +61 -8
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +141 -2
- package/deps/rocksdb/rocksdb/file/file_util.cc +17 -2
- package/deps/rocksdb/rocksdb/file/file_util.h +10 -0
- package/deps/rocksdb/rocksdb/file/filename.cc +11 -3
- package/deps/rocksdb/rocksdb/file/filename.h +2 -1
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +18 -0
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +27 -4
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +8 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +8 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +34 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +27 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +12 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +29 -1
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +102 -33
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +46 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +4 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +6 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -0
- package/deps/rocksdb/rocksdb/options/options_parser.cc +3 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +75 -35
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +4 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +8 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +40 -15
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +98 -17
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +14 -2
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +21 -91
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +13 -21
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +14 -5
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +62 -53
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +60 -38
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +175 -78
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +65 -36
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +25 -15
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +13 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +18 -4
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +4 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +11 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +47 -18
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +95 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +26 -15
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +62 -19
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +73 -34
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +10 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +8 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +7 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +225 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +5 -2
- package/index.js +5 -17
- package/iterator.js +9 -1
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- 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
|
-
|
|
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,
|
|
1399
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1400
|
-
0, 0,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
3613
|
-
|
|
3614
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
4016
|
-
|
|
4017
|
-
|
|
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
|
-
|
|
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(
|
|
4074
|
-
|
|
4075
|
-
|
|
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
|
-
|
|
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(
|
|
4128
|
-
|
|
4129
|
-
|
|
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()
|