September in TigerLand
Dear friends,
We hope your September was superb. Last month, Jonas Axboe was crowned Radical Cup North America champion, the Gates Foundation’s Mojaloop shared its roadmap to TigerBeetle, and we worked side by side with Thndr in Cairo! We also caught a replica that never asked for a block it was missing, improved our storage engine fuzzing, and taught clients to tell you why they were evicted. And Systems Distributed ’26 wrapped up its premieres on YouTube. All talks are now available!
Let’s go!
“What is ‘familiarly known’ is not properly known, just for the reason that it is ‘familiar’.”
— Georg Wilhelm Friedrich Hegel
The VOPR (Viewstamped Operation Replicator) is our deterministic simulation tester. It runs real TigerBeetle code in a simulated environment where the clock, network communication, and disk accesses are all under our control. This allows us to inject failures, corruptions, crashes, and more with seeded randomness. Any failure can be replayed exactly from its seed!
- Last month, the VOPR found a liveness issue in the replica block repair code: one replica was missing a block that another replica could have sent it. Yet, it never asked for that block! When a replica tries to read a local block that is missing, it queues the block address. Periodically, the replica requests the missing blocks from other replicas. Each request can only fit a few blocks, which are taken from the front of the queue. If those blocks are never received, the blocks at the back of the queue starve. We now rotate the queue every time we build a request, so every missing block eventually gets requested.
- The VOPR can pause replicas to simulate events like VM migration. A recent refactor of how we handle simulated time caused paused replicas to keep running. An assertion in the simulator caught this problem quickly, and we fixed it.
Besides deterministic simulation testing, we are big fans of fuzzing. Sometimes, we write not one, not two, but four fuzzers to test a single component. One of the fuzzers in our system is the forest fuzzer. It tests our storage engine by comparing its results against a model. Last month, we made the model of the forest fuzzer simpler and its checks stricter:
- The forest should behave like a simple persistent key-value data structure. The simplified model consists of two hash maps and a log, making it independent of how the storage engine is implemented.
- The new model also computes the expected results of scans and the expected state after a crash. Previously, a scan that returned results in the wrong order or an empty result passed the fuzzer. Now, we compare the scan against the model correctly. We also extended the state check after a crash to verify that the checkpoint data is still preserved.
Our clients also got a behavior change. TigerBeetle can speak to a bounded number of clients, as per TigerStyle: everything has a limit. If this limit is exceeded or a session cannot continue for another reason, TigerBeetle evicts the client.
- Previously, if an evicted client tried to submit a request to
TigerBeetle, it would fail with
ClientClosed, even though the application never closed it. This behavior was misleading, especially after TigerBeetle started evicting clients in response toclient_pingmessages. - Last month, we decoupled
eviction from shutdown, which allows the client to asynchronously
surface the eviction reason that caused the session to end as part of
the error.
ClientClosedis now reserved for the case where the application closed the client itself. We implemented this change across all language clients.
- @simbo1905 found an off-by-one error in a journal assertion that rejected a valid memory layout. Great catch, Simon, thank you!
Last month on IronBeetle, Matklad and Tobi wrapped up the Pragmatics of Consensus series with a final episode on how TigerBeetle ensures safety when all replicas are down. In Multi Batching, Mini Batch 1, Matklad began diving into one of the core concepts behind TigerBeetle’s performance: batching. Specifically, how the state machine batches multiple operations to speed up processing.
And we had another bonus episode on ZIRP, the Zig Resilient Parser project started by Matklad! In this episode, Matklad showed how a parser can keep going when it hits broken code.
Join us live every Friday at 3pm UTC (new time) on Twitch, YouTube, and X!
Systems Distributed ’26 on YouTube, Sep 2–30
The SD26 premieres wrapped up last month, from Gerard Holzmann’s Power of Ten Rules
for Safety Critical Coding and Joran’s Mission-Critical,
to Andrew Kelley’s State of the Tagged
Union Address and James Cowling’s The Future Deserves
Good Architecture. Thank you to all who tuned in and joined the
stellar speakers in the live chat! The full
playlist is on YouTube.
Radical Cup North America Champion and World Finals in
Barcelona! Sep 6 & 19
Jonas Axboe wrapped up the Radical Cup North America with a great
performance at the Circuit of The Americas in Austin. After the last
race, Jonas was
crowned champion not only in the Pro 1500 Class but also the overall
Radical Cup North America! A few weeks later Jonas competed
internationally at the Radical World Finals in Barcelona. Glad we could
support you in-person at your first World Finals appearance and well
done on finishing seventh overall… champion
spirit!
TigerBeetle in Cairo with Thndr, Sep 9
Thndr, Egypt’s #1 investing app, is powered by TigerBeetle. Last month,
Lewis
and Georg traded calls and screens for a table in Cairo, working
side by side with the Thndr team. There’s nothing quite like solving
problems together in the same room! A joy to spend time, from whiteboard
sessions to learning to count in Arabic. Thanks for hosting us!
Bringing TigerBeetle to Mojaloop! Sep 17
Mojaloop’s central ledger has been running on MySQL since the platform’s
early days. Now, as national payment systems are pushing for higher OLTP
throughput, Mojaloop is replacing MySQL with TigerBeetle. James Bush wrote
about this journey and announced a preview release in the coming
weeks. Huge kudos to Lewis on our team for pushing the implementation
efforts!
High-Throughput OLTP in Three Simple Steps, Sep
17
Using the right tool incorrectly doesn’t make it the wrong tool… Tobi
and Maxi showed
us how to get the most out of TigerBeetle, from how to go from SQL
to double-entry primitives, how to use clients correctly to take
advantage of batching, and how TigerBeetle IDs can give another
performance gain. The result: over 900K transfers per second, compared
to around 7K for a relational database with stored procedures.
Join us at P99 CONF, Oct 21–22
This month! The P99 CONF agenda
is live, with Jens Axboe and Glauber Costa on the past, present, and
future of io_uring, Gunnar Morling on building his Parquet parser
Hardwood from scratch, and TigerBeetle’s Georg Kreuzmayr on the fastest
object storage client in the world (that we know of!). The official SDKs
didn’t fit TigerBeetle, so we TigerStyle’d it: DNS, TLS, and HTTP
built from the ground up in Zig, 4–10× faster than the official GCP and
AWS SDKs. Register for
free.
Munich Database Meetup: October Edition, Oct
27
Database friends in and around Munich, take note: it’s nearly time for
the October edition of the Munich Database
Meetup! Hristo Stoyanov on the Lakebase team at Databricks will
explain how to achieve 100x faster TPC-H queries through direct storage
reads, and Tobi Ziegler from our team will share how we reduced
TigerBeetle’s tail latency through algorithm engineering, including how
we apply these algorithms incrementally to avoid latency spikes in
practice. Our thanks to the awesome organizers; register
here and we hope to see you there!
’Till next time… be champion!
The TigerBeetle Team

















