Check the flush and sync on session file writes

good() was checked before close(), where the data is actually flushed.
This commit is contained in:
noctuum
2026-09-13 08:44:32 +05:00
committed by Jari Sundell
parent 641626029a
commit c41e63248a
+13 -3
View File
@@ -127,8 +127,12 @@ save_stream(const std::string& path, bool use_fsyncdisk, const std::stringstream
if (!output.good()) if (!output.good())
throw torrent::storage_error("failed to write stream to file : " + path); throw torrent::storage_error("failed to write stream to file : " + path);
// The data only reaches the kernel here, so this is where a full disk is seen.
output.close(); output.close();
if (!output.good())
throw torrent::storage_error("failed to flush stream to file : " + path);
// Ensure that the new file is actually written to the disk // Ensure that the new file is actually written to the disk
int fd = ::open(path.c_str(), O_WRONLY); int fd = ::open(path.c_str(), O_WRONLY);
@@ -137,13 +141,19 @@ save_stream(const std::string& path, bool use_fsyncdisk, const std::stringstream
if (use_fsyncdisk) { if (use_fsyncdisk) {
#ifdef __APPLE__ #ifdef __APPLE__
::fsync(fd); int sync_result = ::fsync(fd);
#else #else
::fdatasync(fd); int sync_result = ::fdatasync(fd);
#endif #endif
if (sync_result == -1) {
::close(fd);
throw torrent::storage_error("failed to sync file to disk : " + path);
}
} }
::close(fd); if (::close(fd) == -1)
throw torrent::storage_error("failed to close file descriptor : " + path);
} }
} // namespace anonymous } // namespace anonymous