github akkadotnet/akka.net 1.5.70
Akka.NET v1.5.70

5 hours ago

1.5.70 July 2nd, 2026

Akka.NET v1.5.70 is a maintenance release that adds a new "last-N" query offset to Akka.Persistence.Query, resolves two Akka.Streams reliability issues and improves BroadcastHub performance under high consumer counts, and fixes a consistent-hashing router bug that could wedge an entire cluster after a 32-bit hash collision.

Akka.Persistence.Query

  • Add Offset.FromEnd(int count) — "last-N events" query offset: Introduces Offset.FromEnd(int count), a new query-input-only offset type that begins a read journal query at the Nth event from the end of history rather than from the beginning. The offset is resolved at stream materialization into a concrete Sequence start position; no interface changes or wire-format changes are required. Includes opt-in TCK spec (FromEndOffsetSpec) for plugin authors.

Akka.Streams Bug Fixes

  • Fix: async enumerable source disposal ordering: Fixes a race in Source.From(IAsyncEnumerable<T>) where the underlying enumerator could be disposed before all elements were delivered to downstream, causing ObjectDisposedException on high-throughput pipelines.
  • Fix: ChannelSink drops final element on backpressure - Fixes #8285: ChannelSink was discarding the last element in a sequence whenever the downstream Channel<T> applied backpressure during completion. The sink now correctly delivers all elements before signaling completion.

Akka.Streams Performance

Akka.Core Bug Fixes

  • Fix: consistent-hashing router could wedge cluster-wide after a 32-bit hash collision - Fixes #8031: When two virtual nodes collided in the 32-bit consistent-hash ring (increasingly likely at high routee counts, e.g. when the ring was rebuilt after a node was downed), ConsistentHash.Create threw "An entry with the same key already exists". The consistent-hashing router swallowed the exception and returned NoRoutee for every subsequent message until a manual restart. The ring now linear-probes to the next free slot on a collision instead of throwing. This keeps the hash distribution unchanged and produces a byte-identical ring to prior versions whenever no collision occurs (safe for rolling upgrades), and also protects Akka.Cluster.Tools' ClusterReceptionist, which builds the same ring.

2 contributors since release 1.5.69

COMMITS LOC+ LOC- AUTHOR
22 2274 332 Aaron Stannard
1 97 4 beminee

To see the full set of changes in Akka.NET v1.5.70, click here.

Changes:

  • d484572 Release Akka.NET v1.5.70 (#8306)
  • cdec84e Fix #8031: consistent-hashing router wedges cluster-wide on 32-bit hash collision (#8294) [ #8293, #2, #3, #1 ]
  • 71e8a96 Fix ClusterClientSpec with two-phase shutdown handshake (#8008)
  • 7976627 Fix ClusterClientSpec flaky shutdown test with ask-pattern confirmation (#8007)
  • 611e2ed Fix racy ClusterClientSpec server restart test (#8004)
  • 0d0c953 Fix EventFilterTestBase logger-subscription race (#7797, partial) [ #8301 ]
  • 2c25543 Fix race condition in TcpSpec connection failure test (#7870)
  • 4a2098b Fix race condition in TCP abort test for Linux compatibility (#7815) [ #7813 ]
  • 47ebf2a Harden TcpSpec Outgoing_TCP_stream_must_handle_when_connection_actor_terminates_unexpectedly (backport of #7827) (#8301) [ #8132, #8078 ]
  • 8d1caea fix: make A_dispatcher_must_process_messages_one_at_a_time deterministic (#8300)
See More

This list of changes was auto generated.

Don't miss a new akka.net release

NewReleases is sending notifications on new releases.