Skip to content

Commit a782bb9

Browse files
committed
Fix log_number in LogAndApply
1 parent 8b169e9 commit a782bb9

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

db/version_set.cc

+16-4
Original file line numberDiff line numberDiff line change
@@ -1693,7 +1693,17 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data,
16931693
delete column_family_data;
16941694
}
16951695
} else {
1696-
column_family_data->SetLogNumber(batch_edits.back()->log_number_);
1696+
uint64_t max_log_number_in_batch = 0;
1697+
for (auto& e : batch_edits) {
1698+
if (e->has_log_number_) {
1699+
max_log_number_in_batch =
1700+
std::max(max_log_number_in_batch, e->log_number_);
1701+
}
1702+
}
1703+
if (max_log_number_in_batch != 0) {
1704+
assert(column_family_data->GetLogNumber() < max_log_number_in_batch);
1705+
column_family_data->SetLogNumber(max_log_number_in_batch);
1706+
}
16971707
AppendVersion(column_family_data, v);
16981708
}
16991709

@@ -1746,10 +1756,8 @@ void VersionSet::LogAndApplyHelper(ColumnFamilyData* cfd, Builder* builder,
17461756

17471757
if (edit->has_log_number_) {
17481758
assert(edit->log_number_ >= cfd->GetLogNumber());
1749-
} else {
1750-
edit->SetLogNumber(cfd->GetLogNumber());
1759+
assert(edit->log_number_ < next_file_number_);
17511760
}
1752-
assert(edit->log_number_ < next_file_number_);
17531761

17541762
if (!edit->has_prev_log_number_) {
17551763
edit->SetPrevLogNumber(prev_log_number_);
@@ -1923,6 +1931,10 @@ Status VersionSet::Recover(
19231931

19241932
if (cfd != nullptr) {
19251933
if (edit.has_log_number_) {
1934+
if (cfd->GetLogNumber() > edit.log_number_) {
1935+
s = Status::Corruption(
1936+
"Log Numbers in MANIFEST are not always increasing");
1937+
}
19261938
cfd->SetLogNumber(edit.log_number_);
19271939
have_log_number = true;
19281940
}

0 commit comments

Comments
 (0)