Skip to content

ops(dns): stale container resolver order cost the #1947 sweep 12 models, and sweep_extra wrote a false EXTRA_COMPLETE over it #3031

Description

@Xore

Two defects, one incident. The DNS half is #2974 living on inside long-running
containers; the bookkeeping half is the false-completion class that #2971's
review already caught once on the pull path and once on the Tier B path.

What happened

Between 15:42:49Z and 15:47:09Z — four and a half minutes — the #1947 phase-2
sweep failed to pull twelve consecutive models, each in about 20 seconds, and
then wrote EXTRA_COMPLETE:

15:42:49 PULL_FAILED …/Qwen3.6-27B-uncensored-heretic-v2-Native-MTP-Preserved-i1-GGUF:i1-Q4_K_M
15:43:10 PULL_FAILED …/Glimmer-Sentry-30B-GGUF:Q4_K_M
15:43:30 PULL_FAILED …/ThinkingCap-Qwen3.6-27B-MTP-GGUF:latest
15:44:12 PULL_FAILED …/Chimera-Qwen3.8-27B-Cyber-v1-GGUF:Q4_K_M
15:44:33 PULL_FAILED …/Colibri_8b_v0.1-GGUF:Q4_K_M
15:44:53 PULL_FAILED …/NeoBase_8b_v0.2-GGUF:Q4_K_M
15:45:26 PULL_FAILED …/LOREA-cyber-v5.8:latest
15:45:47 PULL_FAILED …/Colibri_8b_v0.1-GGUF:f16
15:46:07 PULL_FAILED …/Ornith-1.0-35B-uncensored-heretic-GGUF:Q3_K_M
15:46:28 PULL_FAILED …/gemma-4-26B-A4B-it-ultra-uncensored-heretic-GGUF:Q3_K_M
15:46:49 PULL_FAILED …/gemma-4-26B-A4B-it-ultra-uncensored-heretic-GGUF:Q4_K_M
15:47:09 PULL_FAILED …/gemma-4-26B-A4B-it-ultra-uncensored-heretic-GGUF:Q5_K_M
15:47:09 EXTRA_COMPLETE

All twelve carry the same error:

dial tcp: lookup hf.co on 127.0.0.11:53: read udp …->127.0.0.11:53: i/o timeout

Three of those twelve are the gemma-4-26B-A4B Q3/Q4/Q5 quant ladder — the
promote candidate from PR #2641, i.e. the highest-value cells left in phase 2.

Root cause: the container resolver still has the pre-#2974 order

#2974 fixed the host, which now correctly puts the Technitium cluster first:

$ grep ^nameserver /etc/resolv.conf
nameserver 192.168.42.253
nameserver 192.168.42.250
nameserver 1.1.1.1
nameserver 8.8.8.8

ghidra-ollama-1 has been up 30 hours — since before that fix — and Docker's
embedded resolver snapshots the host list at container start:

$ docker exec ghidra-ollama-1 grep ExtServers /etc/resolv.conf
# ExtServers: [host(1.1.1.1) host(8.8.8.8) host(192.168.42.253) host(192.168.42.250)]

Public resolvers first. And port 53 egress to them is blocked on this LAN —
measured, not assumed:

1.1.1.1          TIMEOUT/blocked
8.8.8.8          TIMEOUT/blocked
192.168.42.253   responds

So every container lookup burns the timeout on two dead servers before falling
through to a working one. Measured cost inside the container: ~8 seconds for a
single getent hosts
. Ollama's pull has a 30 s per-request deadline (#2728), so
under any additional latency the pull dies — and it dies deterministically,
which is why twelve models fell in a row rather than intermittently.

It resolves eventually, which is why nothing noticed until it didn't.

Second defect: EXTRA_COMPLETE is written unconditionally

sweep_extra.sh:159 writes EXTRA_COMPLETE when the roster loop ends, regardless
of how many entries failed. This is the third appearance of the same class:

mark_unmeasured() did its job and wrote UNMEASURED_<slug>.status for all
twelve, so the rows are not silently scored as zero. But EXTRA_COMPLETE is what
the phase chain keys on, so the marker is the only thing standing between this and
"phase 2 finished".

A completion marker should encode the failure count, or not be written at all
when the failure rate exceeds a threshold. Twelve consecutive PULL_FAILED in
four minutes is not a completed roster under any reading.

Recovery

Refs #1947, #2974, #2971, #2985, #2728, #2641

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingmlML worker and GPU scoringopsDeployment, runners, observability, host access

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions