This is an automated email from the ASF dual-hosted git repository.
hgruszecki pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iggy-website.git
The following commit(s) were added to refs/heads/main by this push:
new ac3ca71a Clarify io_uring blogpost sections (#36)
ac3ca71a is described below
commit ac3ca71a2e00b74e4d52e8136ba5396341d87b89
Author: Hubert Gruszecki <[email protected]>
AuthorDate: Fri Feb 27 09:15:33 2026 +0100
Clarify io_uring blogpost sections (#36)
---
content/blog/thread-per-core-io_uring.mdx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/content/blog/thread-per-core-io_uring.mdx
b/content/blog/thread-per-core-io_uring.mdx
index 0f9f732b..0ae93279 100644
--- a/content/blog/thread-per-core-io_uring.mdx
+++ b/content/blog/thread-per-core-io_uring.mdx
@@ -13,9 +13,9 @@ At Apache Iggy, performance is one of our core principles. We
take pride in bein
To explain the "whys" of that decision in detail, a quick primer on the status
quo is needed.
Apache Iggy utilized `tokio` as its async runtime, which uses a multi-threaded
work-stealing executor. While this works great for a lot of applications (work
stealing takes care of load balancing), fundamentally it runs into the same
problem as many "high-level" libraries: a lack of control.
-When `tokio` starts, it spins up `N` worker threads (typically one per core)
that continuously execute and reschedule `Futures`. The scheduler decides on
which worker a particular `Future` gets to run, which can potentially lead to a
lot of context switches, cache invalidations, and unpredictable execution
paths. While Rust `Send` and `Sync` bounds eliminate many of the data races
associated with multi-threaded programming, there are still bunch of footguns
left open, such as [deadlocks] [...]
+When `tokio` starts, it spins up `N` worker threads (typically one per core)
that continuously execute and reschedule `Futures`. The scheduler decides on
which worker a particular `Future` gets to run, which can lead to task
migrations between workers, cache invalidations, and less predictable execution
paths. While Rust `Send` and `Sync` bounds prevent data-race undefined
behavior, they do not prevent higher-level concurrency bugs such as
[deadlocks](https://github.com/apache/iggy/pull/1567).
-But even these challenges weren't what finally tipped us over the edge. The
way `tokio` handles block device I/O was the real dealbreaker. Tokio, following
the poll-based Rust `Futures` model, uses (depending on the platform) a
notification-based mechanism to perform I/O on file descriptors. The runtime
subscribes for a readiness notification for a particular descriptor and
`awaits` the readiness in order to submit the I/O operation. While this works
decently well for network sockets, it [...]
+But even these challenges weren't what finally tipped us over the edge. The
way `tokio` handles block device I/O was the real dealbreaker. Tokio, following
the poll-based Rust `Futures` model, uses (depending on the platform) a
notification-based mechanism to perform I/O on file descriptors. The runtime
subscribes for a readiness notification for a particular descriptor and
`awaits` the readiness in order to submit the I/O operation. While this works
decently well for network sockets, it [...]
## Thread per core shared nothing architecture
The thread-per-core shared-nothing architecture is what we landed on when it
comes to improving the scalability of Apache Iggy. It has been proven to be
successful by high-performance systems such as
[ScyllaDB](https://github.com/scylladb/scylladb) and
[Redpanda](https://github.com/redpanda-data/redpanda), both of those projects
utilize the [Seastar](https://github.com/scylladb/seastar) framework to achieve
their performance goals.
@@ -51,7 +51,7 @@ At first glance since the thread-per-core shared-nothing
model all state is loca
> thread 'shard-8' (496633) panicked at
> core/server/src/streaming/topics/helpers.rs:298:21:
RefCell already borrowed
-Turns out that `RefCell` isn't safe to use across an `.await` point, there is
even clippy lint for that - `clippy::await_holding_refcell_ref`.
+Turns out that holding a `RefCell` borrow across an `.await` point can cause
runtime borrow panics, there is even a clippy lint for that -
`clippy::await_holding_refcell_ref`.
The Rust `wg-async` (async working group) seems to be aware of that footgun
and describes it in [this
story](https://rust-lang.github.io/wg-async/vision/submitted_stories/status_quo/barbara_wants_to_use_ghostcell.html).
It *feels* like it should be possible to express statically-checked borrowing
for `Futures` using primitives such as `GhostCell`, they even share a
[proof-of-concept runtime](https://crates.io/crates/stakker) that does exactly
that, but achieving an ergonomic API indistin [...]