Skip to content

Commit 82b5a2d

Browse files
cbi42facebook-github-bot
authored andcommitted
Allow ingestion of any DB generated SST file (facebook#13878)
Summary: `IngestExternalFileOptions::allow_db_generated_files` requires SST files to have zero sequence number. This PR opens it up for any DB generated SST files. Currently we don't do global sequence number assignment when `allow_db_generated_files` is true, so we require that files do not overlap with any key in the CF. One behavior difference is that now we allow ingesting overlapping files when `allow_db_generated_files` is true. Users need to ensure that files are ordered such that later files have more recent updates. Intended follow ups: - Record smallest seqno in table property, so that we don't need to scan the file for it. - Cover allow_db_generated_files in crash test. We may create a new DB and ingest all files from a CF for verification. - Add APIs that uses allow_db_generated_files. For example, an API for ingesting SST files from a source CF, so that we take care of ingestion file ordering for user. If we are already getting metadata from the source CF, we may be use it as a hint for level placement instead of dividing input files into batches again (`ExternalSstFileIngestionJob::DivideInputFilesIntoBatches`). Pull Request resolved: facebook#13878 Test Plan: two new unit tests. Reviewed By: hx235, xingbowang Differential Revision: D80233727 Pulled By: cbi42 fbshipit-source-id: 74209386d8426c434bff2d9a734f06db537eb50c
1 parent 439e170 commit 82b5a2d

12 files changed

Lines changed: 815 additions & 197 deletions

File tree

db/db_impl/db_impl.cc

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6009,18 +6009,19 @@ Status DBImpl::IngestExternalFiles(
60096009
// mutex when persisting MANIFEST file, and the snapshots taken during
60106010
// that period will not be stable if VersionSet last seqno is updated
60116011
// before LogAndApply.
6012-
int consumed_seqno_count =
6013-
ingestion_jobs[0].ConsumedSequenceNumbersCount();
6012+
SequenceNumber max_assigned_seqno =
6013+
ingestion_jobs[0].MaxAssignedSequenceNumber();
60146014
for (size_t i = 1; i != num_cfs; ++i) {
6015-
consumed_seqno_count =
6016-
std::max(consumed_seqno_count,
6017-
ingestion_jobs[i].ConsumedSequenceNumbersCount());
6015+
max_assigned_seqno = std::max(
6016+
max_assigned_seqno, ingestion_jobs[i].MaxAssignedSequenceNumber());
60186017
}
6019-
if (consumed_seqno_count > 0) {
6018+
if (max_assigned_seqno > 0) {
60206019
const SequenceNumber last_seqno = versions_->LastSequence();
6021-
versions_->SetLastAllocatedSequence(last_seqno + consumed_seqno_count);
6022-
versions_->SetLastPublishedSequence(last_seqno + consumed_seqno_count);
6023-
versions_->SetLastSequence(last_seqno + consumed_seqno_count);
6020+
if (max_assigned_seqno > last_seqno) {
6021+
versions_->SetLastAllocatedSequence(max_assigned_seqno);
6022+
versions_->SetLastPublishedSequence(max_assigned_seqno);
6023+
versions_->SetLastSequence(max_assigned_seqno);
6024+
}
60246025
}
60256026
}
60266027

db/db_test_util.cc

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,16 +1154,18 @@ size_t DBTestBase::CountLiveFiles() {
11541154
}
11551155

11561156
int DBTestBase::NumTableFilesAtLevel(int level, int cf) {
1157-
std::string property;
1158-
if (cf == 0) {
1159-
// default cfd
1160-
EXPECT_TRUE(db_->GetProperty(
1161-
"rocksdb.num-files-at-level" + std::to_string(level), &property));
1162-
} else {
1163-
EXPECT_TRUE(db_->GetProperty(
1164-
handles_[cf], "rocksdb.num-files-at-level" + std::to_string(level),
1165-
&property));
1157+
return NumTableFilesAtLevel(level,
1158+
cf ? handles_[cf] : db_->DefaultColumnFamily());
1159+
}
1160+
1161+
int DBTestBase::NumTableFilesAtLevel(int level, ColumnFamilyHandle* cfh,
1162+
DB* db) {
1163+
if (!db) {
1164+
db = db_;
11661165
}
1166+
std::string property;
1167+
EXPECT_TRUE(db->GetProperty(
1168+
cfh, "rocksdb.num-files-at-level" + std::to_string(level), &property));
11671169
return atoi(property.c_str());
11681170
}
11691171

@@ -1196,12 +1198,22 @@ int DBTestBase::TotalTableFiles(int cf, int levels) {
11961198

11971199
// Return spread of files per level
11981200
std::string DBTestBase::FilesPerLevel(int cf) {
1199-
int num_levels =
1200-
(cf == 0) ? db_->NumberLevels() : db_->NumberLevels(handles_[cf]);
1201+
if (cf == 0) {
1202+
return FilesPerLevel(db_->DefaultColumnFamily());
1203+
} else {
1204+
return FilesPerLevel(handles_[cf]);
1205+
}
1206+
}
1207+
1208+
std::string DBTestBase::FilesPerLevel(ColumnFamilyHandle* cfh, DB* db) {
1209+
if (!db) {
1210+
db = db_;
1211+
}
1212+
int num_levels = db->NumberLevels(cfh);
12011213
std::string result;
12021214
size_t last_non_zero_offset = 0;
12031215
for (int level = 0; level < num_levels; level++) {
1204-
int f = NumTableFilesAtLevel(level, cf);
1216+
int f = NumTableFilesAtLevel(level, cfh, db);
12051217
char buf[100];
12061218
snprintf(buf, sizeof(buf), "%s%d", (level ? "," : ""), f);
12071219
result += buf;
@@ -1334,12 +1346,14 @@ void DBTestBase::FillLevels(const std::string& smallest,
13341346
}
13351347

13361348
void DBTestBase::MoveFilesToLevel(int level, int cf) {
1349+
MoveFilesToLevel(level, cf ? handles_[cf] : db_->DefaultColumnFamily());
1350+
}
1351+
1352+
void DBTestBase::MoveFilesToLevel(int level, ColumnFamilyHandle* column_family,
1353+
DB* db) {
1354+
DBImpl* db_impl = db ? static_cast<DBImpl*>(db) : dbfull();
13371355
for (int l = 0; l < level; ++l) {
1338-
if (cf > 0) {
1339-
EXPECT_OK(dbfull()->TEST_CompactRange(l, nullptr, nullptr, handles_[cf]));
1340-
} else {
1341-
EXPECT_OK(dbfull()->TEST_CompactRange(l, nullptr, nullptr));
1342-
}
1356+
EXPECT_OK(db_impl->TEST_CompactRange(l, nullptr, nullptr, column_family));
13431357
}
13441358
}
13451359

db/db_test_util.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,9 @@ class DBTestBase : public testing::Test {
12801280

12811281
int NumTableFilesAtLevel(int level, int cf = 0);
12821282

1283+
int NumTableFilesAtLevel(int level, ColumnFamilyHandle* column_family,
1284+
DB* db = nullptr);
1285+
12831286
double CompressionRatioAtLevel(int level, int cf = 0);
12841287

12851288
int TotalTableFiles(int cf = 0, int levels = -1);
@@ -1289,6 +1292,8 @@ class DBTestBase : public testing::Test {
12891292
// Return spread of files per level
12901293
std::string FilesPerLevel(int cf = 0);
12911294

1295+
std::string FilesPerLevel(ColumnFamilyHandle* cfh, DB* db = nullptr);
1296+
12921297
size_t CountFiles();
12931298

12941299
Status CountFiles(size_t* count);
@@ -1320,6 +1325,9 @@ class DBTestBase : public testing::Test {
13201325

13211326
void MoveFilesToLevel(int level, int cf = 0);
13221327

1328+
void MoveFilesToLevel(int level, ColumnFamilyHandle* column_family,
1329+
DB* db = nullptr);
1330+
13231331
void DumpFileCounts(const char* label);
13241332

13251333
std::string DumpSSTableList();

0 commit comments

Comments
 (0)