{"record":{"id":"8bb74a843fef9897","repo":"apache/pulsar","slug":"timeout-during-managed-ledger-delete-operation","errorCode":null,"errorMessage":"Timeout during managed ledger delete operation","messagePattern":"Timeout during managed ledger delete operation","errorType":"exception","errorClass":"ManagedLedgerException","httpStatus":null,"severity":"error","filePath":"managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java","lineNumber":3413,"sourceCode":"        final CountDownLatch counter = new CountDownLatch(1);\n        final AtomicReference<ManagedLedgerException> exception = new AtomicReference<>();\n\n        asyncDelete(new DeleteLedgerCallback() {\n            @Override\n            public void deleteLedgerComplete(Object ctx) {\n                counter.countDown();\n            }\n\n            @Override\n            public void deleteLedgerFailed(ManagedLedgerException e, Object ctx) {\n                exception.set(e);\n                counter.countDown();\n            }\n\n        }, null);\n\n        if (!counter.await(AsyncOperationTimeoutSeconds, TimeUnit.SECONDS)) {\n            throw new ManagedLedgerException(\"Timeout during managed ledger delete operation\");\n        }\n\n        if (exception.get() != null) {\n            log.error().exception(exception.get()).log(\"Error deleting managed ledger\");\n            throw exception.get();\n        }\n    }\n\n    @Override\n    public void asyncDelete(final DeleteLedgerCallback callback, final Object ctx) {\n\n        // Delete the managed ledger without closing, since we are not interested in gracefully closing cursors and\n        // ledgers\n        setFencedForDeletion();\n        cancelScheduledTasks();\n\n        // Truncate to ensure the offloaded data is not orphaned.\n        // Also ensures the BK ledgers are deleted and not just scheduled for deletion","sourceCodeStart":3395,"sourceCodeEnd":3431,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java#L3395-L3431","documentation":"ManagedLedgerImpl.delete() waits on a latch for the async deletion of all cursors and ledgers to complete. If the async delete chain does not finish within AsyncOperationTimeoutSeconds, this ManagedLedgerException is thrown. The underlying ledgers/cursors may still exist partially deleted afterwards.","triggerScenarios":"Calling the synchronous ManagedLedger delete() when deleting individual ledgers via BookKeeper or removing cursor metadata from the metadata store takes longer than AsyncOperationTimeoutSeconds — e.g. unresponsive bookies or ZooKeeper session issues.","commonSituations":"Topic deletion (retention/policy cleanup) during a BookKeeper outage or ZooKeeper latency spike; deleting a topic with many ledgers on a loaded cluster; orphaned partial deletions requiring manual metadata cleanup.","solutions":["Verify BookKeeper and ZooKeeper connectivity; deletion timeouts almost always follow an infra outage","Retry delete() — it is idempotent for already-deleted components; use ManagedLedgerFactory.asyncDelete() to avoid the sync timeout path","Use the admin API (async) for topic deletion so the timeout does not surface as a hard exception","Clean up partially-deleted ledger metadata if retries keep failing (orphan ledgers consume space)"],"exampleFix":"// before\nfactory.delete(ledgerName); // sync, times out\n// after\nfactory.asyncDelete(ledgerName)\n       .exceptionally(ex -> { log.warn(\"delete failed, will retry\", ex); return null; });","handlingStrategy":"retry","validationCode":"// ensure infra reachable before delete\nif (!zkConnected || !bkAvailable) { queueForLaterDelete(ledgerName); return; }","typeGuard":null,"tryCatchPattern":"try {\n    factory.delete(ledgerName);\n} catch (ManagedLedgerException e) {\n    retryWithBackoff(() -> factory.asyncDelete(ledgerName));\n}","preventionTips":["Prefer factory.asyncDelete() over the sync delete()","Make deletion idempotent and retriable","Watch for orphan ledgers after repeated delete timeouts","Defer deletions during metadata-store incidents"],"tags":["timeout","managed-ledger","delete","bookkeeper"],"backgroundTag":"async-operation-timeout","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}