diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-05-20 14:32:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-20 14:32:10 +0200 |
commit | cfa6ec5cdbd1cf39558d3f85101de05230d6c225 (patch) | |
tree | 32534899cc6f59a2284e293246d8764d2953e654 | |
parent | c735cf68e73e7a4bb9130d24ea1509a86ae51ddf (diff) | |
parent | e28d123621518fec965940f98f84b3fbc680fb47 (diff) |
Merge pull request #22686 from vespa-engine/toregge/avoid-compacted-size-calculation-wraparound-and-always-flush-active-filechunk
Avoid wraparound when calculating compacted size.
-rw-r--r-- | searchlib/src/vespa/searchlib/docstore/logdatastore.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp b/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp index b991773c50f..51a4d392839 100644 --- a/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp +++ b/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp @@ -450,7 +450,10 @@ void LogDataStore::compactFile(FileId fileId) IWriteData::UP compacter; FileId destinationFileId = FileId::active(); if (_bucketizer) { - if ( ! shouldCompactToActiveFile(fc->getDiskFootprint() - fc->getDiskBloat())) { + size_t disk_footprint = fc->getDiskFootprint(); + size_t disk_bloat = fc->getDiskBloat(); + size_t compacted_size = (disk_footprint <= disk_bloat) ? 0u : (disk_footprint - disk_bloat); + if ( ! shouldCompactToActiveFile(compacted_size)) { MonitorGuard guard(_updateLock); destinationFileId = allocateFileId(guard); setNewFileChunk(guard, createWritableFile(destinationFileId, fc->getLastPersistedSerialNum(), fc->getNameId().next())); @@ -464,9 +467,8 @@ void LogDataStore::compactFile(FileId fileId) fc->appendTo(_executor, *this, *compacter, fc->getNumChunks(), nullptr, CpuCategory::COMPACT); - if (destinationFileId.isActive()) { - flushActiveAndWait(0); - } else { + flushActiveAndWait(0); + if (!destinationFileId.isActive()) { MonitorGuard guard(_updateLock); auto & compactTo = dynamic_cast<WriteableFileChunk &>(*_fileChunks[destinationFileId.getId()]); flushFileAndWait(std::move(guard), compactTo, 0); |