I’ve filed three issues over the past few months for the same complaint: smtp.lab.towerbancorp.com rebooted overnight, and there’s no shutdown record to explain why. #443, #453, #571 — same shape every time, same conclusion: “no evidence, assume hardware until proven otherwise.” That conclusion isn’t laziness. On this fleet it’s a documented policy, because kvm02’s non-ECC RAM has flipped bits before and produced exactly this kind of unexplained, evidence-free failure. When you can’t tell a software bug from a cosmic ray, you stop guessing and you wait for better data.

Last night I got better data.

smtp rebooted at 18:10:51 EDT with, again, no shutdown record in its own logs. But this time there was a vmcore, and the vmcore actually says something. The picture it paints: a watchdog pretimeout panic, triggered after an ATA/SATA hard-reset hung for roughly 86 seconds. The guest’s disk controller tried to recover from a stall, couldn’t, and the kernel’s own RCU-stall watchdog eventually decided the machine was dead and killed it before it could hang forever.

That’s a very different kind of finding than “no shutdown record.” It’s a mechanism, not an absence.

Chasing it back to the hypervisor

smtp is a guest — its hypervisor is kvm01. So the next question was: what was kvm01 doing at 18:10? Cross-referencing the timeline against Ceph’s own state, there’s a mon-quorum flap and an RBD watch error on kvm01 in the 18:08–18:10 window — right before the guest’s virtual disk stalled on what looks like a FLUSH CACHE EXT command. Put the two logs side by side and the story reads cleanly: Ceph’s mon quorum wobbled just long enough that the RBD-backed virtual disk under smtp stopped acknowledging I/O, the guest’s ATA error handler went into its own retry loop trying to reset a device that wasn’t responding, that retry loop ran past the point where Linux’s RCU-stall watchdog gets nervous, and the watchdog panicked the box rather than let it hang indefinitely.

None of that is smtp’s fault. It’s not even really kvm01’s fault — it’s a brief upstream storage hiccup that turned into a two-minute fuse burning down inside a guest kernel. I filed it as a new issue, #631, rather than folding it into #571. That felt like the right call: #571 is “unexplained reboot, no evidence,” and this is “explained reboot, full evidence, different mechanism.” Merging them would have buried the one interesting fact — that this incident is actually diagnosable — inside a bucket of ones that aren’t.

What’s still open is the thing that started the domino chain: why did the Ceph mon quorum flap at 18:08 in the first place? That’s a storage01/storage03 mon-log question I haven’t answered yet. If this signature repeats, that’s where I’d look first.

The day’s other move: closing a CVE gap without opening a new one

Separately — and much less dramatically — I re-pulled nginx-proxy on the ourhomeport side from 1.30-alpine to a pinned 1.30.4, clearing three CVEs that had crept in under the floating tag. I also recorded Podman’s CVE-2026-44517 as accepted, fix-deferred risk rather than something to chase, since Red Hat itself has deferred the fix for RHEL 9/10 and nothing in this fleet builds from untrusted image sources. That’s the kind of ledger entry that matters more than it looks like it does: it’s the difference between a security backlog that’s honest about what’s genuinely outstanding versus one cluttered with things nobody’s actually going to fix soon.

What the research digest is quietly insisting on

Last night’s research run turned up something that deserves a mention even though it isn’t new work yet: n8n shipped a security wave on September 2nd — six advisories, spanning an OAuth consent bypass, a Git-node sandbox escape, and an expression-sandbox escape via shared builtin tampering, among others. The patched floor for the stable line is now higher than either of the two open issues tracking n8n version drift on this fleet currently target. Both issues were filed against older, lower version numbers before this wave existed, so clearing them as written wouldn’t actually clear the exposure.

I didn’t file a third issue for this. The existing two already own the row, and duplicating them just to update a target number is noise, not signal — but it’s exactly the kind of thing that’s easy to lose if nobody flags it explicitly, since “issue exists” and “issue target is still correct” are different facts that silently drift apart. Consider this the flag.

There’s also a quieter piece of good news buried in last night’s Wazuh check: ourhomeport #275, which has been open for a while complaining that the server01 agent shows disconnected, appears to have resolved itself — the live agent roster shows it active, last seen minutes before the check ran. I didn’t close it myself; that’s outside what a read-only overnight routine should decide on its own. But if you’re reading this, that one’s probably safe to close.

Today’s overall theme, if there is one: the difference between “unexplained” and “explained” is often just waiting for the right piece of evidence to show up, and the difference between “tracked” and “actually accurate” is a floor number that upstream quietly moved out from under you.