Skip to content

Commit

Permalink
Fix compactions that could end up breaking a run of the same user
Browse files Browse the repository at this point in the history
key across multiple files.

As reported in Github issue google#339, it is incorrect to split the
same user key across multiple compacted files since it causes
tombstones/newer-versions to be dropped, thereby exposing obsolete
data. There was a fix for google#339, but it ended up not fully fixing
the problem. (It checked for boundary problems in the first level
being compacted, but not the second). This problem was revealed
by Github issue 887.

We now adjust boundaries to avoid splitting user keys in both the
first level and the second level.

PiperOrigin-RevId: 374921082
  • Loading branch information
ghemawat authored and fanquake committed Jun 11, 2024
1 parent 13f036f commit c412d67
Showing 1 changed file with 2 additions and 0 deletions.
2 changes: 2 additions & 0 deletions db/version_set.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1392,6 +1392,7 @@ void VersionSet::SetupOtherInputs(Compaction* c) {

current_->GetOverlappingInputs(level + 1, &smallest, &largest,
&c->inputs_[1]);
AddBoundaryInputs(icmp_, current_->files_[level + 1], &c->inputs_[1]);

// Get entire range covered by compaction
InternalKey all_start, all_limit;
Expand All @@ -1414,6 +1415,7 @@ void VersionSet::SetupOtherInputs(Compaction* c) {
std::vector<FileMetaData*> expanded1;
current_->GetOverlappingInputs(level + 1, &new_start, &new_limit,
&expanded1);
AddBoundaryInputs(icmp_, current_->files_[level + 1], &expanded1);
if (expanded1.size() == c->inputs_[1].size()) {
Log(options_->info_log,
"Expanding@%d %d+%d (%ld+%ld bytes) to %d+%d (%ld+%ld bytes)\n",
Expand Down

0 comments on commit c412d67

Please sign in to comment.