Sixty Minutes of Silence: Reconstructing the Branch Outage Your Controller Swore Couldn't Happen
Photo: Alan Levine from United States, CC BY 2.0, via Wikimedia Commons
The call came at 3:07 AM Central Time. A regional grocery chain's fulfillment branch outside Tulsa had dropped off the SD-WAN headend, and the night shift NOC engineer in Dallas was staring at a dashboard that insisted everything was fine.
What follows is a reconstruction, drawn from the post-mortem and the controller's own audit logs, of the next sixty-one minutes. It is not a story of catastrophe. It is a story of small assumptions failing in sequence — which, in a controller-defined network, is the only kind of outage you get anymore.
3:07 — The First Domino
The branch's access stack had been running fine for fourteen months. At 3:07, switch three of four — the stack member that also happened to hold the standby control plane — suffered a power supply failure. In the old world, this was a non-event: the stack would reconverge, the uplink would stay up, and nobody would ever know.
In this network, the stack member also hosted the local container running the branch's zero-touch agent. The agent did not fail over cleanly. The stack reconverged in under two seconds, exactly as designed. The agent did not restart for another nine minutes because its health check pointed at a loopback address that lived on the failed member.
3:16 — The Silent Gap
For nine minutes, the branch was, functionally, still online. Traffic flowed. But the site stopped reporting telemetry to the regional controller cluster, which had a rule: any branch silent for ten minutes gets flagged, and any branch silent for thirty gets its tunnels torn down and rebuilt from the hub.
That rule was written by a network architect who left the company in 2023. Nobody had revisited it.
3:26 — The Controller Does Something Helpful
At 3:26, the controller did exactly what it was told. It declared the branch unhealthy, withdrew the site's routes from the overlay, and initiated a tunnel rebuild. The rebuild required the zero-touch agent to acknowledge — and the agent was still in its zombie state, half-alive on the wrong stack member.
The rebuild failed. The controller retried. Each retry consumed a session slot on the hub firewall. By 3:40, the hub had exhausted its license capacity for concurrent branch tunnels, and two neighboring branches began flapping as the controller churned through its retry queue.
One failed power supply in Tulsa was now threatening three sites in two states.
3:44 — Humans Enter the Chat
The Dallas NOC engineer, now joined by a colleague, did the thing experienced engineers do under pressure: they compared the controller's view of the world with the switch's view. The controller said the branch was down. The stack, reachable over a management VLAN that bypassed the overlay, said it was fine.
That disagreement — between the intent layer and the reality layer — is the signature failure mode of controller-defined networking. The fix was unglamorous: a manual restart of the agent container over the management path, a forced re-registration with the controller, and a patient wait while the retry queue drained.
By 4:08 AM, all three sites were stable. Total customer impact: about forty minutes of degraded fulfillment traffic, no data loss, no headlines. Total engineering time: two people, most of a night, and a very candid post-mortem the following week.
What Actually Worked
Credit where due. The stack failover itself was flawless. Telemetry caught the silence faster than any SNMP polling scheme would have. The management out-of-band path — often the first thing value-engineered out of a branch build — saved the team from a four-hour drive to Tulsa. And the controller's audit log, once someone thought to read it, told the whole story in order.
What Silently Broke
Three things, and none of them were the SDN fabric itself:
- A health check pointed at the wrong address. The agent's liveness probe survived no design review; it was inherited from a template.
- A controller policy with no owner. The thirty-minute teardown rule was a landmine with a two-year fuse. Automated policy without periodic human review is just technical debt with a dashboard.
- No blast-radius thinking. A single-branch failure should never exhaust hub resources. Rate-limiting retry storms and capping per-branch session consumption cost nothing to configure and everything to skip.
The Post-Mortem Checklist
Adapt this for your own NOC runbook:
- Inventory every local agent, container, and daemon at each branch. For each one, ask: what happens when its host fails? Who owns its health check?
- Review every automated controller policy quarterly. Assign a named owner. If nobody owns it, it will outlive its author and bite you anyway.
- Test the disagreement path. Deliberately force a state where the controller and the device disagree, and confirm your engineers can reach the device out-of-band.
- Cap the blast radius. Ensure a single misbehaving branch cannot exhaust shared controller or hub resources. Rate-limit retries. Partition session pools.
- Drill the 3 AM scenario. Not a tabletop exercise — an actual failover of a stack member in a lab that mirrors production templates.
The uncomfortable lesson from Tulsa is that software-defined networks don't eliminate outages. They relocate them — from the data plane, where they're loud and obvious, to the control and policy layers, where they're quiet and cumulative. The fabric worked. The assumptions didn't. Your next 3 AM call will be decided by which one you've been auditing.