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 to client_ping messages.
    • 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. ClientClosed is now reserved for the case where the application closed the client itself. We implemented this change across all language clients.

    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!

    Tweet Tweet LinkedIn post Bluesky post Tweet LinkedIn post Tweet Tweet Tweet Tweet Tweet Tweet

    ’Till next time… be champion!

    The TigerBeetle Team

    An idling tiger beetle Speech bubble says hi