mirror of
https://github.com/kevinveenbirkenbach/docker-volume-backup.git
synced 2026-10-20 01:43:25 +00:00
fix(backup): let the stopped copy replace a failed live pre-copy
A volume whose containers must stop was copied twice: live first, then with the containers stopped and --checksum. A live writer that truncates a file under rsync (read errors mapping ...: No data available (61), exit 23) aborted the run in the first pass, before the containers were stopped, although the second pass rewrites every differing file anyway. Seen in infinito-nexus CI on kix_kix_shared/objecticons. The live copy now only warns when a stopped copy follows. Without a stop it stays the only copy and still fails the run, and a failing stopped copy still fails it. The e2e test drives a writer that shrinks files mid-read; without the fix it reproduces the CI failure verbatim. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,7 @@ from .layout import (
|
||||
write_manifest,
|
||||
)
|
||||
from .policy import requires_stop, volume_is_fully_ignored
|
||||
from .shell import BackupError
|
||||
from .snapshot import snapshot_source, volume_snapshot
|
||||
from .volume import backup_volume, inspect_backing
|
||||
|
||||
@@ -125,13 +126,23 @@ def main() -> int:
|
||||
copy(authoritative=False)
|
||||
continue
|
||||
|
||||
copy(authoritative=False)
|
||||
if requires_stop(containers, args.images_no_stop_required):
|
||||
stoppable = filter_stoppable(containers)
|
||||
change_containers_status(stoppable, "stop")
|
||||
copy(authoritative=True)
|
||||
if not args.shutdown:
|
||||
change_containers_status(stoppable, "start")
|
||||
if not requires_stop(containers, args.images_no_stop_required):
|
||||
copy(authoritative=False)
|
||||
continue
|
||||
|
||||
try:
|
||||
copy(authoritative=False)
|
||||
except BackupError as error:
|
||||
print(
|
||||
f"WARNING: live pre-copy of volume '{volume_name}' failed; "
|
||||
f"the copy with its containers stopped replaces it.\n{error}",
|
||||
flush=True,
|
||||
)
|
||||
stoppable = filter_stoppable(containers)
|
||||
change_containers_status(stoppable, "stop")
|
||||
copy(authoritative=True)
|
||||
if not args.shutdown:
|
||||
change_containers_status(stoppable, "start")
|
||||
|
||||
write_manifest(version_dir, outcomes)
|
||||
stamp_directory(version_dir)
|
||||
|
||||
Reference in New Issue
Block a user