Merge #16212: addrdb: Avoid eating inodes - remove temporary files created by SerializeFileDB in case of errors
d9753383b9
addrdb: Remove temporary files created in SerializeFileDB. Fixes non-determinism in unit tests. (practicalswift) Pull request description: Remove temporary files created in `SerializeFileDB` in case of errors. _Edit: Previously this was hit non-deterministically from the tests: that is no longer the case but the cleanup issue remains :-)_ ACKs for top commit: laanwj: code-review ACKd9753383b9
Tree-SHA512: e72b74b8de411f433bd8bb354cacae07ab75a240db6232bc6a37802ccd8086bff5275ce3d196ddde033d8ab9e2794bb8f60eb83554af7ec2e9f91d6186cb4647
This commit is contained in:
commit
3ccab6470a
1 changed files with 16 additions and 4 deletions
|
@ -44,18 +44,30 @@ bool SerializeFileDB(const std::string& prefix, const fs::path& path, const Data
|
||||||
fs::path pathTmp = GetDataDir() / tmpfn;
|
fs::path pathTmp = GetDataDir() / tmpfn;
|
||||||
FILE *file = fsbridge::fopen(pathTmp, "wb");
|
FILE *file = fsbridge::fopen(pathTmp, "wb");
|
||||||
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
CAutoFile fileout(file, SER_DISK, CLIENT_VERSION);
|
||||||
if (fileout.IsNull())
|
if (fileout.IsNull()) {
|
||||||
|
fileout.fclose();
|
||||||
|
remove(pathTmp);
|
||||||
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
return error("%s: Failed to open file %s", __func__, pathTmp.string());
|
||||||
|
}
|
||||||
|
|
||||||
// Serialize
|
// Serialize
|
||||||
if (!SerializeDB(fileout, data)) return false;
|
if (!SerializeDB(fileout, data)) {
|
||||||
if (!FileCommit(fileout.Get()))
|
fileout.fclose();
|
||||||
|
remove(pathTmp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!FileCommit(fileout.Get())) {
|
||||||
|
fileout.fclose();
|
||||||
|
remove(pathTmp);
|
||||||
return error("%s: Failed to flush file %s", __func__, pathTmp.string());
|
return error("%s: Failed to flush file %s", __func__, pathTmp.string());
|
||||||
|
}
|
||||||
fileout.fclose();
|
fileout.fclose();
|
||||||
|
|
||||||
// replace existing file, if any, with new file
|
// replace existing file, if any, with new file
|
||||||
if (!RenameOver(pathTmp, path))
|
if (!RenameOver(pathTmp, path)) {
|
||||||
|
remove(pathTmp);
|
||||||
return error("%s: Rename-into-place failed", __func__);
|
return error("%s: Rename-into-place failed", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue