Cluster Compatibility
Supported stacks
| Component | Version | Notes |
|---|---|---|
| Aeron Java/C media driver | 1.53.3 | aeron submodule tag; archive + consensus module |
| Aeron Cluster Java | 1.53.3 | clustered service container |
| rusteron (Rust bindings) | 0.2.13 (workspace Cargo.toml) | rusteron-client, rusteron-media-driver; bundles Aeron C 1.53.3 (the tutorial sample also uses rusteron-archive) |
| ergo-sbe (codec generator) | 0.1.x | schema 111 session + mark codecs |
| Rust | 1.99+ | the workspace rust-version (the cluster Cargo.toml declares none); edition 2024. CI builds the cluster crate with 1.99.0; the MSRV job checks ergo-sbe only |
| OS | Linux x86-64 and arm64 | CI runs the cluster unit tests on ubuntu-24.04 and ubuntu-24.04-arm, and the live-cluster harness on ubuntu-24.04 only. macOS is not run in CI |
| Java | 25 (17+) | Archive and Cluster; the test harness runs Temurin 25 in CI (21 for the Aeron 1.46.8 compatibility job). Java for Archive and Cluster |
Schema identities
| Schema | Id | SBE version | semanticVersion |
|---|---|---|---|
| Aeron Cluster Session | 111 | 17 | 5.4 |
| Aeron Cluster Mark | 110 | 2 | 5.4 |
These are pinned in cluster/schemas/ and generated by cluster/build.rs.
The generated codec API is unstable — use the high-level AeronCluster
client, not the cluster_codec_types module directly.
Failure modes
The client handles these documented transitions:
| Trigger | Expected behaviour |
|---|---|
| Leader loss (the session’s egress image closes / publication CLOSED) | Session → AwaitingNewLeader, poll for NewLeaderEvent |
NewLeaderEvent (the last one in a poll) | Bind to the image that delivered it; add the leader’s ingress publication without waiting; Connected once it connects, Disconnected if it has not within the message timeout |
SessionEvent(CLOSED) | Session → PendingClose → Closed, even while a new leader’s publication is pending |
| Redirect during connect | Follow leader_endpoints to new leader |
| New ingress publication (redirect or new leader) | Keep every unicast ingress channel setting but the endpoint, and re-add IPC and multicast channels unchanged, so the message limits do not change |
| Auth challenge | Pass to CredentialsSupplier, send ChallengeResponse |
| Auth rejection | ClusterError::AuthRejected |
| Timeout (connect / poll / new-leader) | ClusterError::Timeout / ClusterError::Disconnected |
| Listener panic | ClusterError::ListenerPanicked, session continues |
| Malformed egress frame | ClusterError::ProtocolError |
| Payload too large | ClusterError::PayloadTooLarge |
| Publication backpressure | Retryable ClusterError::Publication |
What CI runs against a live cluster
The harness (cluster-test-harness/tests/) runs in ci.yml
(aeron-cluster-integration, Aeron 1.53.3, Java 25) and in
cluster-compatibility.yml (Aeron 1.46.8, Java 21, when cluster/ or
sbe/src/ changes).
| Covered | Test file |
|---|---|
| 3-node connect, leader failover, redirect | failover.rs, failover_own_driver.rs, client_parity.rs, nonblocking.rs |
| New leader that never connects times out | nonblocking.rs (a_new_leader_that_never_connects_times_out) |
SessionEvent(CLOSED) while a new leader is pending | nonblocking.rs |
| Ingress channel settings kept across failover and redirect | ingress_channel_settings.rs |
| Fragmented egress, regular and controlled poll | egress_fragmentation.rs |
| Restart, reconnect, quorum loss, log recovery | restart.rs |
| Null and simple credentials (the default authenticator accepts all) | auth.rs |
Not covered by the harness: auth challenge and rejection, controlled-poll
abort, and connect or poll timeout expiry. Unit tests in cluster/src/ (run
by ci.yml’s test job) cover challenge dispatch (egress.rs), the
challenge response (credentials.rs, client.rs) and the new-leader timeout
(client.rs, test_new_leader_timeout_disconnects). No test drives
ClusterError::AuthRejected, a controlled-poll abort, or a connect or poll
timeout.
Limitations
- No dynamic membership (static cluster only).
- No snapshot/recovery integration.
- No TLS/mTLS at the Aeron transport layer.
- The
cluster_codec_typesmodule is#[doc(hidden)]and not stable API.