<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: mycoliza</title><link>https://news.ycombinator.com/user?id=mycoliza</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 11 Oct 2026 06:06:42 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=mycoliza" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by mycoliza in "Oxide Computer raises $445M (SEC Form D)"]]></title><description><![CDATA[
<p>there are even images of it on our website!</p>
]]></description><pubDate>Tue, 04 Aug 2026 23:02:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49176484</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=49176484</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49176484</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>In reply to your edit, that section in the RFD includes a link to the full example in the Rust playground. You’ll note that it does not make any use of ‘select!`: <a href="https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=3b8505524169c79a6bd53c3aa9f5fbfa" rel="nofollow">https://play.rust-lang.org/?version=stable&mode=debug&editio...</a><p>Perhaps the full example should have been reproduced in the RFD for clarity…</p>
]]></description><pubDate>Fri, 31 Oct 2025 23:34:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777879</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777879</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>An analogous problem is equally possible with streams: <a href="https://rfd.shared.oxide.computer/rfd/0609#_how_you_can_hit_this_with_streams" rel="nofollow">https://rfd.shared.oxide.computer/rfd/0609#_how_you_can_hit_...</a></p>
]]></description><pubDate>Fri, 31 Oct 2025 22:35:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777445</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777445</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777445</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>> No, just have select!() on a bunch of owned Futures return the futures that weren't selected instead of dropping them. Then you don't lose state.<p>How does that prevent this kind of deadlock? If the owned future has acquired a mutex, and you return that future from the select so that it might be polled again, and the user assigns it to a variable, then the future that has acquired the mutex but has not completed is still not dropped. This is basically the same as polling an `&mut future`, but with more steps.</p>
]]></description><pubDate>Fri, 31 Oct 2025 22:26:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777364</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777364</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777364</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>Indeed, you are correct (and hi Matthias!). After we got to the bottom of this deadlock, my coworkers and I had one of our characteristic "how could we have prevented this?" conversations, and reached the somewhat sad conclusion that actually, there was basically nothing we could easily <i>blame</i> for this. All the Tokio primitives involved were working precisely as they were supposed to. The only thing that would have prevented this without completely re-designing Rust's async from the ground up would be to ban the use of `&mut future`s in `select!`...but that eliminates a lot of <i>correct</i> code, too. Not being able to do that would make it pretty hard to express a lot of things that many applications might reasonably want to express, as you described. I discussed this a bit in this comment[1] as well.<p>On the other hand, it also wasn't our coworker who had written the code where we found the bug who was to blame, either. It wasn't a case of sloppy programming; he had done everything correctly and put the pieces together the way you were supposed to. All the pieces worked as they were supposed to, and his code seemed to be using them correctly, but the interaction of these pieces resulted in a deadlock that it would have been very difficult for him to anticipate.<p>So, our conclusion was, wow, this just kind of sucks. Not an indictment of async Rust as a whole, but an unfortunate emergent behavior arising from an interaction of individually well-designed pieces. Just something you gotta watch out for, I guess. And that's pretty sad to have to admit.<p>[1] <a href="https://news.ycombinator.com/item?id=45776868">https://news.ycombinator.com/item?id=45776868</a></p>
]]></description><pubDate>Fri, 31 Oct 2025 22:24:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777340</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777340</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777340</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>Yeah, a coworker coming from Go asked a similar question about why Rust doesn't have something like the Go runtime's deadlock detector. Your comment is quite similar to the explanation I gave him.<p>Go, unlike Rust, does not really have a notion of intra-task concurrency; goroutines are the fundamental unit of concurrency <i>and</i> parallelism. So, the Go runtime can reason about dependencies between goroutines quite easily, since goroutines are the things which it is responsible for scheduling. The fact that channels are a language construct, rather than a library construct implemented <i>in</i> the language, is necessary for this too. In (async) Rust, on the other hand, tasks are the fundamental unit of parallelism, but <i>not</i> of concurrency; concurrency emerges from the composition of `Future`s, and a single task is a state machine which may execute any number of futures concurrently (but not in parallel), by polling them until they cannot proceed without waiting and then moving on to poll another future until <i>it</i> cannot proceed without waiting. But critically, this is <i>not what the task scheduler sees</i>; it interacts with these tasks as a single top-level `Future`, and is not able to look inside at the nested futures they are composed of.<p>This specific failure mode can actually <i>only happen</i> when multiple futures are polled concurrently <i>but not in parallel</i> within a single Tokio task. So, there is actually no way for the Tokio scheduler to have insight into this problem. You could imagine a deadlock detector in the Tokio runtime that operates on the <i>task</i> level, but it actually could <i>never</i> detect this problem, because when these operations execute in parallel, it actually cannot occur. In fact, one of the suggestions for how to avoid this issue is to select over spawned tasks rather than futures within the same task.</p>
]]></description><pubDate>Fri, 31 Oct 2025 22:02:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777185</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777185</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777185</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>As a member of (Eliza, Sean, John, and Dave), I can second that debugging this was certainly an adventure. I'm not going to go as far as to say that we <i>had fun</i>, since...you can't have a heroic narrative without real struggle. But it was certainly rewarding to be in the room for that "a-ha!" moment, in which all the pieces really did begin to fit together very quickly. It was like the climax of a detective story --- and it was particularly well-scripted the way each of us contributed a little piece of the puzzle.</p>
]]></description><pubDate>Fri, 31 Oct 2025 21:41:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777008</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45777008</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777008</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>We actually <i>don't</i> use Rust async in the embedded parts of our system. This is largely because our firmware is based on a multi-tasking microkernel operating system, Hubris[1], and we can express concurrency at the level of the OS scheduler. Although our service processors are single-core systems, we can still rely on the OS to schedule multiple threads of execution.<p>Rust async is, however, very useful in single-core embedded systems that <i>don't</i> have an operating system with preemptive multitasking, where one thread of execution is all you ever get. It's nice to have a way to express that you might be doing multiple things concurrently in an event-driven way without having to have an OS to manage preemptive multitasking.<p>[1] <a href="https://hubris.oxide.computer/" rel="nofollow">https://hubris.oxide.computer/</a></p>
]]></description><pubDate>Fri, 31 Oct 2025 21:34:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=45776954</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45776954</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45776954</guid></item><item><title><![CDATA[New comment by mycoliza in "Futurelock: A subtle risk in async Rust"]]></title><description><![CDATA[
<p>What could `tokio::select!` do differently here to prevent bugs like this?<p>In the case of `select!`, it is a direct consequence of the ability to poll a `&mut` reference to a future in a `select!` arm, where the future is not dropped should another future win the "race" of the select. This is not really a choice Tokio made when designing `select!`, but is instead due to the existence of implementations of `Future` for `&mut T: Future + Unpin`[1] and `Pin<T: Future>`[2] in the standard library.<p>Tokio's `select!` macro cannot easily stop the user from doing this, and, furthermore, the fact that you can do this is <i>useful</i> --- there are many legitimate reasons you might want to continue polling a future if another branch of the select completes first. It's desirable to be able to express the idea that we want to continually poll drive one asynchronous operation to completion while periodically checking if some other thing has happened and taking action based on that, and then continue driving forward the ongoing operation. That was precisely what the code in which we found the bug was doing, and it is a pretty reasonable thing to want to do; a version of the `select!` macro which disallows that would limit its usefulness. The issue arises specifically from the fact that the `&mut future` has been polled to a state in which it has acquired, but not released, a shared lock or lock-like resource, and then another arm of the `select!` completes first and the body of that branch runs async code that <i>also</i> awaits that shared resource.<p>If you can think of an API change which Tokio could make that would solve this problem, I'd love to hear it. But, having spent some time trying to think of one myself, I'm not sure how it would be done without limiting the ability to express code that one might reasonably want to be able to write, and without making fundamental changes to the design of Rust async as a whole.<p>[1] <a href="https://doc.rust-lang.org/stable/std/future/trait.Future.html#impl-Future-for-%26mut+F" rel="nofollow">https://doc.rust-lang.org/stable/std/future/trait.Future.htm...</a>
[2]: <a href="https://doc.rust-lang.org/stable/std/future/trait.Future.html#impl-Future-for-Pin%3CP%3E" rel="nofollow">https://doc.rust-lang.org/stable/std/future/trait.Future.htm...</a></p>
]]></description><pubDate>Fri, 31 Oct 2025 21:24:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45776868</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=45776868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45776868</guid></item><item><title><![CDATA[New comment by mycoliza in "Oxide’s compensation model: how is it going?"]]></title><description><![CDATA[
<p>As an Oxide employee, let's just say...it does, and it is :)</p>
]]></description><pubDate>Fri, 02 May 2025 20:20:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=43874204</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=43874204</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43874204</guid></item><item><title><![CDATA[New comment by mycoliza in "How oxide cuts data center power consumption in half"]]></title><description><![CDATA[
<p>We also sell computers... :)</p>
]]></description><pubDate>Fri, 22 Nov 2024 18:36:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42216254</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=42216254</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42216254</guid></item><item><title><![CDATA[New comment by mycoliza in "Oxide Cuts Data Center Power Consumption in Half"]]></title><description><![CDATA[
<p>The big piece of copper is fed by redundant rectifiers. Each power shelf has six  independent rectifiers which are 5+1 redundant if the rack is fully loaded with compute sleds, or 3+3 redundant if the rack is half-populated. Customers who want more redundancy can also have a second power shelf with six more rectifiers.</p>
]]></description><pubDate>Thu, 21 Nov 2024 23:10:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=42209634</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=42209634</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42209634</guid></item><item><title><![CDATA[New comment by mycoliza in "How oxide cuts data center power consumption in half"]]></title><description><![CDATA[
<p>We write the security mitigations. We patch the CVEs. Oxide employs many, perhaps most, of the currently active illumos maintainers --- although I don't work on the illumos kernel personally, I talk to those folks every day.<p>A big part of what we're offering our customers is the promise that there's one vendor who's responsible for everything in the rack. We <i>want</i> to be the responsible party for all the software we ship, whether it's firmware, the host operating system, the hypervisor, and everything else. Arguably, the promise that there's one vendor you can yell at for everything is a more important differentiator for us than any particular technical aspect of our hardware or software.</p>
]]></description><pubDate>Thu, 21 Nov 2024 22:39:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=42209429</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=42209429</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42209429</guid></item><item><title><![CDATA[New comment by mycoliza in "Who killed the network switch? A Hubris Bug Story"]]></title><description><![CDATA[
<p>We did it as a result of my suggestion, and I'll freely admit that it does seem pretty goofy!<p>The motivation, though, was that we wanted to write tests for the function that would run on a developer's machine using `cargo test`, and the Hubris kernel currently <i>only</i> compiles for the targets that we actually run Hubris on (various Cortex-M targets). So, if we want to write tests for that function, we would either need to move it to a crate that doesn't contain Cortex-M-only code, or litter the whole kernel with `#[cfg(not(test))]` attributes so that most of it doesn't compile when building tests. This felt much less unpleasant than conditional compilation. We're hoping that, eventually, other complex-but-not-architecture-specific kernel code will end up in the `kerncore` crate as well so that we can write tests for it, too, so eventually it won't be a crate with only one function...<p>I do think that there's room for tooling improvement to make writing host-platform tests for `#![no_std]` Rust that gets cross-compiled to another platform, but I don't have any particularly concrete ideas for what that would look like. For now, at least, putting it in a separate crate lets us have our tests --- and those tests let us ensure that some of the function's edge cases are handled correctly, so I do think it was worth it.</p>
]]></description><pubDate>Wed, 27 Mar 2024 18:29:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=39842867</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=39842867</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39842867</guid></item><item><title><![CDATA[Maitake-sync: async synchronization primitives for no-std Rust]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.elizas.website/announcing-maitake-sync.html">https://www.elizas.website/announcing-maitake-sync.html</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=37385090">https://news.ycombinator.com/item?id=37385090</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 04 Sep 2023 21:08:23 +0000</pubDate><link>https://www.elizas.website/announcing-maitake-sync.html</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=37385090</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37385090</guid></item><item><title><![CDATA[New comment by mycoliza in "Minimal, allocation-free OpenMetrics implementation for no-std/embedded Rust"]]></title><description><![CDATA[
<p>in my use case (a hobby project; <a href="https://github.com/hawkw/eclss">https://github.com/hawkw/eclss</a>), the device and Prometheus are on the same LAN and i have Prometheus set up to discover scrape targets using multicast DNS. this is…probably not what you’d do if you were shipping a consumer project, i think, but it’s a nice setup for a home network.</p>
]]></description><pubDate>Sat, 04 Mar 2023 23:28:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=35025549</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=35025549</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35025549</guid></item><item><title><![CDATA[New comment by mycoliza in "Minimal, allocation-free OpenMetrics implementation for no-std/embedded Rust"]]></title><description><![CDATA[
<p>hi, i wrote this thing!<p>if you’re wondering why it’s weird, half-finished, or under-documented, it’s because i wrote it in a couple hours to scratch my own itch, and really didn’t expect to be at the top of hackernews today! if this is something that other people are actually interested in using, i’d be happy to clean it up a bit and add some of the missing stuff…</p>
]]></description><pubDate>Sat, 04 Mar 2023 23:17:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=35025498</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=35025498</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35025498</guid></item><item><title><![CDATA[New comment by mycoliza in "Tokio Console"]]></title><description><![CDATA[
<p>A lot of the Tokio console UI was inspired by `htop`, which provides a pretty similar overview of processes and threads. It doesn't really have the same ability to inspect things like `pthread_mutex` and timerfds etc in the same way that the Tokio console can inspect the state of `tokio::sync::Mutex` and `tokio::time::Sleep`, though; although I wonder if something like that could be possible with eBPF...</p>
]]></description><pubDate>Sat, 18 Dec 2021 22:11:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=29609058</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=29609058</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29609058</guid></item><item><title><![CDATA[New comment by mycoliza in "Tokio Console"]]></title><description><![CDATA[
<p>It's <a href="https://typeof.net/Iosevka/" rel="nofollow">https://typeof.net/Iosevka/</a> (I took the screenshots).</p>
]]></description><pubDate>Sat, 18 Dec 2021 22:08:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=29609039</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=29609039</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29609039</guid></item><item><title><![CDATA[New comment by mycoliza in "Tokio Console"]]></title><description><![CDATA[
<p>Yes, we've designed the overall architecture of the system to be modular so that the telemetry can be consumed by a number of different UIs --- we'd love to see someone write web interfaces and/or native GUIs for the console data. I have basically no web development experience whatsoever, though, so I went with the terminal app, because not having to learn JavaScript first made it a lot easier to get started :)<p>We're also thinking about factoring out the Tokio Console command-line application's internal data model and client code into its own library (<a href="https://github.com/tokio-rs/console/issues/227" rel="nofollow">https://github.com/tokio-rs/console/issues/227</a>) to make it easier to build other UIs on top of that.</p>
]]></description><pubDate>Sat, 18 Dec 2021 22:07:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=29609031</link><dc:creator>mycoliza</dc:creator><comments>https://news.ycombinator.com/item?id=29609031</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29609031</guid></item></channel></rss>