- No frame re-enters itself directly. Every call in the trace is to a different frame.
resolvebottomed out atd-128.resolvecallsexpand.emitpeaked at32 MBof stack.- The frame that reached
d-4kpeaked at256 MB. - Whatever calls
inlinealso peaked at256 MB. - The frame that calls
expanddid not reach2 GB. inlinedid not stop atd-512.- Recovered from frame 4096 of the cascade, between two identical stack traces:
nx::src=…
09 / all the way down
The repair service had opened four hundred thousand tickets against itself.
[ALERT] INC-0009 — Autorepair cascade, unbounded
[INFO ] unwind budget: d-8k
[WARN ] frames open: 412,880 and climbing
[WARN ] resident stack: 2.0 GB
[CRITC] defect queue is being produced faster than it is consumed
[CRITC] producer: autorepair
[CRITC] consumer: autorepair
It had started, as far as anyone could reconstruct, with a genuinely malformed
config value at 04:12. resolve had corrected it. expand had looked at the
correction, decided it was malformed, and corrected it. inline had looked at
that, and so on, around a ring of four stages that were each doing their job
perfectly well on an input that was now entirely made of previous repairs.
Andy watched the frame counter climb for a while.
“Why doesn’t it stop?”
“Something stops,” Bob said. “Three of those four stages have a base case and they’re hitting it — you can see it, their depth counters are sitting still.”
He drank some coffee.
“One of them has a base case it can never reach. That one has been going since quarter past four this morning and it’s the only reason the other three are still being handed work.”
Don't kill it yet. If you kill it now you get 400,000 half-applied repairs and a much worse morning.
Columns are frames, call targets, depths. Rows are stack, depths, call targets.
Nothing calls itself. That's the same trick as your first week — it tells you more than it looks like it does.
Find the frame that never terminates. Format: frame, calls, depth, stack.
fault
Unbounded self-repair
unwind budget
d-8k
severity
SEV-1
| resolve | expand | inline | emit | →resolve | →expand | →inline | →emit | d-128 | d-512 | d-4k | d-∞ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4 MB | ||||||||||||
| 32 MB | ||||||||||||
| 256 MB | ||||||||||||
| 2 GB | ||||||||||||
| d-128 | ||||||||||||
| d-512 | ||||||||||||
| d-4k | ||||||||||||
| d-∞ | ||||||||||||
| →resolve | ||||||||||||
| →expand | ||||||||||||
| →inline | ||||||||||||
| →emit |
Question: Which frame never terminates — what does it call, how deep did it go, and how much stack did it take?