PR #595 fixed the test-harness watchdog that let a wedged crawl take down the Windows x64 runner ("the hosted runner lost communication with the server"). That fix reaps and bounds a hang, but it does not explain why a crawl ran long enough to matter.
Every CI crawl runs with --max-time=120, so no single one should exceed about two minutes. During the 2026-07-15 x64 failure burst the job instead ran its full 45-minute step budget. That points to one of two causes: a crawl ran well past --max-time, or the harness alone accounts for the time (a native httrack.exe that timeout could not signal, left orphaned, plus a failure-path re-run that had no watchdog). #595 fixed the harness side. This issue is about the engine side.
--max-time is enforced by a periodic poll: back_checkmirror / back_mirror_limit in src/htsback.c request a smooth stop past the deadline and hard-stop after a grace (added in #481). The poll only runs while the crawl loop runs. Reads go through select() with a timeout rather than blocking (htsback.c:2641), so a stuck transfer should still let the loop tick, which makes a real --max-time failure less likely than it first looked. Winsocks select()does diverge from POSIX here (#579: a failed connect shows up in the exception set, not as writable), so a Windows-only path where the loop stalls without--max-time` firing is possible but unconfirmed.
There is no reproducer, and it is intermittent and x64-only. Now that #595 caps every test at 600s, a crawl that genuinely wedges past --max-time will show up as a clean 600s timeout of a specific *_local-*.test, not a silent runner death. Concrete next step: if such a timeout appears on x64, capture that tests hts-log.txt and check whether the "More than 120 seconds passed.. giving up" line is present, along with the stuck slots state. If nothing recurs, #595 resolved the symptom and this can be closed.
PR #595 fixed the test-harness watchdog that let a wedged crawl take down the Windows x64 runner ("the hosted runner lost communication with the server"). That fix reaps and bounds a hang, but it does not explain why a crawl ran long enough to matter.
Every CI crawl runs with
--max-time=120, so no single one should exceed about two minutes. During the 2026-07-15 x64 failure burst the job instead ran its full 45-minute step budget. That points to one of two causes: a crawl ran well past--max-time, or the harness alone accounts for the time (a nativehttrack.exethattimeoutcould not signal, left orphaned, plus a failure-path re-run that had no watchdog). #595 fixed the harness side. This issue is about the engine side.--max-timeis enforced by a periodic poll:back_checkmirror/back_mirror_limitinsrc/htsback.crequest a smooth stop past the deadline and hard-stop after a grace (added in #481). The poll only runs while the crawl loop runs. Reads go throughselect()with a timeout rather than blocking (htsback.c:2641), so a stuck transfer should still let the loop tick, which makes a real--max-timefailure less likely than it first looked. Winsocksselect()does diverge from POSIX here (#579: a failed connect shows up in the exception set, not as writable), so a Windows-only path where the loop stalls without--max-time` firing is possible but unconfirmed.There is no reproducer, and it is intermittent and x64-only. Now that #595 caps every test at 600s, a crawl that genuinely wedges past
--max-timewill show up as a clean 600s timeout of a specific*_local-*.test, not a silent runner death. Concrete next step: if such a timeout appears on x64, capture that testshts-log.txtand check whether the "More than 120 seconds passed.. giving up" line is present, along with the stuck slots state. If nothing recurs, #595 resolved the symptom and this can be closed.