@@ -1693,7 +1693,17 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data,
1693
1693
delete column_family_data;
1694
1694
}
1695
1695
} 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
+ }
1697
1707
AppendVersion (column_family_data, v);
1698
1708
}
1699
1709
@@ -1746,10 +1756,8 @@ void VersionSet::LogAndApplyHelper(ColumnFamilyData* cfd, Builder* builder,
1746
1756
1747
1757
if (edit->has_log_number_ ) {
1748
1758
assert (edit->log_number_ >= cfd->GetLogNumber ());
1749
- } else {
1750
- edit->SetLogNumber (cfd->GetLogNumber ());
1759
+ assert (edit->log_number_ < next_file_number_);
1751
1760
}
1752
- assert (edit->log_number_ < next_file_number_);
1753
1761
1754
1762
if (!edit->has_prev_log_number_ ) {
1755
1763
edit->SetPrevLogNumber (prev_log_number_);
@@ -1923,6 +1931,10 @@ Status VersionSet::Recover(
1923
1931
1924
1932
if (cfd != nullptr ) {
1925
1933
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
+ }
1926
1938
cfd->SetLogNumber (edit.log_number_ );
1927
1939
have_log_number = true ;
1928
1940
}
0 commit comments