Earlier quoted context omitted.
I'm curious about how their internal policies work such that they are allowed to publish a post mortem this quickly, and with this much transparency. Any other large-ish company, there would be layers of "stakeholders" that will slow this process down. They will almost always never allow code to be published.
Well… we have a culture of transparency we take seriously. I spent 3 years in law school that many times over my career have seemed like wastes but days like today prove useful. I was in the triage video bridge call nearly the whole time. Spent some time after we got things under control talking to customers. Then went home. I’m currently in Lisbon at our EUHQ. I texted John Graham-Cumming, our former CTO and current…
Cloudflare outage on November 18, 2025 post mortem
941–950 of 953 posts
Re: Cloudflare outage on November 18, 2025 post mortem
#942Earlier quoted context omitted.
>> This is the multi-million dollar .unwrap() story. > That's too semantic IMHO. The failure mode was "enforced invariant stopped being true". If they'd written explicit code to fail the request when that happened, the end result would have been exactly the same. Problem is, the enclosing function (`fetch_features`) returns a `Result`, so the `unwrap` on line #82 only serves as a shortcut a developer took due to assu…
> Instead, the routine likely should have worked within `Result`. But it's a fatal error. It doesn't matter whether it's implicit or explicit, the result is the same. Maybe you're saying "it's better to be explicit", as a broad generalization I don't disagree with that. But that has nothing to do with the actual bug here, which was that the invariant failed. How they choose to implement checking and failing the invar…
> But it's a fatal error. It doesn't matter whether it's implicit or explicit, the result is the same.
I agree it is an error, but disagree that it should be a fatal error at that location. The reason being is the method defining the offending `unwrap` construct produces a `Result`, which is fully capable of representing any error `features.append_with_names` could produce.
> But that has nothing to do with the actual bug here, which was that the invariant failed.
The bug is by invoking `unwrap` the process crashed. To the degree that Cloudfare had a massive outage.
Had the logic been such that a `Result` representing this error condition activated an alternate workflow to handle the error (perhaps by logging it, emitting a notification event alerting SRE's, transitioning into a failure mode, or all of these options), then a global outage might have been averted.
Which makes:
> How they choose to implement checking and failing the invariant in the semantics of the chosen language is irrelevant.
Very relevant indeed.
Re: Cloudflare outage on November 18, 2025 post mortem
#943What were the teams doing between 11 to 1300 hrs , no explanation of what investigations were going on to not being able to figure the root cause.
Re: Cloudflare outage on November 18, 2025 post mortem
#944Didn't the services that were crashing due to OOM raise any alerts?
This is shitty at so many levels.
Re: Cloudflare outage on November 18, 2025 post mortem
#945Go to jeffblearning on LinkedIn. I took it down with 253 copies of a text file delivered through a vulnerability in Novo’s systems.
I’ve documented all of it.
It’s not done yet…
Re: Cloudflare outage on November 18, 2025 post mortem
#946Earlier quoted context omitted.
To be fair, if you’re not “this tall” you really shouldn’t consider using goto in a c program. Most people aren’t that tall.
Nonsense. Linux kernel for one example, uses goto everywhere for error handling.
Re: Cloudflare outage on November 18, 2025 post mortem
#947Earlier quoted context omitted.
There's clearly a big gap in how things are done in practice. You wouldn't see anyone call System.exit in a managed language if a data file was bigger than expected. You'd always get an exception. I used to be an SRE at Google. Back then we also had big outages caused by bad data files pushed to prod. It's a common enough issue so I really sympathize with Cloudflare, it's not nice to be on call for issues like that.…
A panic in Rust is the same as an exception in C++. You can catch it all the same. https://doc.rust-lang.org/std/panic/index.html An uncaught exception in C++ or an uncaught panic in Rust terminates the program. The unwinding is the same mechanism. I think the implementation is what comes with LLVM, but I haven't checked. I was also a Google SRE, and I liked the stacktrace facilities so much that I got permission to…
Re: Cloudflare outage on November 18, 2025 post mortem
#948Shouldn't the architecture setup in such a way that subcomponents can fail without impacting the critical function of the component?
Re: Cloudflare outage on November 18, 2025 post mortem
#949Re: Cloudflare outage on November 18, 2025 post mortem
#950Earlier quoted context omitted.
Nonsense. Linux kernel for one example, uses goto everywhere for error handling.
How many codebases besides the Linux kernel had you seen an intentional amount of use of goto?
I will give you one example though: various .NET repositories (runtime, aspnetcore, orleans).