Repository navigation
Docs: update Native AOT support scope for v1.6 - #8701
Merged
Aaronontheweb merged 2 commits intoOct 1, 2026
Merged
Conversation
native-aot.md predates several AOT milestones merged since: LoggerSetup and ExtensionsSetup now exist, module serializer tables cover Remote, Cluster, the cluster-tools family, Persistence and Streams, and the Akka.Hosting.AOT.App canary now runs in CI alongside the core one. Reword the Remote/Cluster/Persistence note from "unsupported" to "not yet verified" - no canary boots an ActorSystem through any of them under Native AOT yet, which is a different claim than classic DotNetty remoting being broken. Call out Props-based remote deployment as its own still-reflective path, and point to source-generated MessagePack serialization as the trim-safe alternative to the default JSON serializer for user messages.
The previous update overclaimed in both directions. Fix it against the actual source, each site checked directly: - Classic DotNetty remoting does not work under Native AOT, full stop: EndpointManager, FailureDetectorRegistry and TransportAdapters each resolve a HOCON type name with an unguarded Type.GetType, so startup throws TypeLoadException on the transport class. Artery already ships on dev as an experimental opt-in (akka.remote.artery.enabled, default off), not a future target - no CI canary covers it yet, though. - Akka.Cluster, Akka.Persistence and the cluster tools: their own serializers resolve from built-in tables now, but downing-provider-class, the Persistence journal/snapshot plugin class, event adapters, the DData durable store (ReplicatorSettings) and a custom sharding state store (CustomStateStoreModeProvider) still go through unguarded Type.GetType. Call these unsupported, not "not yet verified". - Split out remote deployment's real site, DaemonMsgCreateSerializer. PropsFromProto, from Props.TypeName/PropsSurrogate, which is a different path (what a serializer carries a Props value through). - Added the stream-refs-with-the-switch-off case (SerializationTools. TypeFromString, akkadotnet#8667) and the uncached-manifest case on the base Serializer.FromBinary(byte[], string) (akkadotnet#8697), including Persistence's PersistentFSM.PersistentFSMSnapshot<> staying on that fallback. - Setup list was wrong: three types take an instance/factory today (LoggerSetup, SerializationSetup, ExtensionsSetup), with BootstrapSetup as the optional fourth - not "four" as peers. - Named the real akka.extensions table entries (DistributedDataProvider, DistributedPubSubExtensionProvider, ClusterClientReceptionistExtensionProvider, ClusterMetricsExtensionProvider) instead of the HOCON short names. - Dropped the trimmed-publish claim CI doesn't check, described what the canaries actually gate on (a Warning/Error log at startup) instead of "nothing warns", and added a short tip on reading per-call-site warnings.
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
docs/articles/deployment/native-aot.mddated back to #8608 and hadn't caught up with the AOT work merged since, or with how classic remoting actually behaves. This updates it to matchdev.What changed
src/aot/Akka.Hosting.AOT.App) alongside the core one (src/aot/Akka.AOT.App) - both run in CI on every PR, each against its own warning baseline. Described what the canaries actually gate on (anyWarning/Errorlogged at startup fails the run), not "nothing warns." Dropped the claim that a trimmed (non-AOT) publish is verified - CI only publishes withPublishAot.LoggerSetup,SerializationSetup,ExtensionsSetup- withBootstrapSetupas the optional fourth for config/scheduler. (Several otherSetuptypes exist too -LogFilterSetup,NewtonSoftJsonSerializerSetup,DependencyResolverSetup- just not ones this page's HOCON-type-name story is about.)akka.extensionstable entries (DistributedDataProvider,DistributedPubSubExtensionProvider,ClusterClientReceptionistExtensionProvider,ClusterMetricsExtensionProvider) instead of HOCON short names.EndpointManager,FailureDetectorRegistryandTransportAdapterseach resolve a HOCON type name with an unguardedType.GetType, so aprovider = remoteapp throwsTypeLoadException: Cannot instantiate transport [...TcpTransport,Akka.Remote]at boot. Artery (akka.remote.artery.enabled = on) already ships ondevas an experimental opt-in, not a future target - it's just not covered by a CI canary yet. Akka.Cluster, Akka.Persistence and the cluster tools get their own bullet: serializers resolve from built-in tables, butdowning-provider-class, the Persistence journal/snapshot pluginclass, event adapters, the DData durable store, and a custom sharding state store all still go through unguardedType.GetType- call these unsupported.DaemonMsgCreateSerializer.PropsFromProto(Type.GetType(protoProps.Clazz), no table, no guard), and separated it fromProps.TypeName/PropsSurrogate, which is a different path - what a serializer carries aPropsvalue through, not remote deployment specifically.SerializationTools.TypeFromString, Native AOT: 3 IL2xxx/IL3xxx warnings from the stream-ref serializer (Akka.Streams) #8667) and an uncached manifest on the baseSerializer.FromBinary(byte[], string)(AOT: serializers resolve their own manifests; guard the TypeCache fallback #8697), including that Persistence'sPersistentFSM.PersistentFSMSnapshot<>stays on that fallback.TrimmerSingleWarn=false).Verification
npx markdownlint-cli@0.31.0 "docs/articles/deployment/native-aot.md"- clean--rules markdownlint-rule-titlecase@0.1.0(matchesDocsMarkdownLintinginbuild-system/pr-validation.yaml) - cleannpx cspell@6.12.0 --config ./docs/cSpell.json "docs/articles/deployment/native-aot.md"(matchesDocsSpellcheck) - 0 issuesdotnet docfx build ./docs/docfx.json --warningsAsErrors- ran.dotnet docfx metadatafails on a fresh checkout of this worktree before anything else has builtAkka.Remote- its source generator forArteryControlMessageSerializerhasn't run yet, so docfx's own Roslyn pass sees an incomplete partial class. Not adev-wide break; adotnet buildfirst would avoid it. The content build (docfx build) completed on its own with only pre-existingUidNotFoundwarnings from the missing API metadata; none referencenative-aot.md.EndpointManager.cs:1036,FailureDetectorRegistry.cs:80,TransportAdapters.cs:96,ReplicatorSettings.cs:61,CustomStateStoreModeProvider.cs:36,EventAdapters.cs,Persistence.cs:106,340,DaemonMsgCreateSerializer.cs:95,SerializationTools.cs, andSerializer.cs'sFromBinary(byte[], string).