Skip to content

Upgrade Netty and Reactor versions - #50418

Merged
Alan Zimmer (alzimmermsft) merged 33 commits into
mainfrom
MigrateToNetty42AndUpdateReactorAccordingly
Oct 15, 2026
Merged

Alan Zimmer (alzimmermsft) merged 33 commits into
mainfrom
MigrateToNetty42AndUpdateReactorAccordingly

Conversation

@alzimmermsft

Copy link
Copy Markdown
Member

Description

Upgrade Netty to 4.2 and match Reactor Netty (and therefore Reactor) versions accordingly.

All SDK Contribution checklist:

  • The pull request does not introduce [breaking changes]
  • CHANGELOG is updated for new features, bug fixes or other significant changes.
  • I have read the contribution guidelines.

General Guidelines and Best Practices

  • Title of the pull request is clear and informative.
  • There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, see this page.

Testing Guidelines

  • Pull request includes test coverage for the included changes.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 2 pipeline(s).
34 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@vcolin7

vcolin7 commented Sep 18, 2026

Copy link
Copy Markdown
Member

Most changes look good, but there's an issue with how the module-system loads native transports in both the azure-core and clientcore versions of our Netty library.

Netty 4.2 changes the native transport class JARs (e.g. io.netty.transport.epoll.linux.x86_64) and platform-native library JARs (e.g. io.netty.transport.classes.epoll) from automatic to explicit modules. The current module graphs won’t resolve them, so having those JARs on the module path will no longer be enough to make their classes and native libraries discoverable, which can existing applications silently fall back to JDK NIO.

I had Copilot run some tests and it showed that the epoll/kqueue (Linux's and MacOS' connection monitoring mechanisms) class modules were discoverable with the previous transport and Netty 4.1. With the new stack, Reactor’s native-transport detection treats the missing classes as unavailable and falls back to NIO. Resolving only the class module still leaves the bundled native library inaccessible.

Explicitly resolved modules Epoll classes visible Bundled native library visible
SDK module only No No
SDK + epoll class module Yes No
SDK + epoll class module + Linux native module Yes Yes

I haven't spent too long looking into how to preserve runtime discovery/activation of both the class and platform-native modules, but it seems requires static alone won’t bring either module into the runtime graph.

For context, the tests ran on Windows/JDK 25 and just checked module resolution and resource visibility, they didn’t actually execute native Linux/macOS I/O.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
31 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The Spring starter resolves a mixed Netty patch stack, version validation is incomplete, and several release metadata entries are stale.

11 open findings
What changed in this PR

Upgrades the repository’s Netty/Reactor stack and adapts transports, JPMS configuration, tests, and documentation for Netty 4.2.

Changes:

  • Upgrades Netty to 4.2.19, Reactor Netty to 1.3.7, and Reactor to 3.8.7.
  • Migrates event-loop, allocator, TLS, compression, and native-transport handling.
  • Updates dependency metadata, compatibility tests, and migration guidance.
File Description
sdk/​webpubsub/​azure-messaging-webpubsub-client/​src/​main/​java/​module-info.java Adds compression module.
sdk/​webpubsub/​azure-messaging-webpubsub-client/​src/​main/​java/​com/​azure/​messaging/​webpubsub/​client/​implementation/​websocket/​WebSocketSessionNettyImpl.java Migrates WebSocket Netty setup.
sdk/​webpubsub/​azure-messaging-webpubsub-client/​pom.xml Updates Netty/core dependencies.
sdk/​webpubsub/​azure-messaging-webpubsub-client/​CHANGELOG.md Documents migration.
sdk/​webpubsub/​azure-messaging-webpubsub-chat/​pom.xml Updates transport dependencies.
sdk/​voicelive/​azure-ai-voicelive/​pom.xml Updates Reactor Test.
sdk/​spring/​spring-cloud-azure-starter-servicebus-jms/​pom.xml Changes Netty buffer version.
sdk/​spring/​spring-cloud-azure-autoconfigure/​pom.xml Aligns Reactor and test transport.
sdk/​spring/​spring-cloud-azure-autoconfigure/​CHANGELOG.md Documents compatibility work.
sdk/​servicebus/​azure-messaging-servicebus/​src/​test/​java/​com/​azure/​messaging/​servicebus/​administration/​ServiceBusAdministrationClientTest.java Removes Netty status dependency.
sdk/​servicebus/​azure-messaging-servicebus/​src/​test/​java/​com/​azure/​messaging/​servicebus/​administration/​ServiceBusAdministrationAsyncClientTest.java Removes Netty status dependency.
sdk/​openai/​azure-ai-openai-realtime/​src/​main/​java/​module-info.java Adds compression module.
sdk/​openai/​azure-ai-openai-realtime/​src/​main/​java/​com/​azure/​ai/​openai/​realtime/​implementation/​websocket/​WebSocketSessionNettyImpl.java Migrates event loops.
sdk/​openai/​azure-ai-openai-realtime/​pom.xml Updates Netty/core dependencies.
sdk/​openai/​azure-ai-openai-realtime/​CHANGELOG.md Documents migration.
sdk/​monitor/​azure-monitor-opentelemetry-autoconfigure/​pom.xml Adds module read edge.
sdk/​metricsadvisor/​azure-ai-metricsadvisor/​src/​test/​java/​com/​azure/​ai/​metricsadvisor/​DataFeedClientTest.java Removes Netty status dependency.
sdk/​metricsadvisor/​azure-ai-metricsadvisor/​src/​test/​java/​com/​azure/​ai/​metricsadvisor/​DataFeedAsyncClientTest.java Removes Netty status dependency.
sdk/​keyvault/​azure-security-keyvault-secrets/​src/​test/​java/​com/​azure/​security/​keyvault/​secrets/​SecretClientTest.java Removes Netty status dependency.
sdk/​identity/​azure-identity/​src/​test/​java/​com/​azure/​identity/​WorkloadIdentityCredentialIdentityBindingTest.java Migrates test event loops.
sdk/​identity/​azure-identity/​pom.xml Updates core transport and module reads.
sdk/​formrecognizer/​azure-ai-formrecognizer/​src/​test/​java/​com/​azure/​ai/​formrecognizer/​FormTrainingClientTest.java Removes Netty status dependency.
sdk/​formrecognizer/​azure-ai-formrecognizer/​src/​test/​java/​com/​azure/​ai/​formrecognizer/​FormTrainingAsyncClientTest.java Removes Netty status dependency.
sdk/​formrecognizer/​azure-ai-formrecognizer/​src/​test/​java/​com/​azure/​ai/​formrecognizer/​documentanalysis/​administration/​DocumentModelAdministrationAsyncClientTest.java Removes Netty status dependency.
sdk/​formrecognizer/​azure-ai-formrecognizer/​src/​test/​java/​com/​azure/​ai/​formrecognizer/​documentanalysis/​administration/​DocumentModelAdminClientTest.java Removes Netty status dependency.
sdk/​eventhubs/​azure-messaging-eventhubs/​docs/​pom.xml Updates Reactor Core.
sdk/​eventhubs/​azure-messaging-eventhubs-checkpointstore-jedis/​pom.xml Updates Reactor Test.
sdk/​documentintelligence/​azure-ai-documentintelligence/​src/​test/​java/​com/​azure/​ai/​documentintelligence/​DocumentModelAdministrationClientTest.java Removes Netty status dependency.
sdk/​documentintelligence/​azure-ai-documentintelligence/​src/​test/​java/​com/​azure/​ai/​documentintelligence/​DocumentModelAdministrationAsyncClientTest.java Removes Netty status dependency.
sdk/​cosmos/​cspell.yml Adds JPMS term.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​module-info.java Adds compression module.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​http/​ReactorNettyClient.java Preserves pooled allocator behavior.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​guava25/​hash/​Striped64.java Removes obsolete import.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​directconnectivity/​rntbd/​RntbdServiceEndpoint.java Uses renamed channel option.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​directconnectivity/​rntbd/​RntbdLoopNIO.java Migrates NIO loops.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​directconnectivity/​rntbd/​RntbdLoopEpoll.java Migrates epoll loops.
sdk/​cosmos/​azure-cosmos/​src/​main/​java/​com/​azure/​cosmos/​implementation/​Configs.java Preserves TLS validation settings.
sdk/​cosmos/​azure-cosmos/​README.md Adds JPMS native-transport guidance.
sdk/​cosmos/​azure-cosmos/​pom.xml Updates core transport.
sdk/​cosmos/​azure-cosmos/​CHANGELOG.md Documents dependency migration.
sdk/​cosmos/​azure-cosmos-tests/​src/​test/​java/​com/​azure/​cosmos/​rx/​proxy/​HttpProxyServer.java Migrates proxy event loops.
sdk/​cosmos/​azure-cosmos-tests/​src/​test/​java/​com/​azure/​cosmos/​implementation/​http/​ReactorNettyHttpClientTest.java Tests allocator selection.
sdk/​cosmos/​azure-cosmos-tests/​src/​test/​java/​com/​azure/​cosmos/​implementation/​directconnectivity/​TcpServerMock/​TcpServer.java Migrates test event loops.
sdk/​cosmos/​azure-cosmos-tests/​src/​test/​java/​com/​azure/​cosmos/​implementation/​directconnectivity/​rntbd/​RntbdLoopTests.java Adds transport registration tests.
sdk/​cosmos/​azure-cosmos-tests/​src/​test/​java/​com/​azure/​cosmos/​implementation/​ConfigsTests.java Tests TLS settings.
sdk/​cosmos/​azure-cosmos-tests/​pom.xml Updates Reactor Test.
sdk/​cosmos/​azure-cosmos-spark-account-data-resolver-sample/​pom.xml Updates Reactor Test.
sdk/​cosmos/​azure-cosmos-spark_4-1_2-13/​pom.xml Excludes Spark Netty dependencies.
sdk/​cosmos/​azure-cosmos-spark_4-0_2-13/​pom.xml Excludes Spark Netty dependencies.
sdk/​cosmos/​azure-cosmos-spark_3/​src/​test/​scala/​com/​azure/​cosmos/​spark/​NettyCompatibilitySpec.scala Adds Netty compatibility tests.
sdk/​cosmos/​azure-cosmos-spark_3/​pom.xml Updates transport dependencies.
sdk/​cosmos/​azure-cosmos-spark_3-5/​pom.xml Excludes native transports.
sdk/​cosmos/​azure-cosmos-spark_3-4_2-12/​pom.xml Excludes native transports.
sdk/​cosmos/​azure-cosmos-encryption/​pom.xml Updates module reads and Reactor.
sdk/​core/​azure-core/​src/​test/​java/​com/​azure/​core/​http/​ProxyOptionsTests.java Isolates proxy tests from environment.
sdk/​core/​azure-core/​pom.xml Updates Reactor dependencies.
sdk/​core/​azure-core/​CHANGELOG.md Documents Reactor upgrade.
sdk/​core/​azure-core-version-tests/​pom.xml Updates Reactor Core.
sdk/​core/​azure-core-tracing-opentelemetry/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-test/​README.md Removes trailing whitespace.
sdk/​core/​azure-core-test/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-test/​CHANGELOG.md Documents dependency upgrade.
sdk/​core/​azure-core-serializer-json-jackson/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-serializer-json-gson/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-serializer-avro-apache/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-perf/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-management/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-http-vertx/​src/​test/​java/​com/​azure/​core/​http/​vertx/​VertxHttpClientBuilderTests.java Isolates proxy tests.
sdk/​core/​azure-core-http-vertx/​README.md Documents Netty 4.1 constraint.
sdk/​core/​azure-core-http-vertx/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-http-okhttp/​src/​test/​java/​com/​azure/​core/​http/​okhttp/​OkHttpAsyncHttpClientBuilderTests.java Isolates proxy tests.
sdk/​core/​azure-core-http-okhttp/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-http-netty/​src/​test/​java/​com/​azure/​core/​http/​netty/​NettyNativeTransportModulesTests.java Tests native module resolution.
sdk/​core/​azure-core-http-netty/​src/​test/​java/​com/​azure/​core/​http/​netty/​NettyAsyncHttpClientBuilderTests.java Tests allocator and event loops.
sdk/​core/​azure-core-http-netty/​src/​test/​java/​com/​azure/​core/​http/​netty/​implementation/​NettyUtilityTests.java Tests split Netty artifacts.
sdk/​core/​azure-core-http-netty/​src/​test/​java/​com/​azure/​core/​http/​netty/​implementation/​ByteBufWriterSubscriberTests.java Tests heap-buffer writes.
sdk/​core/​azure-core-http-netty/​src/​samples/​java/​com/​azure/​core/​http/​netty/​NettyAsyncHttpClientBuilderJavaDocCodeSnippets.java Updates event-loop samples.
sdk/​core/​azure-core-http-netty/​src/​main/​resources/​META-INF/​native-image/​com.azure/​azure-core-http-netty/​native-image.properties Updates native-image initialization.
sdk/​core/​azure-core-http-netty/​src/​main/​java/​module-info.java Adds split Netty modules.
sdk/​core/​azure-core-http-netty/​src/​main/​java/​com/​azure/​core/​http/​netty/​NettyAsyncHttpClientBuilder.java Preserves allocator behavior.
sdk/​core/​azure-core-http-netty/​src/​main/​java/​com/​azure/​core/​http/​netty/​implementation/​NettyUtility.java Updates version validation.
sdk/​core/​azure-core-http-netty/​src/​main/​java/​com/​azure/​core/​http/​netty/​implementation/​NettyAsyncHttpResponse.java Uses heap buffers for file writes.
sdk/​core/​azure-core-http-netty/​src/​main/​java/​com/​azure/​core/​http/​netty/​implementation/​ByteBufWriteSubscriber.java Adds bounded heap-buffer mode.
sdk/​core/​azure-core-http-netty/​README.md Adds migration guidance.
sdk/​core/​azure-core-http-netty/​pom.xml Upgrades Netty/Reactor stack.
sdk/​core/​azure-core-http-netty/​CHANGELOG.md Documents transport upgrade.
sdk/​core/​azure-core-http-netty/​cgmanifest.json Updates component inventory.
sdk/​core/​azure-core-http-jdk-httpclient/​src/​test/​java/​com/​azure/​core/​http/​jdk/​httpclient/​JdkHttpClientBuilderTests.java Isolates proxy tests.
sdk/​core/​azure-core-http-jdk-httpclient/​pom.xml Updates Reactor Test.
sdk/​core/​azure-core-experimental/​pom.xml Updates Reactor Test.
sdk/​confidentialledger/​azure-security-confidentialledger/​pom.xml Adds module read edges.
sdk/​communication/​azure-communication-jobrouter/​pom.xml Removes redundant enforcer config.
sdk/​communication/​azure-communication-common/​pom.xml Removes redundant Reactor dependency.
sdk/​clientcore/​http-okhttp3/​src/​test/​java/​io/​clientcore/​http/​okhttp3/​OkHttpHttpClientBuilderTests.java Isolates proxy tests.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​NettyHttpClientBuilderTests.java Tests Netty 4.2 builder behavior.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​NettyHttp2HttpClientTests.java Tests HTTP/2 decompression.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​implementation/​Netty4UtilityTests.java Tests TLS hostname verification.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​implementation/​Netty4PipelineCleanupHandlerTests.java Adjusts event-loop mock.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​implementation/​Netty4Http11ChannelBinaryDataTests.java Adjusts pipeline spying.
sdk/​clientcore/​http-netty4/​src/​test/​java/​io/​clientcore/​http/​netty4/​implementation/​Netty4ConnectionPoolTests.java Migrates test event loops.
sdk/​clientcore/​http-netty4/​src/​main/​java/​module-info.java Adds compression module.
sdk/​clientcore/​http-netty4/​src/​main/​java/​io/​clientcore/​http/​netty4/​NettyHttpClientBuilder.java Migrates native transport selection.
sdk/​clientcore/​http-netty4/​src/​main/​java/​io/​clientcore/​http/​netty4/​implementation/​Netty4Utility.java Updates version validation.
sdk/​clientcore/​http-netty4/​spotbugs-exclude.xml Adds SpotBugs suppression.
sdk/​clientcore/​http-netty4/​README.md Adds native-module guidance.
sdk/​clientcore/​http-netty4/​pom.xml Upgrades Netty dependencies.
sdk/​clientcore/​http-netty4/​CHANGELOG.md Documents Netty upgrade.
sdk/​clientcore/​cspell.yml Adds JPMS term.
sdk/​clientcore/​core/​src/​test/​java/​io/​clientcore/​core/​http/​models/​ProxyOptionsTests.java Isolates proxy tests.
sdk/​clientcore/​core/​src/​test/​java/​io/​clientcore/​core/​http/​client/​JdkHttpClientBuilderIT.java Isolates proxy integration test.
sdk/​attestation/​azure-security-attestation/​pom.xml Adds Bouncy Castle module read.
sdk/​ai/​azure-ai-agents/​src/​main/​java/​module-info.java Adds compression module.
sdk/​ai/​azure-ai-agents/​pom.xml Upgrades transport dependencies.
eng/​versioning/​version_client.txt Registers unreleased core versions.
eng/​versioning/​supported_external_dependency_versions.json Updates supported Reactor baseline.
eng/​versioning/​external_dependencies.txt Updates dependency catalog.
eng/​pipelines/​templates/​jobs/​ci.yml Extends analysis timeout.
docs/​contributor/​building.md Documents test-only module reads.
common/​perf-test-core/​pom.xml Updates Reactor enforcement.

🧠 Review effort: Balanced

Comment thread sdk/spring/spring-cloud-azure-starter-servicebus-jms/pom.xml
Comment thread sdk/core/azure-core-http-netty/cgmanifest.json Outdated
Comment thread sdk/clientcore/http-netty4/CHANGELOG.md Outdated
Comment thread sdk/clientcore/http-netty4/spotbugs-exclude.xml
Comment thread sdk/core/azure-core-http-netty/README.md Outdated
Comment thread sdk/core/azure-core-test/CHANGELOG.md
Comment thread sdk/cosmos/azure-cosmos/CHANGELOG.md Outdated
Comment thread sdk/openai/azure-ai-openai-realtime/CHANGELOG.md Outdated
Comment thread sdk/webpubsub/azure-messaging-webpubsub-client/CHANGELOG.md Outdated

@jeet1995 Abhijeet Mohanty (jeet1995) left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

As FYI, I'll follow up on this setting - https://netty.io/4.2/api/io/netty/channel/SingleThreadIoEventLoop.html#setIoRatio(int) and set it to 50 in further benchmarks in the spirit of retaining Netty 4.1 defaults ;)

@alzimmermsft
Alan Zimmer (alzimmermsft) merged commit b82a75f into main Oct 15, 2026
107 of 108 checks passed
@alzimmermsft
Alan Zimmer (alzimmermsft) deleted the MigrateToNetty42AndUpdateReactorAccordingly branch October 15, 2026 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Development

Successfully merging this pull request may close these issues.

5 participants