Releases: apache/pulsar
Release list
v4.2.4
2026-08-03
Library updates
- [fix][ci] Upgrade sandboxed-trivy-action to approved sha (#26169)
- [improve][meta] Upgrade Oxia client to 0.9.4 (#26193)
- [improve][build] Upgrade docker base image Alpine to 3.24 (#26225)
- [improve][build] Upgrade slog to 0.10.0 (#26226)
- [improve][misc] Upgrade Jetty to 12.1.11 (#26233)
- [fix][sec][branch-4.2] Upgrade Hadoop to 3.5.0 (#26194)
- [fix][sec][branch-4.2] Upgrade Jackson version to 2.18.9 (#26186)
- [fix][sec][branch-4.2] Upgrade Netty to 4.1.136.Final (#26168)
- [improve][monitor][branch-4.2] Upgrade OpenTelemetry libraries (#26182)
Broker
- [fix][broker] Check deliverAt before containsMessage in bucket addMessage (#26230)
- [fix][broker] Fix
getEstimatedSizeSinceMarkDeletePositionthrowIllegalArgumentException(#26184) - [fix][broker] Fix bucket delayed message index metrics reset on scrape (#26171)
- [fix][broker] Fix delayed message index data loss when trimming overlapping bucket snapshots (#26240)
- [fix][broker] Fix incorrect listener URLs returned by ModularLoadManager lookups (#26245)
- [fix][broker] Fix Key_Shared delivery stall when look-ahead triggers at the end of the topic (#26236)
- [fix][broker] Fix silently dropped acknowledgement failures in PulsarMetadataEventSynchronizer (#26237)
- [fix][broker] Fix TableViewLoadDataStoreImpl close deadlock that stalls broker shutdown (#26243)
- [fix][broker] Prevent completing replicated snapshot before marker publish (#26119)
- [fix][broker] Prevent partition expansion from inheriting delayed-delivery bucket state (#26179)
- [fix][broker] Prevent stale read completions from stranding Failover subscriptions (#26174)
- [fix][broker] Prevent stale service unit callbacks from dropping active lookup and cleanup jobs (#26146)
- [fix][broker] Prevent stale topic unload cleanup from removing active cache entries (#26145)
- [fix][broker] Read subscription properties directly from cursor (#26159)
- [fix][broker] Release entry on GetLastMessageId when parseMessageMetadata throws (#26089)
- [fix][broker] Trigger max read position callback for messages published during transaction buffer recovery (#26234)
- [fix][broker][branch-4.2] Fix admin API HTTP 400 FAIL_ON_TRAILING_TOKENS when a broker interceptor is loaded (#26223)
- [fix][ml] Preserve ledger entries/size when transformLedgerInfo callback completes after a concurrent close (#26228)
- [fix][meta] Complete handleMetadataEvent future exceptionally when the initial get fails (#26199)
- [fix][meta] Fix NPE in shouldIgnoreEvent when MetadataEvent options is null (#26200)
- [fix][meta] Fix RocksdbMetadataStore instanceId not advancing across restarts (#26218)
- [fix][meta] Record get op stats on the correct completion branch in AbstractMetadataStore (#26201)
- [improve][broker] Skip system cursor when check inactive cursor. (#26149)
- [improve][broker] Trace the asynchronous tasks in logs when loading topics (#26163)
- [improve][offload] Support credentials from offload policies for S3 and Aliyun OSS drivers (#26232)
- [fix][broker] Fix BucketDelayedDeliveryTracker recovery after LightProto migration (#26160)
- [fix][broker] Prevent early replay of non-strict delayed messages (#26188)
- [fix][ml] Preserve ledger properties when closing ledger (#26227)
- [improve][meta] Support tuning Oxia MetadataStoreConfig through metadata-store URIs (#26150)
Client
- [fix][client] Fix lookup permit double-release, waiting queue starvation and timeout-response races in ClientCnx (#26143)
- [fix][client] Fix UnAckedMessageRedeliveryTracker to skip cancelled timeouts (#26043)
- [fix][client] Fix unAckedMessageTracker cleanup on multi-topics batch ack (#26001)
- [fix][client] Preserve null values in pulsar-admin schema output (#26196)
- [fix][client] Sync ackSet in client with broker to stop acked messages reaching the DLQ (#26135)
Pulsar IO and Pulsar Functions
- [fix][fn] Forward source message properties in Python runtime (#26191)
- [fix][fn] Return inputSpecs consumerProperties in function GET info (#26217)
Others
- [fix][metadata] Fix orphaned UR parent nodes not cleaned up with Oxia metadata backend (#26158)
- [improve][misc][branch-4.2] Add CustomLog config for slog
- [fix][misc][branch-4.2] Make log4j pattern compatible with slog which got pulled in by Oxia client upgrade
Tests & CI
- [fix][test] Fix flaky test
testCompactionPriority(#26198) - [improve][ci] Replace trivy-action with sandboxed-trivy-action (#25480)
- [fix][test][branch-4.2] Fix ManagedCursorTest compilation (#26221)
- [fix][ci][branch-4.2] Skip testMarkReplicatedDeletesEmptyParentNodes for Etcd
- [fix][ci][branch-4.2] Fix OpenTelemetrySanityTest after Otel library upgrade
For the complete list, check the full changelog.
v4.0.13
2026-08-03
Library updates
- [fix][sec][branch-4.0] Upgrade Hadoop to 3.5.0 (#26195)
- [fix][sec][branch-4.0] Upgrade Jackson version to 2.18.9 (#26187)
- [fix][sec][branch-4.0] Upgrade Netty to 4.1.136.Final (#26170)
- [fix][ci] Upgrade sandboxed-trivy-action to approved sha (#26169)
- [improve][meta] Upgrade Oxia client to 0.8.0 (#25964)
- [improve][meta] Upgrade Oxia client to 0.9.4 (#26193)
- [improve][monitor][branch-4.0] Upgrade OpenTelemetry libraries (#26165)
- [improve][build] Upgrade docker base image Alpine to 3.24 (#26225)
- [improve][build] Upgrade slog to 0.10.0 (#26226)
- [improve][misc] Upgrade Jetty to 12.1.11 (#26233)
- [improve][misc] Upgrade to Alpine 3.23 (#25180)
Broker
- [fix][broker] Check deliverAt before containsMessage in bucket addMessage (#26230)
- [fix][broker] Fix
getEstimatedSizeSinceMarkDeletePositionthrowIllegalArgumentException(#26184) - [fix][broker] Fix bucket delayed message index metrics reset on scrape (#26171)
- [fix][broker] Fix delayed message index data loss when trimming overlapping bucket snapshots (#26240)
- [fix][broker] Fix incorrect listener URLs returned by ModularLoadManager lookups (#26245)
- [fix][broker] Fix Key_Shared delivery stall when look-ahead triggers at the end of the topic (#26236)
- [fix][broker] Fix silently dropped acknowledgement failures in PulsarMetadataEventSynchronizer (#26237)
- [fix][broker] Fix TableViewLoadDataStoreImpl close deadlock that stalls broker shutdown (#26243)
- [fix][broker] Prevent completing replicated snapshot before marker publish (#26119)
- [fix][broker] Prevent partition expansion from inheriting delayed-delivery bucket state (#26179)
- [fix][broker] Prevent stale read completions from stranding Failover subscriptions (#26174)
- [fix][broker] Prevent stale service unit callbacks from dropping active lookup and cleanup jobs (#26146)
- [fix][broker] Prevent stale topic unload cleanup from removing active cache entries (#26145)
- [fix][broker] Read subscription properties directly from cursor (#26159)
- [fix][broker] Release entry on GetLastMessageId when parseMessageMetadata throws (#26089)
- [fix][broker] Trigger max read position callback for messages published during transaction buffer recovery (#26234)
- [fix][broker][branch-4.2] Fix admin API HTTP 400 FAIL_ON_TRAILING_TOKENS when a broker interceptor is loaded (#26223)
- [fix][ml] Preserve ledger entries/size when transformLedgerInfo callback completes after a concurrent close (#26228)
- [fix][meta] Complete handleMetadataEvent future exceptionally when the initial get fails (#26199)
- [fix][meta] Fix NPE in shouldIgnoreEvent when MetadataEvent options is null (#26200)
- [fix][meta] Fix RocksdbMetadataStore instanceId not advancing across restarts (#26218)
- [fix][meta] Record get op stats on the correct completion branch in AbstractMetadataStore (#26201)
- [improve][broker] Skip system cursor when check inactive cursor. (#26149)
- [improve][broker][branch-4.0] Trace the asynchronous tasks in logs when loading topics (#26163) (#26224)
- [improve][offload] Support credentials from offload policies for S3 and Aliyun OSS drivers (#26232)
Client
- [fix][client] Fix lookup permit double-release, waiting queue starvation and timeout-response races in ClientCnx (#26143)
- [fix][client] Fix lookup request semaphore not release problem (#25038)
- [fix][client] Fix UnAckedMessageRedeliveryTracker to skip cancelled timeouts (#26043)
- [fix][client] Fix unAckedMessageTracker cleanup on multi-topics batch ack (#26001)
- [fix][client] Preserve null values in pulsar-admin schema output (#26196)
- [fix][client] Sync ackSet in client with broker to stop acked messages reaching the DLQ (#26135)
Pulsar IO and Pulsar Functions
- [fix][fn] Forward source message properties in Python runtime (#26191)
- [fix][fn] Return inputSpecs consumerProperties in function GET info (#26217)
Others
- [improve][misc][branch-4.0] Add CustomLog config for slog
- [fix][metadata] Fix orphaned UR parent nodes not cleaned up with Oxia metadata backend (#26158)
- [fix][misc][branch-4.0] Make log4j pattern compatible with slog which got pulled in by Oxia client upgrade
Tests & CI
- [fix][test] Fix flaky test
testCompactionPriority(#26198) - [improve][ci] Replace trivy-action with sandboxed-trivy-action (#25480)
- [fix][build][branch-4.0] Fix spotbugs failure in OffloadPoliciesImpl
- [fix][ci][branch-4.0] Fix OpenTelemetrySanityTest after Otel library upgrade
- [fix][ci][branch-4.0] Skip testMarkReplicatedDeletesEmptyParentNodes for Etcd
For the complete list, check the full changelog.
v4.2.3
2026-07-06
Backported PIP
- [feat][pip] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies (#25547)
Library updates
- [fix][sec] Bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 in /pulsar-function-go (#26142)
- [fix][sec] Upgrade jline to 4.2.1 and picocli to 4.7.7, drop unused jline2 (#26068)
- [fix][sec] Upgrade pulsar-client-go to v0.20.0 in pulsar-function-go, also address CVEs (#26140)
- [improve][fn] Upgrade pulsar-client-python to 3.12.0 (#26033)
- [improve][fn] Upgrade pulsar-client-python to 3.13.0 (#26139)
- [improve][misc] Upgrade Apache Commons libraries and Apache Http components (#25963)
- [fix][sec][branch-4.2] Upgrade Jackson version to 2.18.8 (#26099)
- [improve][meta] Upgrade Oxia client to 0.8.0 (#25964)
- [fix][build][branch-4.2] Upgrade docker/setup-qemu-action to v4.1.0
Broker
- [fix][broker] Avoid attaching a consumer to a migrated non-persistent topic on subscribe (#26075)
- [fix][broker] Avoid blocking metadata read on the IO thread when redirecting migrated producers/consumers (#26051)
- [fix][broker] Avoid blocking the bundle-throughput lookup on per-bundle metadata reads (#26054)
- [fix][broker] Avoid blocking the dispatcher close path on delayed-delivery tracker close (#26053)
- [fix][broker] Don't let a closing topic-policies reader abort a concurrent cache-init reload (#26132)
- [fix][broker] Don't let a stuck or aborted topic policies cache init make a namespace's topics unloadable (#26025)
- [fix][broker] Fail fast for load balancer misconfigurations instead of falling back to SimpleLoadManagerImpl (#26031)
- [fix][broker] Fix compacted read could be stuck forever or message loss due to cursor mark delete (#25998)
- [fix][broker] Fix forced topic/namespace deletion hanging or failing when compaction is in progress (#26016)
- [fix][broker] Fix forced topic/namespace deletion still hanging when the compaction reader reconnect stalls (#26026)
- [fix][broker] Fix geo-replication stuck after a failed publish to the remote cluster (#26002)
- [fix][broker] Fix replication stall when a cursor rewind skips an in-flight read (#26106)
- [fix][broker] Fix replicator getting stuck under rate limiter throttling and honor readBatchSize/maxReadSizeBytes on the default read path (#26005)
- [fix][broker] Fix tableview divergence in ServiceUnitStateTableViewSyncer causing flaky tests (#25946)
- [fix][broker] Forward topic policy updates after init failures (#26110)
- [fix][broker] Guard BucketDelayedDeliveryTracker.nextDeliveryTime against empty queues (#26080)
- [fix][broker] Prevent subscribe rate limit from stalling compaction and blocking forced deletion (#26015)
- [fix][broker] Prevent topic policy initialization race with a buffering listener wrapper (#26044)
- [fix][broker] Run the message expiry check off the topic policy update path (#26040)
- [fix][broker] Run topic policy notifications on the topic-ordered executor (#26042)
- [fix][broker]Do not trigger topic GC if replication is still active (#25915)
- [fix][meta] Keep the leader value in the election cycle and make leader reads authoritative (#26000)
- [fix][meta] Run ledger-underreplication notification callbacks off the metadata-store listener thread (#26065)
- [improve][broker] Improve dispatch performance by summing entry bytes with a loop (#26055)
- [improve][broker] Load topic policies on non-persistent topic load and gate the policy replay (#26134)
- [improve][broker] Trim orphaned bucket snapshots when ledgers are deleted (#25984)
- [feat][broker] Expose managed ledger properties via topic internal stats (#26079)
- [feat][broker] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies (#25707)
- [fix][broker] Fix delayed messages stalling with isDelayedDeliveryDeliverAtTimeStrict=true (#26012)
- [fix][ml] Fix eviction trigger race that cleared the in-progress marker (#25988)
- [fix][ml] Reset messageMetadataInitialized when recycling RangeCacheEntryWrapper (#25987)
Client
- [fix][client] Run the failover health probe off the Netty event-loop thread (#26064)
- [fix][client] Prevent client shutdown from leaking event loop threads when DNS resolver close fails (#26045)
Pulsar IO and Pulsar Functions
- [fix][fn] Make exclusiveLeaderProducer volatile in FunctionMetaDataManager (#26046)
- [fix][fn] Reorder Function Worker shutdown to stop scheduler before runtime manager (#26136)
Others
- [fix][proxy] Avoid blocking the proxy IO thread on a cold broker cache (#26052)
- [fix] functions: Run worker leader-election off the consumer event-listener thread (#26059)
Tests & CI
- [fix][test] Deflake TopicPoliciesTest.setupTestTopic by retrying forced namespace deletion (#25974)
- [fix][test] Fix flaky AuditorBookieTest.testBookieClusterRestart (#26122)
- [fix][test] Fix flaky ExtensibleLoadManagerImplTest by re-serving the channel topic in initializeState (#25976)
- [fix][test] Fix flaky ExtensibleLoadManagerImplTest.initializeState by recovering wedged channel ownership (#25977)
- [fix][test] Fix flaky PersistentTopicsTest setup caused by concurrent Mockito stubbing (#26083)
- [fix][test] Fix flaky SchemaServiceTest.testSchemaRegistryMetrics (#25645)
- [fix][test] Fix flaky testPrepareInitPoliciesCacheAsyncThrowExceptionAfterCreateReader (#26049)
- [fix][test] Make SameAuthParamsLookupAutoClusterFailoverTest less timing-sensitive (#25675)
- [fix][test] Run makeReadEntryProbFail's errorOrNot on a caller-provided executor (#26123)
- [improve][test]Add test: test/testTopicPartitionCannotBeCreatedAfterTopicDeleted (#26038)
- [fix][test][branch-4.2] Adapt ConfigurationDataUtilsTest to Jackson 2.18.8 InetSocketAddress deserialization
For the complete list, check the full changelog.
v4.0.12
2026-07-06
Backported PIP
- [feat][pip] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies (#25547)
Library updates
- [fix][sec] Bump github.com/go-jose/go-jose/v4 from 4.1.3 to 4.1.4 in /pulsar-function-go (#26142)
- [fix][sec] Upgrade jline to 4.2.1 and picocli to 4.7.7, drop unused jline2 (#26068)
- [fix][sec] Upgrade pulsar-client-go to v0.20.0 in pulsar-function-go, also address CVEs (#26140)
- [fix][sec][branch-4.0] Upgrade Jackson version to 2.18.8 (#26098)
- [improve][fn] Upgrade pulsar-client-python to 3.12.0 (#26033)
- [improve][fn] Upgrade pulsar-client-python to 3.13.0 (#26139)
- [improve][misc] Upgrade Apache Commons libraries and Apache Http components (#25963)
- [fix][build][branch-4.0] Upgrade docker/setup-qemu-action to v4.1.0
Broker
- [fix][broker] Avoid attaching a consumer to a migrated non-persistent topic on subscribe (#26075)
- [fix][broker] Avoid blocking metadata read on the IO thread when redirecting migrated producers/consumers (#26051)
- [fix][broker] Avoid blocking the bundle-throughput lookup on per-bundle metadata reads (#26054)
- [fix][broker] Avoid blocking the dispatcher close path on delayed-delivery tracker close (#26053)
- [fix][broker] Don't let a closing topic-policies reader abort a concurrent cache-init reload (#26132)
- [fix][broker] Don't let a stuck or aborted topic policies cache init make a namespace's topics unloadable (#26025)
- [fix][broker] Fail fast for load balancer misconfigurations instead of falling back to SimpleLoadManagerImpl (#26031)
- [fix][broker] Fix compacted read could be stuck forever or message loss due to cursor mark delete (#25998)
- [fix][broker] Fix forced topic/namespace deletion hanging or failing when compaction is in progress (#26016)
- [fix][broker] Fix forced topic/namespace deletion still hanging when the compaction reader reconnect stalls (#26026)
- [fix][broker] Fix geo-replication stuck after a failed publish to the remote cluster (#26002)
- [fix][broker] Fix replication stall when a cursor rewind skips an in-flight read (#26106)
- [fix][broker] Fix replicator getting stuck under rate limiter throttling and honor readBatchSize/maxReadSizeBytes on the default read path (#26005)
- [fix][broker] Fix tableview divergence in ServiceUnitStateTableViewSyncer causing flaky tests (#25946)
- [fix][broker] Forward topic policy updates after init failures (#26110)
- [fix][broker] Guard BucketDelayedDeliveryTracker.nextDeliveryTime against empty queues (#26080)
- [fix][broker] Prevent subscribe rate limit from stalling compaction and blocking forced deletion (#26015)
- [fix][broker] Prevent topic policy initialization race with a buffering listener wrapper (#26044)
- [fix][broker] Run the message expiry check off the topic policy update path (#26040)
- [fix][broker] Run topic policy notifications on the topic-ordered executor (#26042)
- [fix][broker]Do not trigger topic GC if replication is still active (#25915)
- [fix][meta] Keep the leader value in the election cycle and make leader reads authoritative (#26000)
- [fix][meta] Run ledger-underreplication notification callbacks off the metadata-store listener thread (#26065)
- [improve][broker] Improve dispatch performance by summing entry bytes with a loop (#26055)
- [improve][broker] Load topic policies on non-persistent topic load and gate the policy replay (#26134)
- [improve][broker] Trim orphaned bucket snapshots when ledgers are deleted (#25984)
- [fix][broker][branch-4.0] Fix NOT_FOUND for topic policy operations on idle non-persistent topics
- [feat][broker] Expose managed ledger properties via topic internal stats (#26079)
- [feat][broker] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies (#25707)
Client
- [fix][client] Run the failover health probe off the Netty event-loop thread (#26064)
Pulsar IO and Pulsar Functions
- [fix][fn] Make exclusiveLeaderProducer volatile in FunctionMetaDataManager (#26046)
- [fix][fn] Reorder Function Worker shutdown to stop scheduler before runtime manager (#26136)
Others
- [fix][proxy] Avoid blocking the proxy IO thread on a cold broker cache (#26052)
- [fix] functions: Run worker leader-election off the consumer event-listener thread (#26059)
Tests & CI
- [fix][test] Deflake TopicPoliciesTest.setupTestTopic by retrying forced namespace deletion (#25974)
- [fix][test] Fix flaky AuditorBookieTest.testBookieClusterRestart (#26122)
- [fix][test] Fix flaky ExtensibleLoadManagerImplTest by re-serving the channel topic in initializeState (#25976)
- [fix][test] Fix flaky ExtensibleLoadManagerImplTest.initializeState by recovering wedged channel ownership (#25977)
- [fix][test] Fix flaky PersistentTopicsTest setup caused by concurrent Mockito stubbing (#26083)
- [fix][test] Fix flaky SchemaServiceTest.testSchemaRegistryMetrics (#25645)
- [fix][test] Fix flaky testPrepareInitPoliciesCacheAsyncThrowExceptionAfterCreateReader (#26049)
- [fix][test] Make SameAuthParamsLookupAutoClusterFailoverTest less timing-sensitive (#25675)
- [fix][test] Run makeReadEntryProbFail's errorOrNot on a caller-provided executor (#26123)
- [improve][test]Add test: test/testTopicPartitionCannotBeCreatedAfterTopicDeleted (#26038)
- [fix][test][branch-4.0] Adapt ConfigurationDataUtilsTest to Jackson 2.18.8 InetSocketAddress deserialization
- [fix][test][branch-4.0] Backport configurable read/add delays in PulsarMockBookKeeper
For the complete list, check the full changelog.
v5.0.0-M1
2026-06-23
Apache Pulsar 5.0.0-M1 is the first milestone release on the road to Apache Pulsar 5.0.0, with general availability expected later in 2026. It is a preview: an early build that puts the major new features of 5.0 in your hands so you can try them against real workloads and send feedback ahead of the GA release. It is not meant for production. Two changes stand out — Scalable Topics, a new topic type that grows and shrinks on its own, and the promotion of Oxia to Pulsar's recommended metadata store — alongside a migration of the build system to Gradle, the split of the IO connectors into a separate repository, and structured logging.
For a full walkthrough, see the announcement: Apache Pulsar 5.0.0-M1: A Preview of the Next Major Release.
Highlights
Scalable Topics (Topics v5). A new topic type that replaces fixed partitions with range-based segments, so a topic can scale up and down by transparently splitting and merging segments while preserving per-key ordering. This avoids the ordering breakage and operational drift that come from changing the partition count of a regular partitioned topic. The work spans the broker-side controller (PIP-468), metadata-driven transactions (PIP-473), regular-to-scalable topic migration (PIP-475), and automatic split/merge (PIP-483). See PIP-460.
New V5 Java client API. A clean-slate, purpose-built client API for scalable topics, shipped as a new, additive pulsar-client-v5 module — the existing pulsar-client and pulsar-client-api modules are unchanged, so current applications keep working. It replaces the classic Consumer/Reader and the four subscription types with three purpose-built consumers: QueueConsumer (parallel, individually-acknowledged work-queue consumption with dead-letter support), StreamConsumer (ordered, cumulative acks), and CheckpointConsumer (for stream processors such as Flink and Spark that track their own position). The V5 client also works against existing partitioned and non-partitioned topics, and a consumer can subscribe to an entire namespace. In M1 it ships for Java; other language SDKs will follow before GA. See PIP-466.
Oxia is now the recommended metadata store. Oxia becomes the recommended metadata store for new Pulsar clusters in 5.0 and is the backend of choice for scalable topics, whose lookups build on its streaming watch sessions. ZooKeeper remains fully supported, and PIP-454 adds a live, zero-downtime migration framework that moves an existing cluster from ZooKeeper to Oxia while the data plane keeps publishing and consuming.
Build system migrated from Maven to Gradle. Builds now use ./gradlew instead of mvn, with task-level caching and parallelism that substantially reduce local and CI build times, and a central version catalog (gradle/libs.versions.toml) for dependency management. The migration is transparent to users consuming the published Maven artifacts, Docker images, and shaded client JARs. See PIP-463.
IO connectors split into a separate repository. The built-in Pulsar IO connectors have been moved out of the core repository so they can follow their own release cadence. See PIP-465.
Structured logging. Pulsar now emits structured logs through slog across the broker, client, managed-ledger, functions, and metadata modules, with flat JSON / OpenTelemetry log output and a PULSAR_LOG_FORMAT environment variable to switch formats easily. See PIP-467.
API and platform modernization. Pulsar migrated from javax.* to jakarta.* APIs (PIP-472), made Protobuf v4 the default, migrated REST API annotations from Swagger to OpenAPI 3, and now supports building and running on Java 25. Topic policies gained a legacy-aware, metadata-store-backed routing backend (PIP-469).
Security and dependency updates. This release bundles a large set of dependency upgrades that address numerous CVEs across Netty, Jetty, log4j, BouncyCastle, Thrift, vert.x, and async-http-client, and upgrades BookKeeper to 4.18.0. See Library updates below.
Important notice
5.0.0-M1 is a major release that removes deprecated functionality and changes some APIs. Review the following before upgrading:
javax.*→jakarta.*migration (PIP-472). Custom broker plugins, interceptors, authentication/authorization providers, or other extensions that referencejavax.*packages (for examplejavax.ws.rsorjavax.servlet) must be updated to the correspondingjakarta.*packages and recompiled.- Etcd metadata store backend removed (PIP-462). Deployments using Etcd as the metadata store must migrate to ZooKeeper or Oxia before upgrading.
- IO connectors moved to a separate repository (PIP-465). Connectors are no longer released from the core Pulsar repository; obtain them from the dedicated connectors project.
- Build system is now Gradle (PIP-463). If you build Pulsar from source, use
./gradlewinstead ofmvn. Published artifacts are unchanged. fastutildependency removed (#25413).
Approved PIPs
- PIP-460: Scalable Topics (Topics v5)
- PIP-463: Migrate Build System from Maven to Gradle
- PIP-465: Split IO Connectors into Separate Repository
- PIP-467: Adopt slog for structured logging across Pulsar
- PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies
- PIP-472: Migrate from javax.* to jakarta.* APIs
Library updates
- [feat] Upgrade BookKeeper dependency to 4.18.0 (#25886)
- [fix][sec] Bump com.github.tomakehurst:wiremock-jre8-standalone from 2.33.2 to 2.35.1 (#25789)
- [fix][sec] Upgrade BouncyCastle to 1.84 (CVE-2026-5588, CVE-2026-0636) (#25569)
- [fix][sec] Upgrade commons-configuration2 to 2.15.0 to address CVE-2026-45205 (#25844)
- [fix][sec] Upgrade Jetty to address CVE-2026-2332 (#25527)
- [fix][sec] Upgrade Jetty to address CVE-2026-5795 (#25532)
- [fix] Upgrade Jetty to 12.1.6 to fix CVE-2026-1605 (#25485)
- [improve][misc] Upgrade Jetty to 12.1.9 (#25752)
- [improve][misc] Upgrade Jetty to 12.1.10 (#25943)
- [fix][sec] Upgrade log4j to 2.25.4 to address CVE-2026-34477, CVE-2026-34478, CVE-2026-34480, CVE-2026-34481 (#25521)
- [improve][misc] Upgrade log4j to 2.26.0 and slf4j to 2.0.18 (#25973)
- [fix][sec] Upgrade to Netty 4.1.132.Final to address CVEs (#25399)
- [fix][sec] Upgrade Netty to 4.1.133.Final to address CVEs (#25670)
- [improve][misc] Upgrade Netty to 4.1.134 (#25870)
- [fix][sec] Upgrade Netty to 4.1.135.Final to address several CVEs (#25918)
- [fix][sec] Upgrade thrift to 0.23.0 to address CVE-2026-43869 (#25744)
- [fix][sec] Upgrade to async-http-client 2.14.5 to address CVE-2026-40490 (#25546)
- [fix][sec] Upgrade vert.x to 4.5.25 to address CVE-2026-6860 (#25737)
- [fix][sec] Upgrade vertx to 4.5.27 to address CVE-2026-6860 (#25745)
- [improve][misc] Upgrade vert.x to 4.5.28 ([#25924](https://github.com/apache/pulsar/pu...
v4.2.2
2026-06-08
Library updates
- [fix][sec] Bump org.asynchttpclient:async-http-client from 2.14.5 to 2.15.0 (#25818)
- [fix][sec] Upgrade commons-configuration2 to 2.15.0 to address CVE-2026-45205 (#25844)
- [fix][sec] Upgrade Netty to 4.1.133.Final to address CVEs (#25670)
- [improve][misc] Upgrade Netty to 4.1.134 (#25870)
- [fix][sec] Upgrade Netty to 4.1.135.Final to address several CVEs (#25918)
- [fix][sec] Upgrade thrift to 0.23.0 to address CVE-2026-43869 (#25744)
- [fix][sec] Upgrade vert.x to 4.5.25 to address CVE-2026-6860 (#25737)
- [fix][sec] Upgrade vertx to 4.5.27 to address CVE-2026-6860 (#25745)
- [improve][misc] Upgrade vert.x to 4.5.28 (#25924)
- [improve][build] Remove kotlin-stdlib override; upgrade okhttp3 5.3.2 and okio 3.17.0 (#25855)
- [improve][build] Upgrade org.apache.kerby:kerb-simplekdc from 1.1.1 to 2.1.1 (#25785)
- [improve][misc] Upgrade Jetty to 12.1.9 (#25752)
- [improve][misc] Upgrade Jetty to 12.1.10 (#25943)
- [improve][misc] Upgrade Caffeine to 3.2.4 (#25663)
Broker
- [fix][broker] Clean up orphan ledger on concurrent initial schema creation in BookkeeperSchemaStorage (#25514)
- [fix][broker] Close pending acks cleanup gap in BacklogQuotaManager (#25624)
- [fix][broker] ConcurrentLongHashMap throw ArrayIndexOutOfBoundsException (#25644)
- [fix][broker] Correct two race conditions in the tracker code and logic bug in InMemoryDelayedDeliveryTracker that failed with NoSuchElementException (#25681)
- [fix][broker] Decrement unacked counter when removeAllUpTo removes pending acks (#25581)
- [fix][broker] Fix compaction cursor reset may lose mark-delete properties (#25862)
- [fix][broker] Fix ManagedLedgerImpl.advanceCursorsIfNecessary() method may lose non-durable cursor properties in race condition (#25796)
- [fix][broker] Fix non-batched null-value messages not removed during topic compaction (#25817)
- [fix][broker] Fix PersistentMessageExpiryMonitor findEntryComplete() method may lose mark-delete properties in race condition (#25803)
- [fix][broker] Fix precision loss in DataSketchesSummaryLogger by replacing LongAdder with DoubleAdder for sum accumulation (#25594)
- [fix][broker] Fix PulsarService.closeAsync where Condition.signalAll was called without holding a lock (#25777)
- [fix][broker] Fix race in pending acks removal in redeliverUnacknowledgedMessages (#25589)
- [fix][broker] Fix stuck chunks in SharedConsumerAssignor permit tracking (#25620)
- [fix][broker] Merge broker offload extra configurations (#25736)
- [fix][broker] Move pending acks cleanup to selected mark-delete callbacks (#25592)
- [fix][broker] Race condition causes perpetual backlog on internal topics (#25572)
- [fix][broker] Skip backlog-quota eviction on fenced/closing topics (#25684)
- [fix][broker] Use effective offload policies for extra configs (#25781)
- [fix][broker] Wait for orphan schema ledger cleanup before retry (#25579)
- [fix][broker][fix][broker]Replication stats is empty when the cluster is the target cluster of a one-way replication (#25583)
- [fix][broker]Replication is stuck because failed to read entries (#25625)
- [fix][bk] Fix NPE in IsolatedBookieEnsemblePlacementPolicy when policy class does not match (#25825)
- [fix][meta] Fix PulsarZooKeeperClient async addWatch callback retry behavior (#25913)
- [fix][meta] Fix ZooKeeper session reconnect race condition in PulsarZooKeeperClient.clientCreator (#25910)
- [improve][broker] optimize namespaceBundle validation to fix single-thread 100% CPU during unloading entire namespaces (#25626)
- [improve][broker] Prevent stale replicator pending reads after termination (#25767)
- [improve][offload] Coalesce automatic offload triggers to reduce retry loops and ledger scans (#25793)
- [fix][broker][branch-4.2] URL-encode sub-name in Txn pending-ack topic #25727 (#25728)
Client
- [fix][client] Apply Avro logical type conversions when decoding schema without classloader (#25759)
- [fix][client] Clean up unacked messages when unsubscribing a topic with ack timeout backoff (#25916)
- [fix][client] Fix failed to close consumer because of the error: param memorySize is a negative value (#25805)
- [fix][client] Make ClientBuilder serializable (#25730) (#25739)
- [fix][client] Match logical topic when removing unacked messages (#25921)
- [fix][client] Preserve equals in FieldParser map values (#25907)
- [fix][client] Prevent duplicate ServiceUrlProvider initialization (#25899)
- [fix][client] Reset higher-index states on recovery in SameAuthParamsLookupAutoClusterFailover (#25826)
- [fix][client] Stabilize scaleReceiverQueueHint against concurrent enqueue/take (#25578)
- [fix][client]Broker-side producer handle leak if closes a producer which state is regitering schema (#25725)
- [improve][client] Best-effort retry for individual/batch-index acks on send failure when ackReceiptEnabled=false (#25525)
- [improve][client] Clean up unacked message tracker when topics are removed in multi-topic consumers (#25923)
- [improve][client] Implement tls_client_auth for AuthenticationOAuth2 (#25538)
- [improve][client] In cases where there is a risk of message loss, adjust the log level to error (#25854)
Pulsar IO and Pulsar Functions
- [fix][fn] Fix functions update issue where artifact is provided as a http url (#25840)
- [fix][fn] Fix Go function runtime to continue after user exceptions and add neg-ack tests (#25867)
- [fix][fn] Fix orphan exclusive producer on creation timeout in WorkerUtils.createExclusiveProducerWithRetry (#25942)
- [improve][fn] Avoid gRPC timeout when getting status of a dead process runtime (#25819)
- [improve][fn] make built-in connector reload incremental (#25773)
- [improve][fn] make built-in functions reload incremental (#25868)
- [refactor][fn] Use Map instead of TreeMap for connector/function API types (#25790)
- [improve][functions] Allow customizing Kubernetes service domain suffix in Function Worker (#25872)
Others
- [fix][proxy] Avoid intermittent 502 when admin proxy follows a broker redirect for a request with a body (#25919)
- [fix][proxy] Close channel on connection failure (#25770)
- [improve][cli] Add client side looping in "pulsar-admin topics analyze-backlog" cli to avoid potential HTTP call timeout (#25126)
Tests & CI
- [fix][test] Add timeout to initial receives in ResendRequestTest.testSharedSingleAckedPartitionedTopic (#25828)
- [fix][test] Fix flaky ExtensibleLoadManagerImplTest.testLoadBalancerServiceUnitTableViewSyncer (#25596)
- [fix][test] Fix flaky OneWayReplicatorDeduplicationTest.testDeduplication ([#25679]...
v4.0.11
2026-06-08
Library updates
- [fix][sec][branch-4.0] Upgrade avro to 1.11.5 to address CVE-2025-33042 (#25788)
- [fix][sec] Bump org.asynchttpclient:async-http-client from 2.14.5 to 2.15.0 (#25818)
- [fix][sec] Upgrade commons-configuration2 to 2.15.0 to address CVE-2026-45205 (#25844)
- [fix][sec] Upgrade Netty to 4.1.133.Final to address CVEs (#25670)
- [improve][misc] Upgrade Netty to 4.1.134 (#25870)
- [fix][sec] Upgrade Netty to 4.1.135.Final to address several CVEs (#25918)
- [fix][sec] Upgrade thrift to 0.23.0 to address CVE-2026-43869 (#25744)
- [fix][sec] Upgrade vert.x to 4.5.25 to address CVE-2026-6860 (#25737)
- [fix][sec] Upgrade vertx to 4.5.27 to address CVE-2026-6860 (#25745)
- [improve][misc] Upgrade vert.x to 4.5.28 (#25924)
- [improve][build] Remove kotlin-stdlib override; upgrade okhttp3 5.3.2 and okio 3.17.0 (#25855)
- [improve][build] Upgrade org.apache.kerby:kerb-simplekdc from 1.1.1 to 2.1.1 (#25785)
- [improve][misc] Upgrade Jetty to 12.1.9 (#25752)
- [improve][misc] Upgrade Jetty to 12.1.10 (#25943)
Broker
- [fix][broker] Clean up orphan ledger on concurrent initial schema creation in BookkeeperSchemaStorage (#25514)
- [fix][broker] Close pending acks cleanup gap in BacklogQuotaManager (#25624)
- [fix][broker] ConcurrentLongHashMap throw ArrayIndexOutOfBoundsException (#25644)
- [fix][broker] Correct two race conditions in the tracker code and logic bug in InMemoryDelayedDeliveryTracker that failed with NoSuchElementException (#25681)
- [fix][broker] Decrement unacked counter when removeAllUpTo removes pending acks (#25581)
- [fix][broker] Fix compaction cursor reset may lose mark-delete properties (#25862)
- [fix][broker] Fix ManagedLedgerImpl.advanceCursorsIfNecessary() method may lose non-durable cursor properties in race condition (#25796)
- [fix][broker] Fix non-batched null-value messages not removed during topic compaction (#25817)
- [fix][broker] Fix PersistentMessageExpiryMonitor findEntryComplete() method may lose mark-delete properties in race condition (#25803)
- [fix][broker] Fix precision loss in DataSketchesSummaryLogger by replacing LongAdder with DoubleAdder for sum accumulation (#25594)
- [fix][broker] Fix PulsarService.closeAsync where Condition.signalAll was called without holding a lock (#25777)
- [fix][broker] Fix race in pending acks removal in redeliverUnacknowledgedMessages (#25589)
- [fix][broker] Fix stuck chunks in SharedConsumerAssignor permit tracking (#25620)
- [fix][broker] Merge broker offload extra configurations (#25736)
- [fix][broker] Move pending acks cleanup to selected mark-delete callbacks (#25592)
- [fix][broker] Race condition causes perpetual backlog on internal topics (#25572)
- [fix][broker] Skip backlog-quota eviction on fenced/closing topics (#25684)
- [fix][broker] Use effective offload policies for extra configs (#25781)
- [fix][broker] Wait for orphan schema ledger cleanup before retry (#25579)
- [fix][broker][fix][broker]Replication stats is empty when the cluster is the target cluster of a one-way replication (#25583)
- [fix][broker]Replication is stuck because failed to read entries (#25625)
- [fix][bk] Fix NPE in IsolatedBookieEnsemblePlacementPolicy when policy class does not match (#25825)
- [fix][meta] Fix PulsarZooKeeperClient async addWatch callback retry behavior (#25913)
- [fix][meta] Fix ZooKeeper session reconnect race condition in PulsarZooKeeperClient.clientCreator (#25910)
- [improve][broker] optimize namespaceBundle validation to fix single-thread 100% CPU during unloading entire namespaces (#25626)
- [improve][broker] PIP-380: Support-setting-up-specific-namespaces-to-skipping-the-load-shedding (#23549)
- [improve][broker] Prevent stale replicator pending reads after termination (#25767)
- [improve][offload] Coalesce automatic offload triggers to reduce retry loops and ledger scans (#25793)
Client
- [fix][client] Apply Avro logical type conversions when decoding schema without classloader (#25759)
- [fix][client] Clean up unacked messages when unsubscribing a topic with ack timeout backoff (#25916)
- [fix][client] Fix failed to close consumer because of the error: param memorySize is a negative value (#25805)
- [fix][client] Fix stale Healthy state in SameAuthParamsLookupAutoClusterFailover causing flaky test (#25388)
- [fix][client] Make ClientBuilder serializable (#25730) (#25740)
- [fix][client] Match logical topic when removing unacked messages (#25921)
- [fix][client] Preserve equals in FieldParser map values (#25907)
- [fix][client] Prevent duplicate ServiceUrlProvider initialization (#25899)
- [fix][client] Reset higher-index states on recovery in SameAuthParamsLookupAutoClusterFailover (#25826)
- [fix][client] Stabilize scaleReceiverQueueHint against concurrent enqueue/take (#25578)
- [fix][client]Broker-side producer handle leak if closes a producer which state is regitering schema (#25725)
- [improve][client] Best-effort retry for individual/batch-index acks on send failure when ackReceiptEnabled=false (#25525)
- [improve][client] Clean up unacked message tracker when topics are removed in multi-topic consumers (#25923)
- [improve][client] Enable configurable preemptive OAuth2 token refresh (#25363)
- [improve][client] Implement tls_client_auth for AuthenticationOAuth2 (#25538)
- [improve][client] In cases where there is a risk of message loss, adjust the log level to error (#25854)
Pulsar IO and Pulsar Functions
- [fix][fn] Fix functions update issue where artifact is provided as a http url (#25840)
- [fix][fn] Fix Go function runtime to continue after user exceptions and add neg-ack tests (#25867)
- [fix][fn] Fix orphan exclusive producer on creation timeout in WorkerUtils.createExclusiveProducerWithRetry (#25942)
- [improve][fn] Avoid gRPC timeout when getting status of a dead process runtime (#25819)
- [improve][fn] make built-in connector reload incremental (#25773)
- [improve][fn] make built-in functions reload incremental (#25868)
- [refactor][fn] Use Map instead of TreeMap for connector/function API types (#25790)
- [improve][functions] Allow customizing Kubernetes service domain suffix in Function Worker (#25872)
Others
- [improve][proxy][branch-4.0] Restore AdminProxyHandler changes which were accidentially reverted in Jetty 12 upgrade
- [fix][proxy] Avoid intermittent 502 when admin proxy follows a broker redirect for a request with a body (#25919)
- [fix][proxy] Close channel on connection failure (#25770)
Tests & CI
- [fix][test] Add timeout to initial receives in ResendRequestTest.testSharedSingleAckedPartitionedTopic (#25828)
- [fix][te...
v4.2.1
2026-04-27
Library updates
- [fix][sec] Upgrade BouncyCastle to 1.84 (CVE-2026-5588, CVE-2026-0636) (#25569)
- [fix][sec] Upgrade Jetty to address CVE-2026-2332 (#25527)
- [fix][sec] Upgrade Jetty to address CVE-2026-5795 (#25532)
- [fix][sec] Upgrade to async-http-client 2.14.5 to address CVE-2026-40490 (#25546)
- [fix][sec] Upgrade to Netty 4.1.132.Final to address CVEs (#25399)
- [fix][sec] Upgrade log4j to 2.25.4 to address CVE-2026-34477, CVE-2026-34478, CVE-2026-34480, CVE-2026-34481
- [fix] Upgrade Jetty to 12.1.6 to fix CVE-2026-1605 (#25485)
Broker
- [fix][broker] Change the schema incompatible log from ERROR to WARN level (#25483)
- [fix][broker] Fix backlog clearing for unloaded namespace bundles (#25272)
- [fix][broker] Lower log level of DrainingHashesTracker not-found entry to DEBUG (#25558)
- [fix][broker] Prevent timed-out producer creation from racing with retry (#25460)
- [fix][broker] pulsar admin stats internal with metadata command (#25557)
- [fix][broker] Revert "[improve][broker] Enhance advertised address resolution with fallback to localhost (#25238)" (#25523)
- [fix][broker] Unthrottle producers immediately when publish rate limiting is disabled (#25502)
- [fix][broker]Namespaces can be created with may empty replication_clusters policy (#25551)
- [fix][admin] Refactor namespace migration operation to async in rest api (#25478)
- [improve][broker] Close connection when close consumer write fails (#25520)
- [improve][broker] Use full bundle name for namespace bundle destination affinity in ModularLoadManagerImpl (#25518)
Client
- [fix][client] Fix thread-safety and refactor MessageCryptoBc key management (#25400)
Pulsar IO and Pulsar Functions
- [fix][io] Restore lz4 compression with Kafka IO connector after #25198 exclusion
Others
- [improve][common] Optimize TopicName.get() to reduce lock contention on cache lookup (#25367)
- [improve][broker] Improve the performance of TopicName constructor (#24463)
Tests & CI
- [fix][ci] Ensure discard_max_bytes is set to 0 only for existing block devices (#25510)
- [fix][test] Extend SameAuthParamsLookupAutoClusterFailoverTest phase timeouts (#25563)
- [fix][test] Fix flaky BrokerRegistryIntegrationTest port binding race (#25463)
- [fix][test] Fix flaky ExtensibleLoadManagerImpl client reconnection tests: PulsarClientException$AlreadyClosedException: Client already closed (#25509)
- [fix][test] Fix flaky ExtensibleLoadManagerTest.startBroker timeout (#25500)
- [fix][test] Fix flaky OffloadPrefixTest.testPositionOnEdgeOfLedger race with ledger rollover (#25561)
- [fix][test] Fix flaky ServerCnxTest.testCreateProducerTimeoutThenCreateSameNamedProducerShouldFail (#25497)
- [fix][test] Fix flaky testLoadBalancerServiceUnitTableViewSyncer (#25427)
- [fix][test] Flaky SameAuthParamsLookupAutoClusterFailoverTest (#25566)
- [fix][test] Recreate EventLoop in PublishRateLimiterTest setup (#25560)
- [fix][test] Relax BrokerRegistryIntegrationTest broker-close threshold (#25562)
- [improve][ci] Cleanup tune-runner-vm and clean-disk actions (#25444)
- [cleanup][ci] Remove documentation label bot (#25469)
- [cleanup][ci] Remove ready-to-test label enforcement (#25470)
- [cleanup][build] Bumped version to 4.2.1-SNAPSHOT
- [fix][build][branch-4.2] Use correct Jetty ee8 BOM coordinates
- [improve][ci] Backport fix for ssh-access action
For the complete list, check the full changelog.
v4.0.10
2026-04-27
Upgrade notice
This release upgrades Jetty from 9.4.x to 12.1.8 to address several high-severity CVEs in Jetty 9.4.x (#25534). For background and discussion, see the dev list thread.
The upgrade introduces the following breaking changes:
-
AdditionalServletinterface change. Theorg.apache.pulsar.broker.web.plugin.servlet.AdditionalServletinterface was coupled directly to the Jetty 9org.eclipse.jetty.servlet.ServletHolderclass. This coupling has been removed, so external implementations of this plugin API need to be updated. -
Athenz authentication requires Java 17+.
pulsar-client-auth-athenznow depends on Jetty and therefore requires Java 17+. The Pulsar Client and Pulsar Admin client themselves remain Java 8+ compatible. -
Prometheus metrics provider class relocation. The default Prometheus metrics provider classes for BookKeeper and ZooKeeper have been replaced because the previous defaults depended on Jetty 9.4.x. If you are using the previous default configuration file in your deployment, update the following settings:
Config file Setting Old value New value bookkeeper.confstatsProviderClassorg.apache.bookkeeper.stats.prometheus.PrometheusMetricsProviderorg.apache.pulsar.metrics.prometheus.bookkeeper.PrometheusMetricsProviderzookeeper.confmetricsProvider.classNameorg.apache.zookeeper.metrics.prometheus.PrometheusMetricsProviderorg.apache.pulsar.metrics.prometheus.zookeeper.PrometheusMetricsProvider
Users of the Apache Pulsar Helm chart prior to version 4.6.0 will need to set the bookie.configData.statsProviderClass key to org.apache.pulsar.metrics.prometheus.bookkeeper.PrometheusMetricsProvider:
bookie:
configData:
statsProviderClass: "org.apache.pulsar.metrics.prometheus.bookkeeper.PrometheusMetricsProvider"Library updates
- [fix][sec] Upgrade BouncyCastle to 1.84 (CVE-2026-5588, CVE-2026-0636) (#25569)
- [fix][sec] Upgrade to async-http-client 2.14.5 to address CVE-2026-40490 (#25546)
- [fix][sec] Upgrade to Netty 4.1.132.Final to address CVEs (#25399)
- [fix][sec] Bump google.golang.org/grpc from 1.60.0 to 1.79.3 in /pulsar-function-go (#25353)
- [fix][sec] Bump org.apache.zookeeper:zookeeper from 3.9.4 to 3.9.5 (#25303)
- [fix][sec] Upgrade aircompressor to 2.0.3 to resolve CVE-2025-67721 (#25256)
- [fix][sec] Upgrade Jackson version to 2.18.6 (#25264)
- [fix][sec] Upgrade Python protobuf version to 6.33.5 to address CVE-2026-0994 (#25250)
- [fix][sec][branch-4.0] Upgrade to Jetty 12.1.8 to address several CVEs (#25534)
- [improve][fn] Upgrade Pulsar Python client version to 3.10.0 (#25251)
- [fix][sec] Upgrade log4j to 2.25.4 to address CVE-2026-34477, CVE-2026-34478, CVE-2026-34480, CVE-2026-34481
- [improve] Upgrade RoaringBitmap to 1.6.9 version (#25253)
Broker
- [fix][broker] Change the schema incompatible log from ERROR to WARN level (#25483)
- [fix][broker] Fix backlog clearing for unloaded namespace bundles (#25272)
- [fix][broker] Lower log level of DrainingHashesTracker not-found entry to DEBUG (#25558)
- [fix][broker] Prevent timed-out producer creation from racing with retry (#25460)
- [fix][broker] pulsar admin stats internal with metadata command (#25557)
- [fix][broker] Unthrottle producers immediately when publish rate limiting is disabled (#25502)
- [fix][broker]Namespaces can be created with may empty replication_clusters policy (#25551)
- [fix][admin] Refactor namespace migration operation to async in rest api (#25478)
- [improve][broker] Close connection when close consumer write fails (#25520)
- [improve][broker] Use full bundle name for namespace bundle destination affinity in ModularLoadManagerImpl (#25518)
- [fix][broker] Fix concurrency bug in BucketDelayedDeliveryTracker (#25346)
- [fix][broker] Fix ExtensibleLoadManagerImpl stuck Assigning bundle state after broker restart (#25379)
- [fix][broker] fix flaky test in SystemTopicBasedTopicPoliciesServiceTest (#25098)
- [fix][broker] Fix IllegalArgumentException in BucketDelayedDeliveryTracker.addMessage (#25371)
- [fix][broker] Fix race condition in ServerCnx producer/consumer async callbacks (#25352)
- [fix][broker] Guard AsyncTokenBucket against long overflow (#25262)
- [fix][broker] Handle missing replicator during snapshot request processing (#25266)
- [fix][broker] Return failed future instead of throwing exception in async methods (#25289)
- [fix][broker] Support namespace unsubscribe when bundles are unloaded (#25276)
- [fix][broker]Producer with AUTO_PRODUCE schema failed to reconnect, which caused by schema incompatible (#25437)
- [fix][broker]system topic was created with different partitions acrossing clusters after enabled namespace-level replication (#25312)
- [fix][admin] Refactor namespace anti affinity group sync operations to async in rest api (#25086)
- [fix][offload] Close all resources in BlobStoreBackedReadHandleImplV2.closeAsync (#25296)
- [improve][broker] Change log level from warn to debug when cursor mark-deleted position ledger doesn't exist (#25200)
- [improve][broker] Optimize AsyncTokenBucket overflow solution further to reduce fallback to BigInteger (#25269)
- [improve][broker]Reduce the lock range of SimpleCache to enhance performance (#25293)
- [refactor][broker] Decouple delayed delivery trackers from dispatcher (#25384)
Client
- [fix][client] Fix thread-safety and refactor MessageCryptoBc key management (#25400)
- [fix][client] Fail messages immediately in ProducerImpl when in terminal state (#25317)
- [fix][client] Fix async APIs to return failed futures on validation errors (#25287)
- [fix][client] Reduce logging in OAuth auth to fix parsing of Pulsar cli command output (#25254)
- [improve][client][branch-4.0] Deduplicate in-progress lookup requests also for HttpLookupService (#25017)
Pulsar IO and Pulsar Functions
- [fix][io][kca] kafka headers silently dropped (#25325)
- [fix][io] Restore lz4 compression with Kafka IO connector after #25198 exclusion
Others
- [improve][common] Optimize TopicName.get() to reduce lock contention on cache lookup (#25367)
- [improve][broker] Improve the performance of TopicName constructor (#24463)
- [feat][bookkeeper] add certs refresh (#25370)
Tests & CI
- [fix][ci] Ensure discard_max_bytes is set to 0 only for existing block devices (#25510)
- [fix][test] Extend SameAuthParamsLookupAutoClusterFailoverTest phase timeouts (#25563)
- [fix][test] Fix flaky BrokerRegistryIntegrationTest port binding race (#25463)
- [fix][test] Fix flaky ExtensibleLoadManagerImpl client reconnection tests: PulsarClientException$AlreadyClosedException: Client already closed (#25509)
- [fix][test] Fix flaky ExtensibleLoadManagerTest.startBroker timeout (#25500)
- [fix][test] Fix flaky OffloadPrefixTest.testPositionOnEdgeOfLedger race with ledger rollover (#25561)
- [fix][test] Fix flaky ServerCnxTest.testCreateProducerTimeoutThenCreateSameNamedProducerShouldFail (#25497)
- [fix][test] Fix flaky testLoadBalancerServiceUnitTableViewSyncer (#25427)
- [fix][test] Flaky SameAuthParamsLook...
v3.0.17
2026-04-27
Library updates
- [fix][sec] Upgrade BouncyCastle to 1.84 (CVE-2026-5588, CVE-2026-0636) (#25569)
- [fix][sec] Upgrade to async-http-client 2.14.5 to address CVE-2026-40490 (#25546)
- [fix][sec] Upgrade to Netty 4.1.132.Final to address CVEs (#25399)
- [fix][sec] Bump org.apache.zookeeper:zookeeper from 3.9.4 to 3.9.5 (#25303)
- [fix][sec] Upgrade aircompressor to 2.0.3 to resolve CVE-2025-67721 (#25256)
- [fix][sec] Upgrade Jackson version to 2.18.6 (#25264)
- [fix][sec] Upgrade Python protobuf version to 6.33.5 to address CVE-2026-0994 (#25250)
- [improve][fn] Upgrade Pulsar Python client version to 3.10.0 (#25251)
- [fix][sec] Exclude org.lz4:lz4-java and standardize on at.yawk.lz4-java to remediate CVE-2025-12183 and CVE-2025-66566 (#25198)
- [fix][sec] Override kafka-clients in kinesis-kpl-shaded to remediate CVE-2024-31141 and CVE-2025-27817 (#24935)
- [fix][sec] Upgrade log4j to 2.25.4 to address CVE-2026-34477, CVE-2026-34478, CVE-2026-34480, CVE-2026-34481 (#25521)
- [fix][sec]Upgrade jackson to 2.17.2 (#23174)
- [improve] Upgrade Netty to 4.1.131.Final (#25232)
Broker
- [improve][broker] Close connection when close consumer write fails (#25520)
Client
- [fix][client] Fail messages immediately in ProducerImpl when in terminal state (#25317)
Pulsar IO and Pulsar Functions
- [fix][io] Restore lz4 compression with Kafka IO connector after #25198 exclusion
Others
- [improve][common] Optimize TopicName.get() to reduce lock contention on cache lookup (#25367)
- [improve][broker] Improve the performance of TopicName constructor (#24463)
Tests & CI
- [improve][ci] Cleanup tune-runner-vm and clean-disk actions (#25444)
- [cleanup][ci] Remove documentation label bot (#25469)
- [cleanup][ci] Remove ready-to-test label enforcement (#25470)
- [fix][ci] Fix .github/actions/ssh-access which is used for debugging Pulsar CI in forks (#25075)
- [fix][test] Stabilize FunctionAssignmentTailerTest.testErrorNotifier by synchronizing mock stubbing with CountDownLatch (#24875)
- [cleanup][build] Bumped version to 3.0.17-SNAPSHOT
- [fix][build][branch-3.0] Fix presto-distribution license file
- [fix][build][branch-3.0] Fix trino license
- [fix][build][branch-3.0] Fix trino license file
- [fix][ci][branch-3.0] Fix docker daemon configuration for branch-3.0
- [fix][ci][branch-3.0] Revert adding min-api-version: 1.24 to /etc/docker/daemon.json
- [improve][ci] Backport fix for ssh-access action
For the complete list, check the full changelog.