Skip to content

IOWarp Core 2.2.0

Choose a tag to compare

@lukemartinlogan lukemartinlogan released this 08 Aug 05:22
· 127 commits to main since this release
391755e

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 to AsyncGetBlob and 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::Local hot
    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 (default ON).
    A bare core without the module refuses kSemanticSearch with 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/cfs deleted, 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.
  • AggregateOut correctness (#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::Search is 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.