Nah, if there's one thing they thoroughly test, it's the spying.
No, it's a panic, so it's more similar to a segfault, but with some amount of unwinding. It can be "caught" but only at a thread boundary.
It is unwrap's fault. If they did it properly, they would've had to explicitly deal with the problem, which could clarify exactly what the problem is. In this case, I'd probably use expect() to add context. Also, when doing anything with strict size requirements, I would also explicitly check the size to make sure it'll fit, again, for better error reporting.
Proper error reporting could've made this a 5-min investigation.
Also, the problem in the first place should've been caught with unit tests and a test deploy. Our process here is:
- Any significant change to queries is tested with a copy of production data
- All changes are tested in a staging environment similar to production
- All hotfixes are tested with a copy of production data
And we're not a massive software shop, we have a few dozen devs in a company of thousands of people. If I worked at Cloudflare, I'd have more rigorous standards given the global impact of a bug (we have a few hundred users, not billions like Cloudflare).
Ift is precious and beyond compare. It has tools that most other languages lack to prove certain classes of bugs are impossible.
You can still introduce bugs, especially when you use certain features that "standard" linter (clippy) catches by default and no team would silence globally. .unwrap() is very controversial in Rust and should never be used without clear justification in production code. Even in my pet projects, it's the first thing I clear out once basic functionality is there.
This issue should've been caught at three separate stages:
- git pre-commit or pre-push should run the linter on the devs machine
- Static analysis checks should catch this both before getting reviews and when deploying the change
- Human code review
The fact that it made it past all three makes me very concerned about how they do development over there. We're a much smaller company and we're not even a software company (software dev is <1% of the total company), and we do this. We don't even use Rust, we're a Python shop, yet we have robust static analysis for every change. It's standard, and any company doing anything more than a small in-house tool used by 3 people should have these standards in place.
Man, my friends riffed on that song so much.
¿Por que no los dos?
It's Steam Deck verified, no need to check ProtonDB.
Yeah, TP is renewable by design, since it comes from trees. Being from a grass like bamboo doesn't change that, and bamboo isn't absorbent, so I'm very concerned about the process they're using to produce something that's supposed to be somewhat absorbent.
I wanna know how many square cubits it is.
Use something like Backblaze or Hetzner storage boxes for off-site backups. There are a number of tools for making this painless, so pick your favorite. If you have the means, I recommend doing a disaster recovery scenario every so often (i.e. disconnect existing drives, reinstall the OS, and load everything from remote backup).
Generally speaking, follow the 3-2-1 rule:
- 3 copies of everything on
- 2 different types of media with
- 1 copy off site (at least)
For your situation, this could be:
- 3 copies - your computer (NVMe?), TrueNas (HDD?), off-site backup; ideally have a third local device (second computer?)
- 2 media - NVMe and HDD
- 1 copy off site - Backblaze, Hetzner, etc
You could rent a cloud server, but it'll be a lot more expensive vs just renting storage.
Glad you got it fixed. 🙂
Almost every reply is also explaining what the runtime is.
I boosted it up a bit for other people who come along w/ a similar concern. You seemed mistaken at first until a few threads deep, so there's likely someone else who is just as, if not more, confused.
Yes, it's not the same since you get a stacktrace (if enabled) and a message, but it's the closest thing you get in safe rust (outside compiler bugs). I compare it to a segfault because it's almost as unhandleble.
Basically, you don't want a panic to crash your program in most cases. If you do, make it explicit (i.e. with
expect()).unwrap()tells me the value is absolutely there or the dev is lazy, and I always assume the latter unless there's an explanation (or it's obvious from context) otherwise.