← Blog · Incident Analysis · July 11, 2026 · 7 min read · By Operate Engineering Team

Recovery Is Not Convergence: Anatomy of an Outage That Outlived Its Root Cause

Railway's July 2026 outage report shows three systems that captured bad state during 20 minutes of instability and held it silently. Here's the failure class.

Recovery Is Not Convergence: Anatomy of an Outage That Outlived Its Root Cause

Recovery Is Not Convergence: Anatomy of an Outage That Outlived Its Root Cause

TL;DR: When a network failure occurs, the restoration of routing does not guarantee system health because of stale connections after network recovery. As seen in Railway’s July 2026 outage, state captured during instability can persist indefinitely if no mechanism exists to re-assert the correct system configuration, leading to incidents that outlive their root cause by hours.

On July 2, 2026, a Tier 1 carrier failure triggered a sophisticated outage at Railway. While the primary network disruption lasted only twenty minutes, the system remained degraded for several hours. This incident highlights a critical gap in modern infrastructure: the delta between "recovery" (the cause is gone) and "convergence" (the system has returned to its desired state).

For engineering teams, the Railway postmortem provides a masterclass in a failure class most never test for: state captured during a brief window of instability that persists silently after the trigger is fixed. Because nothing in the system re-asserted the correct state, the incident continued long after the carrier had restored service.

The 122 minutes that shouldn't have happened

The timeline of the July 2nd incident is a haunting illustration of temporal failure propagation. At 07:44 UTC, a carrier-grade routing instability began. By 08:59 UTC, the routing had "healed" and the external backbone was stable. However, storage services did not return to health until 11:04 UTC—more than two hours later.

During this 122-minute window, the engineering team was trapped in a "green dashboard" paradox. The network providers reported 100% uptime. The routing tables showed correct paths. The BGP sessions were established. Yet, storage throughput was capped at a third of its capacity, and I/O wait sat at a grueling 58%.

The root cause was no longer the carrier; it was the stale connections after network recovery. The system had "remembered" the failure and integrated it into its ongoing operations.

What Railway got right

Before dissecting the failures, it is vital to acknowledge the resilience that prevented a total collapse. According to the Railway Incident Report, their multi-carrier design successfully absorbed the brunt of the carrier failure. Probes caught the deviation two hours earlier than standard synthetic monitors might have discovered such a subtle degradation.

Despite this, the incident provides three specific examples of how stale connections after network recovery can bypass even the most robust multi-homed architectures.

Failure 1: connections don't re-check their route — storage traffic pinned to the management network

The most impactful discovery in the postmortem was the behavior of TCP storage connections. During the 20-minute routing hole, the system struggled to route traffic via the primary data path. In a desperate attempt to maintain connectivity—or due to the specifics of how the OS handles multi-homed interfaces during route withdrawal—storage traffic began flowing over the management network.

The management network is designed for control plane traffic, not high-throughput storage I/O. When the primary network recovered at 08:59, the storage connections did not "snap back" to the faster route.

Key Takeaway: Established TCP connections are often "pinned" to the path or interface they were created on; unless the connection is dropped or the interface disappears, the kernel will continue to route existing sockets via the legacy path even when a better path becomes available.

Because these were long-lived connections, they stayed pinned to the slow management network for two hours. The routing table said "go left," but the active sockets were still "going right."

Failure 2: 20,000 tunnels that learned a lie

The second failure involved the service mesh. Railway utilizes approximately 20,000 mesh tunnels to facilitate inter-service communication. During the instability, a NAT device in the transit path began rewriting addresses in an attempt to find a working route.

Many of these tunnels "learned" the NAT device's temporary address as the valid peer address. These were idle or low-traffic tunnels. Because an idle tunnel sends no packets, it has no reason to re-verify its peer.

When the network stabilized, these tunnels held onto the "learned lie." They were pointing at a NAT address that no longer existed or no longer forwarded to the correct destination. These 20,000 stale states created a "ghost" outage where services appeared connected but could not actually pass traffic.

Failure 3: the default route that belonged to someone else

In some of the first-generation sites, the default route itself was "borrowed state." According to the Network World 2026 report on internet health, carrier-supplied routes can sometimes persist in local caches even after the BGP session that provided them has reset.

In Railway's case, the config was essentially "borrowed" from the carrier's announcement. When the carrier announced a bad path, the system swallowed it. When the carrier withdrew the bad path, the system didn't immediately revert to a known-good local configuration; it waited for a new announcement that was slow to propagate or was superseded by the stale local cache.

The common shape: state captured under instability

The unifying theme here is that nothing in the system re-asserted the correct state.

Most infrastructure is designed for "eventual consistency," but we often forget that consistency requires an active push. If a system learns its environment (neighbor IPs, storage routes, DB primaries) during a moment of chaos, that "dirty" knowledge becomes the new truth.

If there is no process that periodically says, "Regardless of what you think you know, here is the source of truth," the system will remain in a semi-failed state indefinitely. This is why "restarting the world" often fixes things that "waiting for recovery" does not—a restart forces a re-assertion of state.

Your version of this: An audit checklist

Stale connections after network recovery are not unique to Railway. They exist in every distributed system. As a Staff or Principal Engineer, you should audit your stack for the following "state traps":

What 'recovered' should mean

To prevent these 120-minute tail-end outages, we must change our definition of recovery.

  1. Verify Convergence: Recovery is not when the carrier says "fixed." Recovery is when the system state matches the desired configuration.
  2. Traffic Source Auditing: Don't just alert on "is traffic flowing?" Alert on "where is traffic flowing from?" If storage traffic is arriving on a management interface, that should be a high-severity alert.
  3. Active Re-Assertion: Build "anti-entropy" into your control plane. Periodically force services to re-resolve their dependencies or refresh their connection pools, even if they aren't reporting errors.

The investigation lesson

The Railway incident was finally resolved when engineers cross-referenced connection source addresses against the physical network topology. This was information no single dashboard held. It required looking at the raw state of the system—the "truth" on the wire versus the "truth" in the config.

As highlighted in ThousandEyes' internet outage timelines, these complex inter-dependencies are becoming the norm. Finding the root cause in these scenarios requires moving beyond pre-aggregated metrics. You need the evidence of what actually happened during that 20-minute window of instability.

Why this matters now

This failure class is particularly dangerous because it is "silent." Traditional monitoring looks for errors (500s, timeouts). But in these cases, the system is "working"—it's just working poorly, slowly, or via a fragile, unintended path. As we move toward more complex, multi-cloud and multi-region architectures, the surface area for stale state grows exponentially.


The two hours between "routing healthy" and "storage healthy" is precisely the cross-layer window where engineering teams burn the most expensive hours. This is the "Everything is Green and the System is Down" scenario.

Operate’s investigation model is built specifically for this class of error. Rather than relying solely on pre-aggregated telemetry that might hide the truth of a pinned TCP connection, Operate queries live system state—examining connection tables, routing paths, and service catalogs in real-time.

When a network heals, Operate’s verification agents don't just check for "up" status; they re-verify that the system has converged to the correct topology. By identifying that storage connections are originating from management-network addresses, Operate provides the evidence needed to find a root cause that no dashboard can show. It provides human-reviewed patches and remediation steps with the control and auditability required for production infrastructure, ensuring that once a root cause is fixed, the system actually recovers.

Sources & further reading:

#SRE#postmortem#networking#incident-response#railway