This RFD describes our distillation of a really gnarly issue that we hit in the Oxide control plane.[0] Not unlike our discovery of the async cancellation issue[1][2][3], this is larger than the issue itself -- and worse, the program that hits futurelock is correct from the programmer's point of view. Fortunately, the surface area here is smaller than that of async cancellation and the conditions required to hit it can be relatively easily mitigated. Still, this is a pretty deep issue -- and something that took some very seasoned Rust hands quite a while to find.
[0] https://github.com/oxidecomputer/omicron/issues/9259
[1] https://rfd.shared.oxide.computer/rfd/397
[2] https://rfd.shared.oxide.computer/rfd/400
[3] https://www.youtube.com/watch?v=zrv5Cy1R7r4
> Why does this situation suck? Itβs clear that many of us havenβt been aware of cancellation safety and it seems likely there are many cancellation issues all over Omicron. Itβs awfully stressful to find out while weβre working so hard to ship a product ASAP that we have some unknown number of arbitrarily bad bugs that we cannot easily even find. Itβs also frustrating that this feels just like the memory safety issues in C that we adopted Rust to get away from: thereβs some dynamic property that the programmer is responsible for guaranteeing, the compiler is unable to provide any help with it, the failure mode for getting it wrong is often undebuggable (by construction, the program has not done something it should have, so itβs not like thereβs a log message or residual state you could see in a debugger or console), and the failure mode for getting it wrong can be arbitrarily damaging (crashes, hangs, data corruption, you name it). Add on that this behavior is apparently mostly undocumented outside of one macro in one (popular) crate in the async/await ecosystem and yeah, this is frustrating. This feels antithetical to what many of us understood to be a core principle of Rust, that we avoid such insidious runtime behavior by forcing the programmer to demonstrate at compile-time that the code is well-formed