Skip to main content

Apache Pulsar 5.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 reference javax.* packages (for example javax.ws.rs or javax.servlet) must be updated to the corresponding jakarta.* 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 ./gradlew instead of mvn. Published artifacts are unchanged.
  • fastutil dependency removed (#25413).

Approved PIPs

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)
  • [improve][all] Upgraded Jackson to 2.21 LTS and fixed a few gradle assemble warnings (#25504)
  • [improve][misc] Upgrade Jackson to 2.21.3 (#25664)
  • [improve][build] Remove kotlin-stdlib override; upgrade okhttp3 5.3.2 and okio 3.17.0 (#25855)
  • [fix][sec] Bump org.asynchttpclient:async-http-client from 2.14.5 to 2.15.0 (#25818)
  • [improve][build] Upgrade async-http-client to 3.0.10 (#25023)
  • [improve][build] Upgrade Athenz to 1.12.42 (#25905)
  • [improve][build] Upgrade kubernetes client-java to 26.0.0 (#25856)
  • [improve][monitor] Upgrade OpenTelemetry libraries (#25662)
  • [improve][build] Upgrade OpenTelemetry to latest (java 1.62.0, instrumentation 2.28.1, semconv 1.41.1) (#25906)
  • [improve][build] Upgrade org.apache.kerby:kerb-simplekdc from 1.1.1 to 2.1.1 (#25785)
  • [improve][build] Upgrade SnakeYAML to 2.6 (#26023)
  • [improve][meta] Upgrade Oxia client to 0.8.0 (#25962)
  • [improve][misc] Upgrade Apache Commons libraries and Apache Http components (#25963)
  • [improve][misc] Upgrade Caffeine to 3.2.4 (#25663)
  • [improve][misc] Upgrade Guava to 33.6.0 (#25970)
  • [improve][misc] Upgrade jctools to 4.0.6 (jctools-core-jdk11) (#25671)
  • [improve][misc] Upgrade lz4-java to 1.11.0 (#25971)
  • [improve][offload] Upgrade Hadoop from 3.4.3 to 3.5.0 (#25402)
  • [improve][sec] Upgrade Auth0 java-jwt to 4.5.2 and jwks-rsa to 0.23.1 (#25672)

Broker

  • [fix][broker] Avoid per-message metadata parse for disabled debug log in handleSend (#25986)
  • [fix][broker] Avoid Project access in broker test setup (#25529)
  • [fix][broker] Change the schema incompatible log from ERROR to WARN level (#25483)
  • [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] Defer ack state updates until persistence succeeds (#25528)
  • [fix][broker] Fail fast for load balancer misconfigurations instead of falling back to SimpleLoadManagerImpl (#26031)
  • [fix][broker] Fix backlog clearing for unloaded namespace bundles (#25272)
  • [fix][broker] Fix compacted read could be stuck forever or message loss due to cursor mark delete (#25998)
  • [fix][broker] Fix compaction cursor reset may lose mark-delete properties (#25862)
  • [fix][broker] Fix delayed messages stalling with isDelayedDeliveryDeliverAtTimeStrict=true (#26012)
  • [fix][broker] Fix forced topic/namespace deletion hanging or failing when compaction is in progress (#26016)
  • [fix][broker] Fix ManagedLedgerImpl.advanceCursorsIfNecessary() method may lose non-durable cursor properties in race condition (#25796)
  • [fix][broker] Fix metadata setup validation message (#25656)
  • [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] Fix tableview divergence in ServiceUnitStateTableViewSyncer causing flaky tests (#25946)
  • [fix][broker] Lower log level of DrainingHashesTracker not-found entry to DEBUG (#25558)
  • [fix][broker] Merge broker offload extra configurations (#25736)
  • [fix][broker] Move pending acks cleanup to selected mark-delete callbacks (#25592)
  • [fix][broker] PIP-460: Authorize scalable topic binary commands (#25635)
  • [fix][broker] PIP-468: Fix listener leak in DagWatchSession (#25650)
  • [fix][broker] PIP-468: skip deleted segments in checkpoint consumer (#25719)
  • [fix][broker] PIP-468: StreamConsumer / CheckpointConsumer DAG-replay with parent-drain ordering (#25642)
  • [fix][broker] Prevent dedup recovery race from allowing duplicate messages (#25953)
  • [fix][broker] Prevent subscribe rate limit from stalling compaction and blocking forced deletion (#26015)
  • [fix][broker] Prevent timed-out producer creation from racing with retry (#25460)
  • [fix][broker] pulsar admin stats internal with metadata command (#25557)
  • [fix][broker] Race condition causes perpetual backlog on internal topics (#25572)
  • [fix][broker] Replace Java serialization with JSON in package metadata (#25570)
  • [fix][broker] Revert "[improve][broker] Enhance advertised address resolution with fallback to localhost (#25238)" (#25523)
  • [fix][broker] Skip backlog-quota eviction on fenced/closing topics (#25684)
  • [fix][broker] Unthrottle producers immediately when publish rate limiting is disabled (#25502)
  • [fix][broker] URL-encode sub-name in Txn pending-ack topic (#25727)
  • [fix][broker] Use effective offload policies for extra configs (#25781)
  • [fix][broker] Wait for orphan schema ledger cleanup before retry (#25579)
  • [fix][broker] Replication stats is empty when the cluster is the target cluster of a one-way replication (#25583)
  • [fix][broker] Namespaces can be created with may empty replication_clusters policy (#25551)
  • [fix][broker] Producer with AUTO_PRODUCE schema failed to reconnect, which caused by schema incompatible (#25437)
  • [fix][broker] Replication is stuck because failed to read entries (#25625)
  • [fix][broker] Fix ShadowReplicator source entry buffer leak (#25732)
  • [fix][admin] Refactor namespace migration operation to async in rest api (#25478)
  • [fix][ml] Fix concurrent cursor properties update race (#25434)
  • [fix][ml] Fix eviction trigger race that cleared the in-progress marker (#25988)
  • [fix][ml] Reset messageMetadataInitialized when recycling RangeCacheEntryWrapper (#25987)
  • [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)
  • [fix][meta] Keep the leader value in the election cycle and make leader reads authoritative (#26000)
  • [fix][meta] PIP-454: fix migration retry after failure, preparation timeout and mid-migration store startup (#25989)
  • [fix][meta] PIP-454: fix stale migration status reported after completion (#25993)
  • [improve][broker] Add authn/authz to Scalable Topics Admin API (PIP-460) (#25618)
  • [improve][broker] Close connection when close consumer write fails (#25520)
  • [improve][broker] Default managedLedgerMaxReadsInFlightSizeInMB to 15% of direct memory (#25979)
  • [improve][broker] Improve default limits for acknowledgment state persistence and Key_Shared look-ahead (#25992)
  • [improve][broker] Improve the performance of TopicName constructor (#24463)
  • [improve][broker] Log only non-default config values on broker startup (#25545)
  • [improve][broker] optimize namespaceBundle validation to fix single-thread 100% CPU during unloading entire namespaces. (#25626)
  • [improve][broker] Optimize TripleLongPriorityQueue heap operations (#26010)
  • [improve][broker] PIP-473 P3.5: durable per-segment visibility state (#25821)
  • [improve][broker] PIP-473 P5.1: metadata-driven transaction coordinator (NEW_TXN / END_TXN) (#25863)
  • [improve][broker] PIP-473 P5.2: scalable-topics TC timeout + GC sweeps (#25884)
  • [improve][broker] PIP-473 P5.3: metadata-store TC leader election + assignment watch (#25929)
  • [improve][broker] PIP-473 P5.4: v4/v5 transaction coordinator coexistence + enable v5 by default (#25945)
  • [improve][broker] PIP-473: group all txn metadata paths under /txn/ (#25792)
  • [improve][broker] PIP-473: MetadataPendingAckStore for segment subscriptions (#25772)
  • [improve][broker] PIP-473: MetadataTransactionBuffer for segment topics (#25768)
  • [improve][broker] PIP-473: transaction metadata data layer (#25754)
  • [improve][broker] Prevent stale replicator pending reads after termination (#25767)
  • [improve][broker] Simplify listener config and support proxyless Admin API (complete PIP-61/PIP-95) (#25851)
  • [improve][broker] Trim orphaned bucket snapshots when ledgers are deleted (#25984)
  • [improve][broker] update broker error message to include tenant name (#25503)
  • [improve][broker] Use full bundle name for namespace bundle destination affinity in ModularLoadManagerImpl (#25518)
  • [improve][broker] Part-3 of PIP-433: always allow replicator to register a new compatible schema (#25461)
  • [improve][broker] Reduce the lock range of SimpleCache to enhance performance (#25293)
  • [improve][admin] Apply all configurations instead of partial ones (#25245)
  • [fix][txn] PIP-473: prune terminal transactions from the metadata buffer cache (#25960)
  • [fix][txn] PIP-473: v5 transaction timeout applied 1000x too long (#25959)
  • [improve][ml] Propagate slog logger context to BookKeeper ledger create/open (#25995)
  • [improve][ml] Warn and emit metric when cursor ack state exceeds persist limits (#25548)
  • [improve][offload] Coalesce automatic offload triggers to reduce retry loops and ledger scans (#25793)
  • [improve][txn] PIP-473: GC aborted-transaction records on ML trim and segment drop (#25975)
  • [cleanup][broker] Clean up scalable topic type references in ServerCnx (#25920)
  • [refactor][broker] Decouple delayed delivery trackers from dispatcher (#25384)
  • [feat][broker] PIP-466: Add supports_scalable_topics feature flag and broker config (#25616)
  • [feat][broker] PIP-468: Filter scalable topics by property via secondary index (#25632)
  • [feat][broker] PIP-468: scalable-topic seek + clear-backlog admin API (#25696)
  • [feat][broker] PIP-469: Legacy-aware topic policies backend routing and metadata-store topic policies (#25707)
  • [feat][broker] PIP-475: regular-to-scalable topic migration command (#25875)
  • [feat][broker] PIP-475: synthetic-layout lookup for regular topics (#25822)
  • [feat][broker] Support broker configuration for BookKeeper client TCP keep-alive options (#25580)
  • [test][broker] PIP-475: end-to-end migration tests + transition fixes (#25878)
  • [feat][monitor] Add custom topic metric labels to OpenTelemetry metrics attributes (#25306)

Client

  • [feat] PIP-466: Add V5 client API for scalable topics (#25489)
  • [feat][client] Embed GraalVM native image config (#25883)
  • [feat][client] PIP-475: V5 SDK consumes synthetic layouts for regular topics (#25850)
  • [feat][client] PIP-468: V5 producer/consumer knob coverage + related client fixes (#25588)
  • [fix][client] Apply Avro logical type conversions when decoding schema without classloader (#25759)
  • [fix][client] Avoid closing reused ServiceUrlProvider in another PulsarClientImpl instance (#25947)
  • [fix][client] Clean up unacked messages when unsubscribing a topic with ack timeout backoff (#25916)
  • [fix][client] Fix exclusive V5 scalable topic producer initial segment claim race condition (#25778)
  • [fix][client] Fix failed to close consumer because of the error: param memorySize is a negative value (#25805)
  • [fix][client] Fix idle connection release ignoring V5 watch sessions (#25697)
  • [fix][client] Fix OpenTelemetryProducerInterceptor not executing due to eligible check (#25585)
  • [fix][client] Fix thread-safety and refactor MessageCryptoBc key management (#25400)
  • [fix][client] Inject trace context into message properties for producer-consumer span correlation (#25749)
  • [fix][client] Make ClientBuilder serializable (#25730)
  • [fix][client] Match logical topic when removing unacked messages (#25921)
  • [fix][client] PIP-468: V5 CheckpointConsumer consumer-group support (#25622)
  • [fix][client] PIP-468: V5 client validates serviceUrl scheme (#25720)
  • [fix][client] PIP-468: Wire V5 StreamConsumer to broker SubscriptionCoordinator (#25612)
  • [fix][client] PIP-475: make async producer survive regular-to-scalable migration (#25882)
  • [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] Add SOCKS5 proxy support for PulsarAdmin and for PulsarClient HTTP lookups (#25575)
  • [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)
  • [improve][client] PIP-234: Support sharing the memory limit controller across multiple isolated Pulsar client instances (#25477)
  • [improve][client] PIP-468: Make Backoff jitter configurable (#25669)
  • [improve][client] PIP-468: Rename V5 ackTimeout to processingTimeout(ProcessingTimeoutPolicy) (#25649)
  • [cleanup][client] Remove unused RetryUtil class (#25934)
  • [fix] Client-v5: Retry producer send on AlreadyClosed across segment seal (#25610)

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] Log function package download completion and process PID (#25568)
  • [improve][fn] make built-in connector reload incremental (#25773)
  • [improve][fn] make built-in functions reload incremental (#25868)
  • [improve][fn] Migrate pulsar-functions-proto from protobuf to LightProto (#25407)
  • [refactor][fn] Use Map instead of TreeMap for connector/function API types (#25790)
  • [feat][fn] Add message decoding failure handling (#25972)
  • [fix][sec] Prevent path traversal in PackageName toRestPath (#25628)

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)
  • [fix][doc] Correct default idle timeout in ClientBuilder and PulsarAdminBuilder docs (#25771)
  • [fix][doc] Correct loadConf example key in PulsarAdminBuilder (#25556)
  • [improve][proxy] Support scalable topics through the proxy (#25879)
  • [fix][misc] Throw TypeConversionException when ByteUnitToIntegerConverter's long->int conversion overflows (#25901)
  • [fix][misc] Update docker image guide and version scripts (#25930)
  • [improve][doc] Add coding guideline for fully qualified class names (#25928)
  • [improve][cli] Add client side looping in "pulsar-admin topics analyze-backlog" cli to avoid potential HTTP call timeout (#25126)
  • [improve][cli] Migrate pulsar-client to the V5 client API (#25917)
  • [improve][cli] Support 'auto_consume' schema type in pulsar-client consume/read (#25927)
  • [improve][misc] Add AGENTS.md and split build/contributor/coding/architecture/security docs (#25871)
  • [improve][misc] Add deepwiki badge in README to enable automated index update (#25544)
  • [improve][misc] Make Protobuf v4 the default (#25969)
  • [improve][misc] Migrate Swagger annotations to OpenAPI 3 (Swagger Core v3, jakarta) (#25937)
  • [improve][misc] Migrate Yahoo DataSketches to Apache DataSketches (#25965)
  • [improve][misc] PIP-472: Migrate from javax.* to jakarta.* APIs (#25912)
  • [cleanup][misc] Remove obsolete LoadSimulationClient and LoadSimulationController (#25926)
  • [improve][common] Optimize TopicName.get() to reduce lock contention on cache lookup (#25367)
  • [improve][functions] Allow customizing Kubernetes service domain suffix in Function Worker (#25872)
  • [improve][metadata] Add Option-set API to MetadataStore (#25710)
  • [improve][metadata] Add streaming scanChildren to MetadataStore (#25701)
  • [improve][metadata] Replace findByIndex with streaming scanByIndex (point + range) (#25731)
  • [cleanup] PIP-462: Remove Etcd metadata store backend (#25380)
  • [cleanup] PIP-463: Migrate build system from Maven to Gradle (#25398)
  • [cleanup] PIP-468: Remove deprecated registerConsumer overloads (#25712)
  • [cleanup] Remove fastutil dependency (#25413)
  • [feat] PIP-460: Add topic:// and segment:// domain support to pulsar-common (#25456)
  • [feat] PIP-468: Add scalable topic protocol commands and connection handling (#25564)
  • [feat] PIP-468: Add scalable topics and segments admin APIs with CLI (#25565)
  • [feat] PIP-468: Add ScalableTopicController and broker infrastructure (#25559)
  • [feat] PIP-468: Auto-reconnect scalable consumer session on disconnect (#25623)
  • [feat] PIP-468: Basic end-to-end tests for V5 Queue/Stream/Checkpoint consumers + async APIs (#25587)
  • [feat] PIP-468: DagWatchClient auto-reconnects on broker disconnect (#25687)
  • [feat] PIP-468: Filter scalable topic listing by multiple properties (AND) (#25639)
  • [feat] PIP-468: Implement V5 client with scalable topic producer and consumer types (#25573)
  • [feat] PIP-468: Multi-broker shared cluster + V5 cross-broker tests (#25633)
  • [feat] PIP-468: Multi-topic QueueConsumer / StreamConsumer (#25651)
  • [feat] PIP-468: Namespace scalable-topics watcher (protocol + broker + V5 client) (#25648)
  • [feat] PIP-468: record wall-clock created/sealed timestamps on segments (#25658)
  • [feat] PIP-468: sealed-segment retention GC for scalable topics (#25668)
  • [feat] PIP-468: segment-aware admin endpoints for cursor lifecycle (#25717)
  • [feat] PIP-468: Test schema evolution coverage on scalable topics (#25637)
  • [feat] PIP-468: V5 Authentication adapter bridges authData() (#25685)
  • [feat] PIP-468: V5 client end-to-end smoke test + segment-bypass for internal subscribe/read (#25586)
  • [feat] PIP-468: V5 dead letter queue with scalable DLQ topic (#25652)
  • [feat] PIP-468: V5 end-to-end encryption API redesign (#25682)
  • [feat] PIP-468: V5 flow-control knob test coverage (#25689)
  • [feat] PIP-468: V5 StreamConsumer disconnect / reconnect / past-grace reassignment (#25619)
  • [feat] PIP-468: Wire transactions into V5 client (#25631)
  • [fix] Fix flaky BrokerDispatchRateLimiterTest.testBrokerDispatchThrottledMetrics (#25567)
  • [fix] Fix ManagedLedgerImpl's pendingAddEntries leak. (#25240)
  • [fix] Fix typo 'seperated' in broker comments (#25524)
  • [improve] Add context map to log4j2 pattern layouts (#25491)
  • [improve] Add Option.SequenceKeysDeltas + subscribeSequence (#25724)
  • [improve] Add PULSAR_LOG_FORMAT env var for easy JSON logging (#25515)
  • [improve] Emit flat OpenTelemetry JSON logs instead of ECS (#25542)
  • [improve] PIP-467: Convert Jetty request logs to structured slog events (#25543)
  • [improve] PIP-467: Convert managed-ledger module logging from SLF4J to slog (#25490)
  • [improve] PIP-467: Convert pulsar-broker module logging from SLF4J to slog (#25535)
  • [improve] PIP-467: Convert pulsar-client module logging from SLF4J to slog (#25507)
  • [improve] PIP-467: Convert pulsar-common module logging from SLF4J to slog (#25506)
  • [improve] PIP-467: Convert pulsar-functions module logging from SLF4J to slog (#25508)
  • [improve] PIP-467: Convert pulsar-metadata module logging from SLF4J to slog (#25505)
  • [improve] PIP-467: Convert remaining modules logging from SLF4J to slog (#25511)
  • [improve] PIP-467: Remove now-dead slf4j.api dependency from modules converted to slog (#25541)
  • [improve] Wire Set<Option> through backend hooks + Oxia PartitionKey (#25723)
  • [test][client-v5] V5 layout-dynamics coverage + consumer fixes (DAG replay, late-ack) (#25611)

Tests & CI

  • [improve][ci] Run filesystem offload tests also on Java 25 since Hadoop has been upgraded to 3.5.0 (#25482)
  • [improve][ci] Upgrade official GitHub Actions to latest major versions (#25412)
  • [fix][ci] Fix CodeQL workflow and upgrade codeql-action to v4 (#25481)
  • [improve][test] Upgrade Mockito to 5.23.0 (#25667)
  • [improve][test] Upgrade TestNG to 7.12.0 (#25666)
  • [improve][build] Upgrade Gradle to 9.5.1 (#25786)
  • [improve][build] Upgrade Checkstyle from 10.14.2 to 13.3.0 (#25440)
  • [improve][build] Upgrade lightproto gradle plugin to 0.7.2 (#25751)
  • [improve][build] Upgrade lightproto gradle plugin to 0.7.3 (#25780)
  • [fix][build] Fix build caching for shadow jars and refactor to use convention plugins (#25409)
  • [fix][build] Fix generateOpenApiSpecs task and include missing admin v2 resources in the spec (#26003)
  • [fix][build] Fix stage-release.sh for the Gradle build (#26017)
  • [fix][build] Fix the shaded client artifacts: jar contents and Maven publication (#26034)
  • [fix][build] Remove jetty-server from avroTools Gradle configuration used in build (#25784)
  • [fix][ci] Ensure discard_max_bytes is set to 0 only for existing block devices (#25510)
  • [fix][ci] Fix CodeQL job which is currently broken (#25966)
  • [fix][ci] Prevent Pull Request Labeler from canceling runs across PRs (#25968)
  • [fix][ci] Use CodeQL build-mode: none to avoid intermittent build-cache failures (#25932)
  • [fix][test] Absorb Backoff jitter in PulsarServiceNameResolverTest.testRemoveUnavailableHost (#25714)
  • [fix][test] Add timeout to initial receives in ResendRequestTest.testSharedSingleAckedPartitionedTopic (#25828)
  • [fix][test] Deflake TopicPoliciesTest.setupTestTopic by retrying forced namespace deletion (#25974)
  • [fix][test] Drop lookup probe in ExtensibleLoadManagerTest.startBroker to avoid channel-startup race (#25715)
  • [fix][test] Extend SameAuthParamsLookupAutoClusterFailoverTest phase timeouts (#25563)
  • [fix][test] Fix flaky AdminApiOffloadTest.testOffload status race (#25674)
  • [fix][test] Fix flaky AdminApiTest.partitionedTopicsCursorReset (#25847)
  • [fix][test] Fix flaky AdminApiTest.persistentTopicsCursorResetAfterReset timeout (#25692)
  • [fix][test] Fix flaky BacklogQuotaManagerTest.createNamespaces (HTTP 409 cascade) (#25680)
  • [fix][test] Fix flaky BookieClientsStatsGeneratorTest.testBookieClientStatsGenerator (#25646)
  • [fix][test] Fix flaky BrokerRegistryIntegrationTest port binding race (#25463)
  • [fix][test] Fix flaky compaction disable test by controlling delete concurrency (#25794)
  • [fix][test] Fix flaky ConsumerBatchReceiveTest.testBatchReceiveAndRedeliveryNonPartitionedTopic (#25468)
  • [fix][test] Fix flaky ExtensibleLoadManagerImpl client reconnection tests: PulsarClientException$AlreadyClosedException: Client already closed (#25509)
  • [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 ExtensibleLoadManagerImplTest.testLoadBalancerServiceUnitTableViewSyncer (#25596)
  • [fix][test] Fix flaky ExtensibleLoadManagerTest.startBroker timeout (#25500)
  • [fix][test] Fix flaky FunctionRuntimeManagerTest.testExternallyManagedRuntimeUpdate (#25465)
  • [fix][test] Fix flaky InterceptorsTest and ProduceWithMessageIdTest (#25499)
  • [fix][test] Fix flaky IsolatedBookieEnsemblePlacementPolicyTest.testBookieInfoChange (#25473)
  • [fix][test] Fix flaky IsolatedBookieEnsemblePlacementPolicyTest.testMetadataStoreCases (#25474)
  • [fix][test] Fix flaky LeaderElectionServiceTest and PersistentDispatcherFailoverConsumerTest (#25498)
  • [fix][test] Fix flaky ManagedLedgerTest.testCursorPointsToDeletedLedgerAfterTrim (#25476)
  • [fix][test] Fix flaky ManagedLedgerTest.testInvalidateReadHandleWhenConsumed (#25595)
  • [fix][test] Fix flaky ManagedLedgerTest.testNoRetention (#25467)
  • [fix][test] Fix flaky ManagedLedgerTest.testNoRetention and testInvalidateReadHandleWhenDeleteLedger (#25495)
  • [fix][test] Fix flaky MembershipManagerTest.testCheckFailuresSomeFailures (#25466)
  • [fix][test] Fix flaky MessageChunkingSharedTest.testMultiConsumers timeout (#25475)
  • [fix][test] Fix flaky ModularLoadManagerImplTest and IsolatedBookieEnsemblePlacementPolicyTest (#25496)
  • [fix][test] Fix flaky OffloadPrefixTest.testPositionOnEdgeOfLedger race with ledger rollover (#25561)
  • [fix][test] Fix flaky OneWayReplicatorDeduplicationTest.testDeduplication (#25679)
  • [fix][test] Fix flaky PersistentStickyKeyDispatcherMultipleConsumersTest.testSkipRedeliverTemporally (#25843)
  • [fix][test] Fix flaky ProducerCleanupTest timer cleanup (#25864)
  • [fix][test] Fix flaky PulsarFunctionsJavaThreadTest by adding retry to getFunctionStats (#25472)
  • [fix][test] Fix flaky PulsarFunctionsJavaThreadTest.testTumblingCountWindowTest (#25590)
  • [fix][test] Fix flaky PulsarFunctionTlsTest.testFunctionsCreation() test (#25889)
  • [fix][test] Fix flaky RateLimiterTest.testDispatchRate (#25846)
  • [fix][test] Fix flaky ReplicatorTest.testReplicatorClearBacklog NPE on inFlightTask (#25691)
  • [fix][test] Fix flaky ReplicatorTest.testResumptionAfterBacklogRelaxed (#25493)
  • [fix][test] Fix flaky ResendRequestTest.testSharedSingleAckedPartitionedTopic() test (#25852)
  • [fix][test] Fix flaky SameAuthParamsLookupAutoClusterFailoverTest.testAutoClusterFailover() test (#25892)
  • [fix][test] Fix flaky SaslAuthenticateTest.testMaxInflightContext() test (#25948)
  • [fix][test] Fix flaky SchemaServiceTest.testSchemaRegistryMetrics (#25645)
  • [fix][test] Fix flaky ServerCnxTest.testCreateProducerTimeoutThenCreateSameNamedProducerShouldFail (#25497)
  • [fix][test] Fix flaky test ReplicatorTest.testResumptionAfterBacklogRelaxed (#25950)
  • [fix][test] Fix flaky testClear in BucketDelayedDeliveryTrackerTest (#25424)
  • [fix][test] Fix flaky testGetExcludedBookiesWithIsolationGroups (#25640)
  • [fix][test] Fix flaky testLoadBalancerServiceUnitTableViewSyncer (#25427)
  • [fix][test] Fix flaky testMsgDropStat in NonPersistentTopicTest (#25426)
  • [fix][test] Fix flaky testRetentionSize in ManagedLedgerTest (#25423)
  • [fix][test] Fix flaky TopicFromMessageTest by using unique topic names (#25494)
  • [fix][test] Fix MultiBrokerLeaderElectionExpirationTest Mockito spy usage (#25425)
  • [fix][test] Fix thread resource leaks in tests and PrometheusMetricsProvider (#25487)
  • [fix][test] Flaky SameAuthParamsLookupAutoClusterFailoverTest (#25566)
  • [fix][test] Make LocalBookkeeperEnsemble robust to port race and partial-setup cleanup (#25690)
  • [fix][test] Make NamespacesTest.cleanupAfterMethod tolerant of transient infra failures (#25641)
  • [fix][test] Make SameAuthParamsLookupAutoClusterFailoverTest less timing-sensitive (#25675)
  • [fix][test] PIP-473: deflake TransactionCoordinatorV5Test.sweepTimeouts_abortsExpiredOpenTxnAndFansOut (#25961)
  • [fix][test] Recreate EventLoop in PublishRateLimiterTest setup (#25560)
  • [fix][test] Reduce admin client churn in ExtensibleLoadManagerTest.startBroker (#25676)
  • [fix][test] Reduce flakiness in testLoadBalancerServiceUnitTableViewSyncer (#25638)
  • [fix][test] Relax BrokerRegistryIntegrationTest broker-close threshold (#25562)
  • [fix][test] Relax V5ConsumerPriorityLevelTest.testLowerPriorityConsumerReceivesOverflow (#25716)
  • [fix][test] Stabilize delayed auditor lost bookie tests in AuditorLedgerCheckerTest (#25957)
  • [fix][test] Stabilize flaky sweepTimeouts_abortsExpiredOpenTxnAndFansOut() test (#25952)
  • [fix][test] Stabilize testSecondaryIsolationGroupsBookiesNegative() test (#25900)
  • [fix][test] Stabilize WebService rate limiting test (#25866)
  • [improve][build] Add Maven publishing conventions for ASF release (#25457)
  • [improve][build] Adopt Gradle best practices: convention plugins, build-logic composite build, and unconditional module inclusion (#25435)
  • [improve][build] Disable test retry when running tests in IntelliJ (#25814)
  • [improve][build] Enable -Xlint:deprecation and -Xlint:unchecked and fix all warnings (#25446)
  • [improve][build] Enhance Docker build task to support image pushing (#25459)
  • [improve][build] Fix and enable configure-on-demand for Gradle builds (#25441)
  • [improve][build] Fix compile errors from rawtypes/unchecked changes (#25418)
  • [improve][build] Fix compile warnings in production code (#25414)
  • [improve][build] Fix dangling-doc-comments, fallthrough, and section comment warnings (#25416)
  • [improve][build] Fix final rawtypes, unchecked, and redundant cast warnings (#25420)
  • [improve][build] Fix Lombok, varargs, and other compile warnings (#25415)
  • [improve][build] Fix publishing of public libraries with correct POM and Gradle module metadata (#26020)
  • [improve][build] Fix rawtypes and unchecked compile warnings (#25417)
  • [improve][build] Fix remaining rawtypes, unchecked, and deprecation warnings (#25419)
  • [improve][build] Generate PulsarVersion build info as resource (#25841)
  • [improve][build] Keep release build info stable with a snapshot file (#26014)
  • [improve][build] PIP-465: Remove IO connectors from core pulsar repo (#25408)
  • [improve][build] Replace check-binary-license.sh with a Gradle task (#25673)
  • [improve][build] Show test failure exceptions (#25411)
  • [improve][build] Support building and testing with Java 25 (#25453)
  • [improve][build] Suppress deprecation warnings across all modules (#25421)
  • [improve][build] Suppress remaining unchecked warnings in source code (#25422)
  • [improve][build] Use public Gradle build scans for PRs (#25439)
  • [improve][ci] Cleanup tune-runner-vm and clean-disk actions (#25444)
  • [improve][ci] Document avoiding reflection in tests in Copilot review instructions (#25636)
  • [improve][ci] Include XML test reports in CI artifacts and generate HTML index (#25484)
  • [improve][ci] Replace trivy-action with sandboxed-trivy-action (#25480)
  • [improve][test] Fix cast, static, removal, and varargs compile warnings in test code (#25428)
  • [improve][test] Fix deprecation and unchecked compilation warnings in test code (#25447)
  • [improve][test] Fix rawtypes compile warnings in test code (#25430)
  • [improve][test] Fix try-with-resources compile warnings in test code (#25429)
  • [improve][test] Fix unchecked compile warnings in test code (#25431)
  • [improve][test] Migrate pulsar-perf to the V5 client API (#25887)
  • [improve][test] PIP-467: Convert pulsar-broker test files logging from SLF4J to slog (#25536)
  • [improve][test] PIP-473: extensive v5 transaction tests on scalable topics (#25958)
  • [improve][test] pulsar-perf consume: switch between V5 Queue and Stream consumer (#25981)
  • [improve][test] Set diskUsageThreshold to 0.999 for tests to effectively disable the check (#25677)
  • [improve][test] Speed up HealthCheckTest by sharing cluster across test methods (#25448)
  • [improve][test] Suppress deprecation compile warnings in test code (#25432)
  • [improve][test]Add test: test/testTopicPartitionCannotBeCreatedAfterTopicDeleted (#26038)
  • [cleanup][build] Remove leftover Maven files and references (#25406)
  • [cleanup][build] Remove unused structured-event-log module (#25492)
  • [cleanup][build] Update bin/ scripts from Maven to Gradle for dev classpath (#25404)
  • [cleanup][build] Update documentation and examples from Maven to Gradle (#25403)
  • [cleanup][ci] Remove documentation label bot (#25469)
  • [cleanup][ci] Remove ready-to-test label enforcement (#25470)
  • [cleanup][test] Remove PortManager and use kernel-assigned ports everywhere (#25694)
  • [feat][ci] Add Gradle dependency submission workflow for Dependabot alerts (#25748)

For the complete list, check the full changelog since 4.2.0 release branch was forked.