Apache Pulsar 5.0.1
2026-10-26
Preparing to upgrade to Pulsar 5.0?
- Blog: Apache Pulsar 5.0 LTS: Scalable Topics and Faster Existing Workloads
- Release highlights and upgrading
- Upgrading to Pulsar 5.0.x
- Java client dependency configuration for Pulsar 5.0.x
- Previous release notes 5.0 change logs
Approved PIPs
- [improve][pip] PIP-246: Improved PROTOBUF_NATIVE schema compatibility checks without using avro-protobuf (#26695)
Library updates
- [improve][broker] Upgrade bookkeeper to 4.18.2 (#27009)
- [fix][sec] Bump github.com/klauspost/compress from 1.18.0 to 1.18.7 in /pulsar-function-go (#27023)
- [improve][build] Upgrade LightProto to 0.9.3 (#26893)
- [improve][build] Upgrade Netty to 4.2.19.Final (#26831)
- [improve][build] Upgrade slog to 0.10.1 (#26835)
Broker
- [fix][broker] Answer a scalable consumer's subscribe in order with its assignment updates (#26857)
- [fix][broker] Apply dedup disable after recovery (#25982)
- [fix][broker] Authorize cluster listing requests (#26267)
- [fix][broker] Authorize scalable topic segments with the permissions of the parent topic (#26949)
- [fix][broker] Avoid false WARN log when replicator is already terminated (#25259)
- [fix][broker] Clean up orphan schema ledgers after write failures (#26902)
- [fix][broker] Close Conscrypt SSL engines when Jetty closes a TLS connection (#26812)
- [fix][broker] Delete scalable topics when deleting a namespace or a tenant (#26869)
- [fix][broker] Delete the ack records of open transactions when deleting a segment or a subscription (#26887)
- [fix][broker] Delete the transaction state of a segment when deleting it (#26882)
- [fix][broker] Don't continue loading a topic after its load has timed out (#20540)
- [fix][broker] Don't continue the REST topic listings that waited for a size estimate one after another on a metadata store thread (#27017)
- [fix][broker] Don't dispatch a replay read that was pending when all consumers of a Shared subscription disconnected (#27007)
- [fix][broker] Don't let an in-flight read dispatch a Key_Shared entry before an older one added to the replay queue (#26868)
- [fix][broker] Fail compacted reads when the compacted ledger is missing (#26631)
- [fix][broker] Fence non-persistent subscriptions before asynchronous … (#26991)
- [fix][broker] Fix dispatcher permit accounting race with recycled batch index acks (#26809)
- [fix][broker] Fix Exclusive/Failover dispatch rate limiting using counts from another dispatch (#26810)
- [fix][broker] Fix inflated rate stats of newly created consumers (#26928)
- [fix][broker] Fix managed-ledger scheduler thread stalls when estimating offline backlog (#26972)
- [fix][broker] Fix non-persistent subscribe cleanup during migration (#27003)
- [fix][broker] Fix partitioned topic auto deletion http request timeout (#24912)
- [fix][broker] Fix readCompacted skipping tombstones within compaction horizon (#26190)
- [fix][broker] Fix Shared and Key_Shared consumer stalls during FLOW and unblock races (#26797)
- [fix][broker] Fix spurious placement failures when IsolatedBookieEnsemblePlacementPolicy counts unavailable secondary bookies (#26701)
- [fix][broker] Fix the broker's WebSocket service ignoring configurationStoreConfigPath (#27015)
- [fix][broker] Fix topic listing memory limit enforcement (#26945)
- [fix][broker] Fix typo in broker.conf (#23295)
- [fix][broker] Fix web service close hang when the Jetty server fails to start (#26895)
- [fix][broker] Handle flow_or_qps bundle split requests in ELM (#25442)
- [fix][broker] Handle synchronous schema lookup failures in replication (#26108)
- [fix][broker] Hold a scalable-topic segment until every ancestor is drained (#26850)
- [fix][broker] Honor dynamic decreases of dispatcherMaxReadBatchSize (#26908)
- [fix][broker] Honor secondary tenant admin roles in HTTP admin requests (#26911)
- [fix][broker] Ignore replicated subscription updates for the compaction subscription (#27032)
- [fix][broker] Keep the scalable topic schema when deleting a regular topic with the same name (#26870)
- [fix][broker] Keep the scalable topic schema when deleting a segment topic (#26852)
- [fix][broker] Keep the scalable-topics watch's initial listing from undoing newer events (#26876)
- [fix][broker] Keep the topic-level permissions of a topic migrated to a scalable topic (#26953)
- [fix][broker] Log replicated subscription update ack failures (#26109)
- [fix][broker] Make the scalable topic controller follow its leader election (#26878)
- [fix][broker] Manage in-flight bucket work during clear (#26401)
- [fix][broker] Match namespace isolation policy brokers given as host:port (#26829)
- [fix][broker] Never share a segment between members of a checkpoint consumer group (#26836)
- [fix][broker] PIP-442: Fix unbounded executor queue growth and single-thread bottleneck in the topic list memory limiter (#26929)
- [fix][broker] Preserve non-durable cursor ownership during cleanup (#26925)
- [fix][broker] Preserve unacked backpressure for stale redelivery requests (#26910)
- [fix][broker] Prevent bundle split hangs on executor rejection (#26905)
- [fix][broker] Prevent changing shadow sources through topic properties (#26900)
- [fix][broker] Prevent duplicate messages when reconnect races with purge (#26907)
- [fix][broker] Prevent stale consumer removal from removing replacements (#26652)
- [fix][broker] Prevent stale messages from surviving compaction retries (#26664)
- [fix][broker] Producer still publishes messages to Broker after Topic was unloaded (#24793)
- [fix][broker] Prune sealed scalable-topic segments ancestors first (#26842)
- [fix][broker] Read again when a Key_Shared read's only recipients have blocked writes (#26963)
- [fix][broker] Recover bucket delayed delivery tracker asynchronously to avoid blocking dispatcher threads (#26105)
- [fix][broker] Reject replicated status for the compaction subscription (#27037)
- [fix][broker] Reject unsupported subscription-only backlog requests (#26906)
- [fix][broker] Remove the sticky key hashes of a sparse replay prefix when the mark-delete position moves (#26976)
- [fix][broker] Reset fixed delay detection when the in-memory delayed delivery tracker is cleared (#27021)
- [fix][broker] Resume snapshots after re-enabling deduplication (#26996)
- [fix][broker] Retry incompatible replication schemas without topic unload (#27026)
- [fix][broker] Return retryable error for timed-out end transactions (#26917)
- [fix][broker] Run the inactive topic GC when it is enabled by dynamic configuration (#26894)
- [fix][broker] Shared subscription stalls forever on a chunked message (#26396)
- [fix][broker] Stop checkpoint consumer groups from triggering rebucket rollovers (#26838)
- [fix][broker] Stop scalable topic controllers from re-electing while the topic is deleted (#26875)
- [fix][broker] Stop serving bundles that another broker took over while the metadata session is lost (#26866)
- [fix][broker] Stop the scalable-topics namespace watch from re-adding a deleted topic (#26853)
- [fix][broker] The configuration subscriptionExpirationTimeMinutes does not work if the topic was reloaded frequently (#25244)
- [fix][broker] Use the persistent:// topic of a migrated scalable topic's legacy segments (#26871)
- [fix][broker] Use the uncompressed payload when finding the last message position of a compacted batch (#26962)
- [fix][broker] Incorrect source side topic permission deletion when disabling replication (#26479)
- [fix][broker] The partitions of the topic was wrongly created even though this cluster was not allowed to access it (#25443)
- [fix][admin] Encode a space in a path component as %20, not as '+' (#26957)
- [fix][admin] Use ClientConfigurationData timeout params to set AsyncHttpConnector timeout params (#25040)
- [fix][ml] Complete the original future after ledger deletion retries (#26742)
- [fix][ml] Decode the shared cached message metadata before publishing it to other threads (#26824)
- [fix][ml] Don't drop a durable cursor reset when an ack is queued behind it (#26305)
- [fix][ml] Don't fail an add on a terminated managed ledger before the adds in flight ahead of it (#27018)
- [fix][ml] Enforce the add-entry handover batch byte limit (#26901)
- [fix][ml] Fix race in ManagedCursorImpl skip and getNthEntry that could skip unacknowledged entries (#20488)
- [fix][ml] Fix races in managed ledger initialization timeout handling (#23470)
- [fix][ml] Fix underReplicated always true in topic internal stats (#26834)
- [fix][ml] Materialize compressed ManagedCursorInfo before releasing the decompressed buffer (#27050)
- [fix][ml] Preserve individual batch ACKs when merging cumulative ACKs (#26998)
- [fix][ml] Serialize a cursor's reused position info under its monitor (#26944)
- [fix][ml] Wait for managed ledgers to close on factory shutdown, bounding each close (#26063)
- [fix][offload] Fix final ledger not being offloaded for terminated topics (#25955)
- [fix][offload] Fix NPE when reading from a closed offloaded read handle by keeping its ledger metadata (#26891)
- [fix][meta] Avoid duplicate sync listener registration in OxiaMetadataStore (#26856)
- [fix][meta] Don't leak closed leader elections and their metadata store listeners (#26879)
- [fix][meta] Don't lose SessionReestablished when a listener invalidates the new session (#26861)
- [fix][meta] Find the records written with a partition key in Oxia secondary-index scans (#26920)
- [fix][meta] Fix leader election close deleting a leader node owned by another session (#26828)
- [fix][meta] Fix lost ledger metadata updates during concurrent listener registration and removal (#26819)
- [fix][meta] Fix repeated metadata recovery failures after a ZooKeeper session expires (#26845)
- [fix][meta] Fix the upper bound of the Oxia secondary-index scans (#26890)
- [fix][meta] Fix underreplication locks left behind when closing by handling each deletion independently (#26674)
- [fix][meta] Preserve ownership during underreplication lock cleanup (#26794)
- [fix][meta] Recover ambiguous ledger metadata creation using cToken (#26896)
- [fix][meta] Return LedgerExistException for duplicate ledger creation (#26669)
- [fix][meta] Unregister metadata store listeners when their owners are closed (#24256)
- [improve][broker] Add a random value upto 5% to avoid rollover multiple cursor ledgers (#26542)
- [improve][broker] Add scalable topic segment-owner metrics (#26981)
- [improve][broker] Add scalable topic stats diagnostics (#26984)
- [improve][broker] Add scalable-topic controller and layout metrics (#26983)
- [improve][broker] Cache schema payloads to stop re-reading BookKeeper history on every explicit-version request (#26960)
- [improve][broker] Coalesce small messages dispatched to a consumer into one buffer (#26926)
- [improve][broker] Default numIOThreads to half the available processors, at least 8 (#26825)
- [improve][broker] Don't compute Key_Shared consumers' key hash ranges for stats without the consumers (#26965)
- [improve][broker] Enable Log4j2 async loggers again (#26979)
- [improve][broker] Hash Key_Shared sticky keys without allocation (#26968)
- [improve][broker] improve readability for the class TopicPolicyListenerWrapper (#26277)
- [improve][broker] Keep each ledger's pending acks in sorted blocks instead of an AVL tree (#26955)
- [improve][broker] Keep the Key_Shared consistent hashing ring in arrays (#26863)
- [improve][broker] Let authorization providers restrict topic auto-creation (#17411)
- [improve][broker] log incompatible schema failures at warn level, rather than logging at error level (#26804)
- [improve][broker] PIP-246: Improved PROTOBUF_NATIVE schema compatibility checks without using avro-protobuf (#19566)
- [improve][broker] Record the deduplication's persisted sequence IDs in place (#26822)
- [improve][broker] Reduce allocations on dispatch and managed-ledger read hot paths (#26956)
- [improve][broker] Reduce the lookups and allocations of an individual ack (#26948)
- [improve][broker] Skip the size cap estimate when there are no messages to replay (#26954)
- [improve][broker] Write async REST responses on the web service executor (#26946)
- [improve][ml] Bound the requeues of size-based cache eviction to one cycle through the removal queue (#26933)
- [improve][ml] Don't visit a ledger's other single-entry pending reads for a read of a single entry (#27005)
- [improve][ml] Optimization method getNumberOfEntries (#23576)
- [improve][ml] Read a cursor's close replay positions with one range read (#27006)
- [improve][ml] Read ahead the next range of a cursor's read into the entry cache (#27039)
- [improve][ml] Store the broker entry cache in pages of consecutive entry IDs (#26821)
- [fix][schema] Fix BookKeeper read handle leaks on schema read failures (#26818)
- [fix][schema] Fix Protobuf native descriptor deserialization (#26725)
- [improve][bk] Lower the bookies' read-ahead after a read cache miss from 1,000 to 100 entries (#27004)
- [improve][bk] Partition index and filter blocks in the entry location RocksDB config (#27008)
- [fix][meta] Fix stats in PulsarZooKeeperClient multi. (#25766)
- [improve][meta] Correct the MetadataStore.scanByIndex javadoc on the fallback filter and bounds (#26886)
- [improve][meta] Log metadata store deletes at DEBUG (#26978)
- [feat][broker] Add scalable topic consumer coordination metrics (#26982)
- [feat][broker] Add scalable-topic session and request metrics (#26980)
- [feat][monitor] PIP-320: Add OpenTelemetry metrics for the Function Worker (#26823)
Client
- [fix][client] Apply layout changes that arrive while a V5 producer or consumer is created (#26854)
- [fix][client] Apply topic changes that arrive while a V5 namespace consumer is created (#26840)
- [fix][client] Avoid duplicate reconcile retries and queue layout stalls in V5 consumers (#26874)
- [fix][client] chunked message uuid-queue never removes entries on successful processing (#26658)
- [fix][client] Complete a TableView refresh waiting for a message that could not be applied (#26986)
- [fix][client] Don't apply an older segment assignment after a newer one in V5 consumer groups (#26858)
- [fix][client] Don't retry a Pulsar Admin request after its request timeout has elapsed (#26881)
- [fix][client] Don't skip the first messages of new segments in a V5 checkpoint consumer started at latest (#26844)
- [fix][client] Fix message leaks and size and permit accounting races when clearing the consumer's incoming queue (#21767)
- [fix][client] Fix retry logic for BinaryProtoLookupService.getTopicsUnderNamespace method (#24974)
- [fix][client] Fix the embedded native image configuration and make its smoke test run (#26990)
- [fix][client] Fix ZeroQueueConsumer stuck on pending receiveAsync after reconnection (#26814)
- [fix][client] Include segments without received messages in V5 checkpoints (#26839)
- [fix][client] Keep per-key order of V5 async sends across scalable topic layout changes (#26820)
- [fix][client] Make chunking inert on non-persistent topics, including the message-size checks (#26550)
- [fix][client] Preserve per-key order across splits and merges in the V5 checkpoint consumer (#26837)
- [fix][client] Prevent chunk message ID leaks after seek (#26909)
- [fix][client] Release connections on partition metadata rejection (#26912)
- [fix][client] Release the output buffer when a compression codec fails to decode (#26889)
- [fix][client] Retry failed initial topic attaches and drop topics removed while attaching in V5 namespace consumers (#26848)
- [fix][client] Return flow-control permit when client seek by messageID (#26726)
- [fix][client] Schedule TableView tail-read retries instead of sleeping on the callback thread (#26672)
- [fix][client] Serialize chunked-message bookkeeping to fix use-after-free and count/queue drift (#26084)
- [fix][client] Skip zero-queue permits for completed async receives (#27001)
- [fix][client] Stop V5 namespace stream consumers from recreating deleted topics (#26851)
- [fix][client] Surface V5 client failures as the typed exception of their error category (#26950)
- [improve][client] Don't start a batch receive on an internal consumer without queued messages (#26966)
- [improve][client] Flush consumers' grouped acks with one task per event loop, only for consumers with new acks (#26947)
- [improve][client] Keep only its own topic in the configuration of a multi-topic consumer's internal consumer (#26923)
- [improve][client] Make Consumer.resume() eagerly top up the broker's permit window (#26919)
- [improve][doc] add missing .enableRetry(true) in DeadLetterPolicy examples (#26892)
Pulsar IO and Pulsar Functions
- [fix][fn] Fix Go function incorrectly using nanoseconds for timestamp (#25869)
- [fix][fn] Honour consumerCryptoFailureAction in the Python function runtime (#26490)
- [fix][fn] Only load crypto_key_reader for python function when cryptoKeyReaderConfig is provided (#24783)
- [fix][fn] Support deadLetterTopic and maxMessageRetries for Python functions (#26400)
- [improve][fn] Provide a way to set Pulsar client memory limit in Pulsar Function (#23959)
- [feat][fn] Expose the Prometheus metrics registry to Go functions via FunctionContext (#26458)
Others
- [fix][proxy] Fix connection and topic stats that stop updating after the initial update (#26961)
- [fix][proxy] Fix direct memory leaks from dropped reference-counted messages (#26811)
- [fix][proxy] Fix Proxy Protocol forwarding for UNKNOWN and IPv6 (#26999)
- [fix][misc] Fix Backoff mandatory-stop timer tracking (#25282)
- [improve][doc] Clarify AI-assisted contribution and review expectations (#26964)
- [improve][doc] Note in CODING.md that a delayedExecutor() task cannot be taken back (#26988)
- [improve][doc] Update the PIP listing and fill in mailing list thread links (#26883)
- [improve][doc] Warn about /tmp cleanup in narExtractionDirectory docs (#27011)
- [fix][metadata] Invalidate ledger metadata cache on version conflicts (#26940)
- [fix][managed-ledger] Honor batch-index cap in isCursorDataFullyPersistable (#26553)
- [fix][managed-ledger] Persist partial batch ACKs on flush (#26765)
Tests & CI
- [fix][build] Cap test compilation release at the server Java baseline (#26994)
- [fix][build] Include the java.compiler module in the Pulsar image JVM (#27035)
- [fix][ci] Fix flaky native image build caused by a GraalVM class initializer simulation race (#26989)
- [fix][test] Fix flaky NegativeAcksTest.testNegativeAcksWithBackoff (#24342)
- [fix][test] Fix flaky OffloadPrefixTest.terminateTriggersAutomaticOffloadForLastLedger (#27040)
- [fix][test] Fix flaky PulsarLedgerUnderreplicationManagerCloseTest.testCloseAggregatesFailuresAndRetriesOnlyUnreleasedLocks (#27013)
- [fix][test] Fix flaky ScalableTopicControllerAutoScaleTest.testRebucketCooldownSurvivesLeaderFailover (#26806)
- [fix][test] Fix flaky V5ProducerBackpressureTest.asyncSendsBlockTheCallerAtTheMemoryLimit (#26855)
- [fix][test] Fix order-dependent AdminApiTest.testUpdateDynamicLoadBalancerSheddingIntervalMinutes (#26872)
- [fix][test] Fix vacuous assertion in testInvalidBrokerLevelPolicyDisablesAutoScale (#26841)
- [fix][test] Give each geo-replicated cluster's bookies and ZooKeeper a hostname of their own (#26873)
- [fix][test] Make transaction buffer recovery placement deterministic (#26913)
- [fix][test] Run the Oxia-backed tests against oxia/oxia:nightly-beta (#26880)
- [fix][test] Split and fix flaky SASL authentication first-stage auth cache tests (#25949)
- [fix][test] Stub the cancellable listener in PulsarLedgerCreateRecoveryTest (#27025)
- [improve][ci] Publish Develocity Build Scans for the Docker images (#26832)
- [improve][test] Add a catch-up scenario: consumers joining a live stream later (#26826)
- [improve][test] Add a script that builds and installs hsdis for perfasm (#26995)
- [improve][test] Add deduplication contract coverage across broker restart (#27041)
- [improve][test] Add IoT scenarios for Failover, compaction, retries, delayed delivery, chunking, pattern subscriptions and TTL to the performance tests (#26993)
- [improve][test] Add IoT telemetry scenarios with partitioned topics to the performance tests (#27028)
- [improve][test] Add Key_Shared replay queue and stuck consumer scenarios to the performance tests (#26975)
- [improve][test] Add network conditions, network faults and geo-replication to the performance tests (#26859)
- [improve][test] Add offloading performance scenarios that read backlogs and seek by timestamp in tiered storage (#26884)
- [improve][test] Add Shared subscriptions and alert fan-out scenarios to the performance tests (#26922)
- [improve][test] Add TLS and JWT authentication to the performance testing framework (#27012)
- [improve][test] Compare two Pulsar images, or an image and the checkout, in the performance tests (#26847)
- [improve][test] Cover the cleanup of a scalable topic controller that fails to initialize (#26877)
- [improve][test] Create the IoT gateways' producers concurrently in a random order (#26827)
For the complete list, check the full changelog.