fix: copy through a temporary file so a cut-short copy is not kept
Build and publish container / build (pull_request) Canceled after 2m6s
Build and publish container / build (pull_request) Canceled after 2m6s
Copies of already-MP3 sources were written straight to their destination while encodes went via a temporary file and a rename. A copy interrupted by a full disk, a killed container or an I/O error therefore left a truncated MP3 in the mirror -- and because shutil.copy2 reproduces the source's mtime along with its bytes, staleness detection would read that fragment as up to date and never replace it. The damage is silent and permanent until someone plays the track. Give copy the same temporary-file-and-rename path encode already uses, so the destination either has the whole file or has nothing.
This commit is contained in:
@@ -51,9 +51,11 @@ The mtime is read _before_ encoding rather than after. A file still being
|
||||
written when the pass reaches it would otherwise be stamped with its final
|
||||
mtime while holding truncated audio, and never be revisited.
|
||||
|
||||
Encodes are written to a temporary file and renamed into place, so an
|
||||
interrupted run cannot leave a truncated MP3 that the next run mistakes for
|
||||
finished work. A lock file in the mirror root stops two passes overlapping.
|
||||
Both encodes and copies are written to a temporary file and renamed into place,
|
||||
so an interrupted run cannot leave a truncated MP3 that the next run mistakes
|
||||
for finished work. Copies need it as much as encodes do: the mtime comes across
|
||||
with the bytes, so a half-written copy would look current for ever. A lock file
|
||||
in the mirror root stops two passes overlapping.
|
||||
|
||||
### Permissions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user