IOWarp Core 2.2.0
IOWarp Core 2.2.0 brings client-side data caching, a dedicated optional module for
dynamic data indexing, and a broad set of optimizations for memory-resident data.
820 commits across 126 merged pull requests from 14 contributors since
v2.1.0
(2026-06-15 → 2026-08-08).
Highlights
Client-side data caching
Reads that hit node-local data no longer pay for an IPC round trip. A client
attaches the runtime's shared-memory segment and serves the read in-process,
with the runtime's copy as the authority.
- Zero-IPC reads through an interposer over the core's mirror. The fast path
is native toAsyncGetBloband on by default, not an opt-in side channel. - A cache chimod layered on the interposer chain, asynchronous
write-through (not write-back), so a reader on another node cannot observe
a stale value that a writer never published. - Owner-side invalidation with node-local cached reads, plus per-replica
transform state and cache-copy semantics. - Compressed blobs keep the fast path. A compressed blob stays zero-IPC
readable; the fast path refuses only what it cannot serve correctly, rather
than disabling itself wholesale. - Writer-local copies and probe-free reads on the
PoolQuery::Localhot
path.
Measured on the clio-fs path, reads moved from 118–246 µs to 0.27–0.39 µs.
Correctness here was driven by a dedicated 4-node cache-coherence CI suite,
which is what surfaced the owner-node blind spot fixed in #894.
Dynamic data indexing (optional module, BM25)
SemanticSearch has been lifted out of the CTE core into a dedicated
indexer chimod — BM25 keyword scoring over blob bytes, returning the global
top-k by descending score.
- Optional at build time:
-DCLIO_CTE_ENABLE_INDEXER=ON|OFF(defaultON).
A bare core without the module refuseskSemanticSearchwith a clear return
code instead of silently degrading. - Indexing is asynchronous. Synchronous indexing collapsed put throughput by
roughly 20×; the coalesced async path removes that from the write path. - Scoped and persistent: tag/blob regex scoping, with state persisted via
snapshot + WAL so a restart restores the index rather than rescanning. - Behavioural coverage in
cte_indexer_ops, including the persistence engine
and the bare-core guard.
Optimizations for memory-resident data
- Cross-node write throughput up ~4× — a dedicated response lane plus a
recycled staging pool: ~80 MB/s sync / 118 MB/s defer → 258–467 MB/s/rank
warm steady-state, aggregating to ~1.3–1.9 GB/s durably-acked cross-node
writes (4-node, 64×1 MiB per rank). - Finer block granularity — 512 B / 1 KB / 2 KB block classes and 512 B RAM
bdev granularity, so small objects stop rounding up into wasted memory. - Extensible zero-copy put pipeline with a graceful capacity wall rather
than a hard failure at the edge. - Sharded deferred-put key table, hashed without allocation.
- Shard-ingest drain budget raised 16 → 256.
- Memory-class bdevs never restore persisted perf stats — a stale on-disk
profile had been silently routing all placement to disk. - Blob placement against real free space instead of the last stats tick.
Also in this release
- Filesystem layering — filesystem logic moved out of the POSIX adapter into
the chimod client;adapter/cfsdeleted, the descriptor layer now owned by the
filesystem client, and compiled out of Windows builds entirely. - HDF5 — merged and expanded VOL/VFD test suites; a dataset may now outlive
its file instead of being deleted underneath. - Distributed robustness (#856) — deterministic client failover, epoch-scoped
recovery claims, node rejoin made observable, and starvation no longer read as
node death. AggregateOutcorrectness (#915) — replica results merge their real OUT
fields instead of copying whole tasks over the origin's identity.- Process-global singletons publish exactly once — fixes a race that let two
instances of a global coexist, the root cause of three separate CI failures
across Linux, macOS and Windows. RegexSearchEngine::Searchis point-in-time consistent — a concurrent
rename can relabel an entry but can no longer drop it from a listing.- Ares perf-eval regression pipelines (#526), single-node and distributed.
- Reads never return unread bytes — a blob-liveness check now runs under the
reader's extent pin instead of before it, so a read racing a concurrent delete
reports absence rather than succeeding with the caller's own untouched buffer. - CI — full sweep now runs on every merge, and merges no longer cancel each
other's validation; one representative runner per OS on PRs. - Docs — installation leads with pip, and the quickstart now covers deploying
the FUSE filesystem that ships in the wheel.
Known issues
- The leader-election cluster test is temporarily disabled (#929).
It reproducibly crashes a node during recovery while the test itself still
reports success, so it was gating merges without carrying information. The
issue tracks a deterministic reproduction and the full investigation; the test
binary is still built so the code cannot rot. Leader death and re-election are
otherwise uncovered until it is re-enabled.
Upgrading
No API breaks. Client-side caching and the indexer are on by default; disable
the indexer with -DCLIO_CTE_ENABLE_INDEXER=OFF if you do not need
SemanticSearch.
Note for conda users: packages before this release published under a stale
version string (1.5.8) regardless of the actual source version. That is fixed
here — 2.2.0 packages report 2.2.0.