apache/pulsar · error · ManagedLedgerException

ManagedLedgerStorageClass ${storageClassName} not found for

Error message

ManagedLedgerStorageClass ${storageClassName} not found for topic ${topicName}

What it means

getManagedLedgerFactoryForTopic could not resolve the configured managed-ledger storage class name for the topic: no storage-class plugin matching that name is registered, so the ledger factory (and default BookKeeper factory) cannot be selected.

Source

Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java:1630

            });
         });

        return future;
    }

    public CompletableFuture<ManagedLedgerFactory> getManagedLedgerFactoryForTopic(TopicName topicName) {
        return getManagedLedgerConfig(topicName)
                .thenApply(config -> {
                    String storageClassName = config.getStorageClassName();
                    return getManagedLedgerFactoryForTopic(topicName, storageClassName);
                });
    }

    public ManagedLedgerFactory getManagedLedgerFactoryForTopic(TopicName topicName, String storageClassName) {
        Optional<ManagedLedgerStorageClass> managedLedgerStorageClass =
                managedLedgerStorage.getManagedLedgerStorageClass(storageClassName);
        if (!managedLedgerStorageClass.isPresent()) {
            throw new CompletionException(new ManagedLedgerException(
                    "ManagedLedgerStorageClass " + storageClassName + " not found for topic " + topicName));
        }
        return managedLedgerStorageClass
                .get()
                .getManagedLedgerFactory();
    }

    public void deleteTopicAuthenticationWithRetry(String topic, CompletableFuture<Void> future, int count) {
        if (count == 0) {
            log.error().attr("topic", topic).log("The number of retries has exhausted for topic");
            future.completeExceptionally(new MetadataStoreException("The number of retries has exhausted"));
            return;
        }
        // Check whether there are auth policies for the topic
        authorizationService.removePermissionsAsync(TopicName.get(topic))
                    .thenAccept(v -> {
                        log.info().attr("topic", topic).log("Successfully delete authentication policies for topic");
                        future.complete(null);

View on GitHub (pinned to 820761864e)

Solutions

  1. Fix the storage-class configuration so it names a registered class
  2. Ensure the extended storage provider is on the classpath and loaded
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java:1630 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of apache/pulsar@820761864e (2026-09-06). Data as JSON: /api/errors/71bbd344010957bf. Report an issue: GitHub.