Skip to content
CAI
Software that uses CAICheck a score

apache/pulsar

58.7

Adequate · 29 July 2026

450.5k

lines of production code

Java

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

How this codebase got here

Score

  • CAI 53 → 59 (+5.4)
  • Rubric changed (rubric-2026.08.17 → rubric-2026.08.18) — scores are not directly comparable.

Lenses

  • Code Health 75 → 74 (-1.2)
  • Architecture 98 → 97 (-0.7)
  • Maturity 75 → 72 (-2.2)
  • Readiness 73 → 73 (+0.0)
  • Security 28 → 41 (+12.6)

Resolved (422)

  • Boundary-crossing change coupling: CmdNamespaces.java ↔ PolicyName.java (pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java)
  • Boundary-crossing change coupling: ConsumerBuilder.java ↔ ConsumerConfigurationData.java (pulsar-client-api/src/main/java/org/apache/pulsar/client/api/ConsumerBuilder.java)
  • Boundary-crossing change coupling: PersistentSubscription.java ↔ SubscriptionStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
  • ConsumerImpl.hasMessageAvailableAsync (cyclomatic 18) (pulsar-client/src/main/java/org/apache/pulsar/client/impl/ConsumerImpl.java)
  • Critical IaC: AWS-0104 (deployment/terraform-ansible/aws/security.tf)
  • Dependency hygiene not measured — no supported dependency manifest was read
  • Duplicated block (10 lines × 2) (pulsar-broker-common/src/main/java/org/apache/pulsar/broker/web/plugin/servlet/AdditionalServletWithClassLoader.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/BrokersBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/extensions/ExtensibleLoadManagerImpl.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/GeoPersistentReplicator.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentDispatcherMultipleConsumers.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentDispatcherMultipleConsumers.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
  • …and 402 more

New (605)

  • Boundary-crossing change coupling: Namespaces.java ↔ PolicyName.java (pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/Namespaces.java)
  • Boundary-crossing change coupling: PersistentTopic.java ↔ TopicStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentTopic.java)
  • BucketDelayedDeliveryTracker.selectMergedBuckets (cognitive 16) (pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/bucket/BucketDelayedDeliveryTracker.java)
  • Build action pinned to a mutable branch
  • Change coupling clique: PersistentSubscription.java, AggregatedSubscriptionStats.java, SubscriptionStats.java (pulsar-broker/src/main/java/org/apache/pulsar/broker/service/persistent/PersistentSubscription.java)
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 10) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java)
  • Duplicated block (10 lines × 19) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
  • Duplicated block (10 lines × 2) (pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/PulsarAuthorizationProvider.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TransactionsBase.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java)
  • Duplicated block (10 lines × 2) (pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java)
  • …and 585 more

Changes since last survey

  • 37 commits — 6 feature/other, 31 fixes

By area

  • pulsar-broker/src — 17 commits
  • managed-ledger/src — 4 commits
  • pulsar-metadata/src — 4 commits
  • distribution/server — 3 commits
  • pulsar-common/src — 3 commits
  • docker/pulsar — 1 commit
  • pulsar-client/src — 1 commit
  • pulsar-function-go/examples — 1 commit
  • pulsar-function-go/go.mod — 1 commit
  • pulsar-functions/instance — 1 commit
  • pulsar-functions/utils — 1 commit

Notable commits

  • fix: [fix][broker] Check deliverAt before containsMessage in bucket addMessage (#26230)
  • fix: [fix][broker] Fix Key_Shared delivery stall when look-ahead triggers at the end of the topic (#26236)
  • fix: [fix][broker] Fix TableViewLoadDataStoreImpl close deadlock that stalls broker shutdown (#26243)
  • fix: [fix][broker] Fix getEstimatedSizeSinceMarkDeletePosition throw IllegalArgumentException (#26184)
  • fix: [fix][broker] Fix delayed message index data loss when trimming overlapping bucket snapshots (#26240)
  • fix: [fix][broker] Fix delayed-delivery bucket merge failures when delayedDeliveryMaxNumBuckets is 1-3 (#26242)
  • fix: [fix][broker] Fix incorrect listener URLs returned by ModularLoadManager lookups (#26245)
  • fix: [fix][broker] Fix silently dropped acknowledgement failures in PulsarMetadataEventSynchronizer (#26237)
  • fix: [fix][broker] Log exception in PulsarMetadataEventSynchronizer failure path (#26203)
  • fix: [fix][broker] Prevent completing replicated snapshot before marker publish (#26119)
  • fix: [fix][broker] Prevent stale read completions from stranding Failover subscriptions (#26174)
  • fix: [fix][broker] Prevent stale service unit callbacks from dropping active lookup and cleanup jobs (#26146)
  • fix: [fix][broker] Prevent stale topic unload cleanup from removing active cache entries (#26145)
  • fix: [fix][broker] Release entry on GetLastMessageId when parseMessageMetadata throws (#26089)
  • fix: [fix][broker] Trigger max read position callback for messages published during transaction buffer recovery (#26234)
  • fix: [fix][client] Avoid exception in ConsumerImpl hasMessageAvailable before first receive (#25857)
  • fix: [fix][client] Fix unAckedMessageTracker cleanup on multi-topics batch ack (#26001)
  • fix: [fix][client] Preserve null values in pulsar-admin schema output (#26196)
  • fix: [fix][fn] Forward source message properties in Python runtime (#26191)
  • fix: [fix][fn] Return inputSpecs consumerProperties in function GET info (#26217)
  • …and 17 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

apache/pulsar was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 29 July 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit a107d5146222913236dba991c8b65e9a1ed444d0 — the exact code this score is about.
  • Scored under rubric-2026.08.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer latest.