diff options
| author | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-02 16:44:57 +0000 |
|---|---|---|
| committer | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-02 16:44:57 +0000 |
| commit | 74f1d8598a6f603fdfaf6c0487375c40166b76ec (patch) | |
| tree | 78300c2b30621c356461396392eb774139ab236d | |
| parent | cc21a1db50c14c0c41986e9137432e5ba8918b2d (diff) | |
log: do not latch the roll off when logrotate won the race
The latch added in 456b3b4 treats every rename() failure as permanent. One
is not: if an external rotator moves debug.log between the size check and
the rename, the rename fails ENOENT. Nothing is wrong -- the file has just
been rotated by someone else, and the reopen above has already recreated
it -- but latching there would switch the cap off for the rest of the run
on a race the operator cannot see or fix.
Treat ENOENT as "already rotated" and carry on. It cannot loop: the reopen
leaves an empty file, so the next line's size check does not fire.
| -rw-r--r-- | src/util.h | 9 |
1 files changed, 9 insertions, 0 deletions
| @@ -429,6 +429,15 @@ inline int OutputDebugStringF(const char* pszFormat, ...) | |||
| 429 | "debug.log grew past %lld MB; previous contents moved to debug.log.old (-maxdebugfilesize)\n", | 429 | "debug.log grew past %lld MB; previous contents moved to debug.log.old (-maxdebugfilesize)\n", |
| 430 | (long long)(nMaxDebugFileSize / 1024 / 1024)); | 430 | (long long)(nMaxDebugFileSize / 1024 / 1024)); |
| 431 | } | 431 | } |
| 432 | else if (nRenameErrno == ENOENT) | ||
| 433 | { | ||
| 434 | // The file went away between the size check and the | ||
| 435 | // rename, so an external rotator (logrotate) got there | ||
| 436 | // first. Nothing left to roll and nothing wrong: the | ||
| 437 | // fopen above has already recreated it. Latching on this | ||
| 438 | // would let a benign race with logrotate switch the cap | ||
| 439 | // off for the rest of the run. | ||
| 440 | } | ||
| 432 | else | 441 | else |
| 433 | { | 442 | { |
| 434 | // The file is still over the cap, so this branch would be | 443 | // The file is still over the cap, so this branch would be |