
Hello and welcome back to Architecting Zero Downtime Infrastructure!
Today, we’re doing something a little different, but something I find absolutely invaluable in my own practice. We’re going to conduct a full post-mortem. We’re going to dissect a real-world, anonymized case of a supposedly ‘bulletproof’ Storage Area Network (SAN) that went down, and went down hard.
We’ll explore the initial trigger… walk through the terrifying cascade of failures as they rippled through the system… and then distill the critical lessons learned from the wreckage. In my experience, you learn more from one good failure analysis than from a hundred success stories. Understanding precisely why things break is the essential first step to building systems that don’t.
So, grab a coffee, get comfortable, and let’s dive into the anatomy of an outage.
The Fortress on Paper: A “Bulletproof” Design
Let me paint a vivid picture for you. When I look at a system design, I’m searching for layers of resilience. And this one had them all… at least on the surface.
We’re talking about a mid-range enterprise SAN, the kind you see in thousands of businesses. It was configured exactly how the vendor recommends:
- Dual, active-active controllers, so if one failed, the other was already running and ready to take the full load.
- Fully redundant fibre channel fabrics with two entirely separate switches, meaning you could lose a whole switch and service would continue.
- All servers were connected via multi-path I/O, giving them multiple physical routes to their data.
- And the data itself was sitting on RAID 6 volumes, which can survive two simultaneous drive failures without data loss.
On paper, this was a fortress. It was designed to withstand almost any single component failure. And that’s a crucial part of this story—this perceived invincibility. It can breed a very dangerous sense of complacency, a quiet assumption that some parts of your infrastructure are just too resilient to fail.
The First Whisper of Trouble
Major outages rarely start with a loud bang. More often, it’s a whisper. And this case was no different.
The first signs were just intermittent performance degradation alerts bubbling up from the virtual machine monitoring platform. Key database applications became sluggish… just enough to get noticed, but not enough to scream ’emergency’.
Now, what I typically see in these situations, and what happened here, is that the operations team did exactly what you’d expect. Their instinct was to check the usual suspects:
- Is there a runaway query hammering a database?
- Do we have a ‘noisy neighbor’—a virtual machine consuming more than its fair share of resources?
- Is there a network latency issue somewhere?
This is the standard playbook, and it’s usually correct! But the SAN… with all its green lights blinking reassuringly, its dual controllers humming away… that was low on the list of culprits. It was the bedrock. It was assumed to be stable. And that assumption is where the real trouble begins. While the team was focused on the application layer, digging through query plans and logs, the ground was shifting beneath their feet.
The Cascade Begins: From Blip to Blackout
A critical alert fires from the storage array: ‘Controller A Offline’.
Now, in a well-architected system, this is the kind of event you plan for. It’s why you paid for the dual-controller model in the first place! What I expect to see here is Controller B seamlessly take over the full workload. There might be a momentary blip in I/O latency, a few seconds perhaps, but end-users should never even notice.
That, however, is not what happened.
Instead of a smooth failover, I/O across the entire SAN simply… stopped. It stalled. Within moments, the connected hosts began losing their paths to storage, and that initial application slowdown we talked about transformed into a full-blown, service-impacting outage. The system designed to handle this exact failure had just failed completely.
And this is where a single fault begins its terrifying cascade. The failover attempt—the very mechanism designed to provide resilience—actually created the catastrophic failure.
Here’s what went wrong under the hood. Controller A, as it failed, didn’t correctly release a critical lock on a shared piece of metadata. So when Controller B tried to take full ownership, it ran straight into this inconsistent state. Now, any well-designed storage system has a prime directive: protect data integrity at all costs. Faced with this inconsistency, its kernel did what it was programmed to do to prevent corruption: it panicked and forced a reboot.
The tragedy here is that upon restarting, it immediately tried to take ownership again… hit the very same lock… panicked again… and rebooted. This is the nightmare scenario we plan against. The SAN was now in a catastrophic boot loop, and every single connected service was hard down.
Entering the Fog of War
This is the moment that triggers the ‘all-hands-on-deck’ emergency call, bringing together the infrastructure team and the storage vendor’s senior support. The pressure at this point is immense, as the business impact is compounding by the minute.
What makes these situations so difficult is that initial diagnostics are often confusing. The hardware all reports as healthy, but the controllers refuse to stay online. You’re fighting a ghost in the machine.
In a crisis, there’s a strong impulse to take a shortcut. The team considered forcing one controller to stay active in a degraded state. And here’s where discipline is so critical. My unbreakable rule in a crisis is this: never trade data integrity for speed. They correctly decided that the potential for data corruption was too high a price to pay. This was the moment of truth, where the premium you paid for that enterprise support contract, and the hours you spent on documentation, are tested in a real-world fire.
After long hours on the support call, the breakthrough finally came. An escalation engineer, someone with years of pattern recognition, joined the call and said, ‘I think I’ve seen this signature before.’
The Breakthrough: A Perfect Storm
It turns out, this wasn’t one failure, but two, acting in concert.
It all began with a perfect storm. A recent, supposedly minor firmware patch had introduced a subtle memory leak. That leak was then dramatically accelerated by a very specific I/O pattern from a newly deployed application. What I always emphasize is that our environments are never static; a new workload can stress a system in a way it’s never been stressed before.
When the controller’s memory was finally exhausted, it failed. But that should have been recoverable. The catastrophic event was a second, entirely separate and undiscovered bug, lurking in the failover logic itself. The first failure was simply the key that unlocked the second, far more destructive one.
The Long Road to Recovery
Once you have a root cause, you can start on the long road back to normal. The fix here was not a simple reboot. It required booting the entire SAN into a special maintenance mode—something you hope to never do—and applying an emergency patch directly from the vendor’s engineers.
Then came the part that really tests your nerve: a full, multi-hour consistency check on the underlying metadata. You cannot rush this. Only after that was complete could the team begin what I call the ‘stack climb’. It’s a painstaking process where you reboot the fibre channel switches, then rescan storage on every host, and only then do you bring the applications and databases back online, one by one. At every stage, you are relentlessly verifying data integrity. This is not about speed; it’s about a safe, methodical return to service.
The Wreckage Report: What We Learned
So, when the dust settled, what did we actually learn from this painful experience?
- Redundancy is Not Infallibility. We build these complex, active-active systems, but the failover logic itself can become a single point of failure. The very software meant to save you can be the thing that takes you down. It’s an uncomfortable truth, but a vital one to accept.
- Beware the Tightly-Coupled Architecture. In this case, the two controllers were so interdependent that a software fault on one could effectively poison the other, creating an inescapable loop. When you design, ask yourself: ‘How can these redundant components truly fail independently?’
- The Absolute Necessity of ‘Game Day’ Testing. This is the lesson I want you to take back to your own teams. It’s not enough to trust a vendor’s datasheet or a diagram. My personal rule of thumb is that a feature you haven’t tested is a feature you don’t have. You have to be willing to schedule a maintenance window to actually validate the theory. Pull the cable. Power off a controller. Watch what happens. It is the only way to know for certain if your safety net will actually hold your weight when you fall.
Final Thoughts
What I hope you take away from this story is that our most resilient systems often hide our most complex failures. The layers of redundancy can create a false sense of security that masks a deeper fragility.
That’s why, in my own practice, I place so much emphasis on the post-mortem process. A truly blameless process, one focused on learning, is what transforms a catastrophic failure into an invaluable lesson that strengthens the entire team and your infrastructure. It’s how we get better, together.
And to continue that theme, next time on the podcast, we’ll hear directly from someone who has been in the hot seat. Our next episode is ‘Guest Interview: An IT Manager on Surviving a Catastrophic Storage Failure’. We’ll get into the details of managing not just the technical, but the business and the human side of a major crisis. It’s a powerful story you won’t want to miss.
Thanks for tuning in to Architecting Zero Downtime Infrastructure! As always, I’d love to hear your thoughts or your own war stories in the comments below.








