(bugfix) Reconcile failed dry-runs from rsync terminal logs
Classify rsync failures in run results so transport issues such as exit 255 and broken pipes show clearer diagnostic hints. Teach the worker to reconcile running dry-runs when their log already contains a terminal rsync error, and to fail stale dry-runs after their timeout window. This prevents failed rsync processes from leaving runs stuck in the running state indefinitely.
This commit is contained in:
@@ -66,6 +66,30 @@ class RunScheduledConfigSourceTests(SimpleTestCase):
|
||||
self.assertFalse(result["ok"])
|
||||
self.assertEqual(result["rsync"]["exit_code"], 12)
|
||||
self.assertEqual(result["rsync"]["log_tail"], ["Permission denied (publickey).", "rsync error"])
|
||||
self.assertEqual(result["failure"]["category"], "permissions")
|
||||
|
||||
def test_failed_dry_run_classifies_broken_pipe(self) -> None:
|
||||
def fake_run_rsync(command, log_path, timeout_seconds, cancel_check=None):
|
||||
log_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
log_path.write_text(
|
||||
"rsync error: unexplained error (code 255) at rsync.c(716) [generator=3.4.1]\n"
|
||||
"rsync: [generator] write error: Broken pipe (32)\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
return RsyncResult(exit_code=255, command=command)
|
||||
|
||||
with patch("pobsync.commands.run_scheduled.run_rsync", side_effect=fake_run_rsync):
|
||||
result = run_scheduled(
|
||||
prefix=Path("/missing-prefix"),
|
||||
host="web-01",
|
||||
dry_run=True,
|
||||
config_source=FakeConfigSource(),
|
||||
)
|
||||
|
||||
self.assertFalse(result["ok"])
|
||||
self.assertEqual(result["rsync"]["exit_code"], 255)
|
||||
self.assertEqual(result["failure"]["category"], "transport")
|
||||
self.assertIn("broken pipe", result["failure"]["hint"].lower())
|
||||
|
||||
def test_dry_run_clears_previous_log_before_running(self) -> None:
|
||||
def fake_run_rsync(command, log_path, timeout_seconds, cancel_check=None):
|
||||
|
||||
Reference in New Issue
Block a user