cpp: Call std::fflush() and ::fsync() before std::fclose() in FileWriter::end() #1343
+14
−0
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Changelog
FileWriter::end()
returnsDocs
None
Description
I've observed periodic data loss writing MCAP files where I destroy the
McapWriter
(which triggersFileWriter::end()
under the hood) then immediately callstd::rename()
to remove a.active
extension from the written MCAP file. Most of the time this works, but maybe ~5% of my MCAPs are missing data at the end where the final bytes of the file are a partial Chunk record.From my reading it looks like calling
std::fclose()
immediately followed bystd::rename()
may not be safe if there are writes that haven't flushed to disk. This change adds additional calls tostd::fflush()
and::fsync()
to guarantee the OS has delivered all pending writes to the physical media beforeFileWriter::end()
returns, and hence before mystd::rename()
call.This change was manually tested, I am still monitoring but haven't seen any partial writes since deploying this fix locally.