Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions BREAKING_CHANGES_V1.6.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ of `Behavior`, `Wire`, `API` (combine with `+`).

| Status | PR / Branch | Component | Type | Change | Migration |
|--------|-------------|-----------|------|--------|-----------|
| Planned | `feature/artery-inbound-lanes` | `Akka.Remote` (Artery) | Behavior | `akka.remote.artery.advanced.inbound-lanes` is now actually implemented (previously parsed but ignored -- every value behaved as 1). Its shipping default is changed from `4` to `1`, so out-of-the-box behavior is unaffected. An accepted Ordinary-stream connection now fans ordinary-message deserialization/dispatch out across N per-lane bounded queues + consumer loops, keyed by a stable hash of the recipient path (or, for `ActorSelectionMessage`, the selection's own target path elements), only when this value is explicitly raised above `1`; a new `akka.remote.artery.advanced.inbound-lane-buffer-size` (default `4096`) sizes each lane's queue. Per-recipient ordering is preserved. | No action required at the default. If you had previously set `inbound-lanes` > 1 in your own config expecting it to do something, it now genuinely enables parallel inbound processing -- revert to `1` if you relied on its prior no-op behavior. |
| Planned | `fix/cluster-nonblocking-startup` | `Akka.Cluster` | Behavior | Cluster extension startup no longer blocks on an internal 20s ask bounded by `akka.actor.creation-timeout`; `Cluster.Get()` returns immediately and core initialization completes asynchronously. The "Failed to startup Cluster" ask-timeout failure mode (which could terminate a healthy node under thread starvation) is removed; genuine core-startup failures still shut the node down via supervision. | None for typical code — all public APIs are message-based or awaitable. Code that used `Cluster.Get()` as a "core is started" synchronization point should await `JoinAsync`/`RegisterOnMemberUp` or observe cluster state. |
| Planned | `fix/artery-pipe-watermarks` | `Akka.Remote` (Artery) | Behavior | Artery TCP connections now raise the pause/resume watermarks of their internal read pipe to 1 MiB (pause 2 MiB), via a new opt-in `Akka.IO.Inet.SO.PipeBufferSize` socket option consulted by `TcpIncomingConnection`/`TcpOutgoingConnection`, configurable via `akka.remote.artery.advanced.tcp.pipe-buffer-size` (default `1m`). Akka.IO's own default (~16 KiB, derived from `akka.io.tcp.receive-buffer-size`) is unchanged for every other TCP connection. | No action required. Artery connections use somewhat more memory per connection and see higher throughput under high-in-flight/one-way traffic; tune via `akka.remote.artery.advanced.tcp.pipe-buffer-size` if needed. |
| Merged | [#8317](https://github.com/akkadotnet/akka.net/pull/8317) | `Akka.Remote` / `Akka.Cluster` | API | System/address UID widened `int` → `long` across `AddressUid.Uid`, `AddressUidExtension.Uid()`, `UniqueAddress(Address, int)`/`.Uid`, `QuarantinedEvent(Address, int)`/`.Uid`, `RemoteWatcher.HeartbeatRsp(int)`/`.AddressUid`, and all `Quarantine(Address, int? uid)` members (`IRemoteActorRefProvider` / `RemoteTransport` / `RemoteWatcher`). Hard re-type (v1.6). Prerequisite for Artery. | Recompile against the `long` members; replace `int` uid locals with `long`. Default UID generation stays in 32-bit range; full 64-bit generation is opt-in via `akka.remote.use-64bit-system-uids = on`. |
Expand Down
7 changes: 6 additions & 1 deletion src/core/Akka.Remote.Tests/Artery/ArteryConfigSpec.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,11 @@ public void Should_ParseArterySettingsDefaults_When_ConfigNotOverridden()
settings.CanonicalHostname.Should().Be("localhost");
settings.CanonicalPort.Should().Be(25520);
settings.MaximumFrameSize.Should().Be(256 * 1024);
settings.InboundLanes.Should().Be(4);

// Ships at 1 (single-lane, fused pipeline -- byte-identical to pre-lanes processing)
// until the scaling gates pass -- see ArterySettings.InboundLanes's remarks.
settings.InboundLanes.Should().Be(1);
settings.InboundLaneBufferSize.Should().Be(4096);

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buffer size == msg count here, not bytes.

settings.OutboundLanes.Should().Be(1);
settings.HandshakeTimeout.Should().Be(20.Seconds());
settings.HandshakeRetryInterval.Should().Be(1.Seconds());
Expand Down Expand Up @@ -108,6 +112,7 @@ public void Should_ParseArterySettingsDefaults_When_ConfigNotOverridden()
[InlineData("akka.remote.artery.advanced.maximum-frame-size = 0b")]
[InlineData("akka.remote.artery.advanced.maximum-frame-size = 20000000b")] // > 0x00FFFFFF (16 MiB - 1)
[InlineData("akka.remote.artery.advanced.inbound-lanes = 0")]
[InlineData("akka.remote.artery.advanced.inbound-lane-buffer-size = 0")]
[InlineData("akka.remote.artery.advanced.outbound-lanes = 0")]
[InlineData("akka.remote.artery.transport = aeron")]
[InlineData("akka.remote.artery.advanced.system-message-buffer-size = 0")]
Expand Down
Loading
Loading