{"record":{"id":"4045368cb6dd728d","repo":"apache/pulsar","slug":"brokercloseinactivetopicsenabled-only-supports-bro","errorCode":null,"errorMessage":"brokerCloseInactiveTopicsEnabled only supports brokerDeleteInactiveTopicsMode=delete_when_no_subscriptions. Under delete_when_subscriptions_caught_up a topic whose subscriptions are caught up is inactive even while consumers are still connected, so closing it would repeatedly unload and reload the topic.","messagePattern":"brokerCloseInactiveTopicsEnabled only supports brokerDeleteInactiveTopicsMode=delete_when_no_subscriptions\\. Under delete_when_subscriptions_caught_up a topic whose subscriptions are caught up is inactive even while consumers are still connected, so closing it would repeatedly unload and reload the topic\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java","lineNumber":915,"sourceCode":"                    && config.getBacklogQuotaDefaultLimitSecond() > 0\n                    && config.getBacklogQuotaDefaultLimitSecond() >= config.getDefaultRetentionTimeInMinutes() * 60) {\n                throw new IllegalArgumentException(String.format(\"The retention time must > the backlog quota limit \"\n                                + \"time, but the configured backlog quota limit time duration is %d, \"\n                                + \"the retention time duration is %d\",\n                        config.getBacklogQuotaDefaultLimitSecond(),\n                        config.getDefaultRetentionTimeInMinutes() * 60));\n            }\n\n            if (config.isBrokerDeleteInactiveTopicsEnabled() && config.isBrokerCloseInactiveTopicsEnabled()) {\n                throw new IllegalArgumentException(\n                        \"brokerDeleteInactiveTopicsEnabled and brokerCloseInactiveTopicsEnabled are mutually \"\n                                + \"exclusive. Enable at most one of them.\");\n            }\n\n            if (config.isBrokerCloseInactiveTopicsEnabled()\n                    && config.getBrokerDeleteInactiveTopicsMode()\n                            != InactiveTopicDeleteMode.delete_when_no_subscriptions) {\n                throw new IllegalArgumentException(\n                        \"brokerCloseInactiveTopicsEnabled only supports brokerDeleteInactiveTopicsMode=\"\n                                + \"delete_when_no_subscriptions. Under delete_when_subscriptions_caught_up a topic \"\n                                + \"whose subscriptions are caught up is inactive even while consumers are still \"\n                                + \"connected, so closing it would repeatedly unload and reload the topic.\");\n            }\n\n            openTelemetryTopicStats = new OpenTelemetryTopicStats(this);\n            openTelemetryConsumerStats = new OpenTelemetryConsumerStats(this);\n            openTelemetryProducerStats = new OpenTelemetryProducerStats(this);\n            openTelemetryReplicatorStats = new OpenTelemetryReplicatorStats(this);\n            openTelemetryReplicatedSubscriptionStats = new OpenTelemetryReplicatedSubscriptionStats(this);\n\n            localMetadataSynchronizer = StringUtils.isNotBlank(config.getMetadataSyncEventTopic())\n                    ? new PulsarMetadataEventSynchronizer(this, config.getMetadataSyncEventTopic())\n                    : null;\n            localMetadataStore = createLocalMetadataStore(localMetadataSynchronizer,\n                    openTelemetry.getOpenTelemetryService().getOpenTelemetry());\n            localMetadataStore.registerSessionListener(this::handleMetadataSessionEvent);","sourceCodeStart":897,"sourceCodeEnd":933,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-broker/src/main/java/org/apache/pulsar/broker/PulsarService.java#L897-L933","documentation":"This IllegalArgumentException is thrown at broker startup when brokerCloseInactiveTopicsEnabled is true but brokerDeleteInactiveTopicsMode is set to delete_when_subscriptions_caught_up. Topic inactivity detection under that mode marks a topic inactive when all subscriptions are caught up even while consumers remain connected, so closing such topics would unload and reload them in a loop. The broker rejects the combination at startup instead of allowing the churn.","triggerScenarios":"Starting a broker with isBrokerCloseInactiveTopicsEnabled()==true and getBrokerDeleteInactiveTopicsMode() != delete_when_no_subscriptions, i.e. the mode is delete_when_subscriptions_caught_up (or all Kafka-style modes) — e.g. by only changing brokerDeleteInactiveTopicsMode from its default without disabling close-inactive-topics.","commonSituations":"Operators tune delete mode to delete_when_subscriptions_caught_up for safer deletion semantics while the close-inactive-topics feature is also on; inherited configs where the mode was changed for the delete feature but the close flag predates the constraint.","solutions":["Set brokerDeleteInactiveTopicsMode=delete_when_no_subscriptions when brokerCloseInactiveTopicsEnabled=true (delete_when_no_subscriptions is that flag's only supported mode).","If you need delete_when_subscriptions_caught_up semantics, set brokerCloseInactiveTopicsEnabled=false and rely on deletion instead.","Review both flags together in broker.conf / env overrides before deploying; they are coupled by this validation.","Restart the broker and verify startup completes."],"exampleFix":"// before (broker.conf)\nbrokerCloseInactiveTopicsEnabled=true\nbrokerDeleteInactiveTopicsMode=delete_when_subscriptions_caught_up\n// after\nbrokerCloseInactiveTopicsEnabled=true\nbrokerDeleteInactiveTopicsMode=delete_when_no_subscriptions","handlingStrategy":"validation","validationCode":"// before broker start (Java)\nif (conf.isBrokerCloseInactiveTopicsEnabled()\n        && conf.getBrokerDeleteInactiveTopicsMode() != InactiveTopicDeleteMode.delete_when_no_subscriptions) {\n    throw new IllegalArgumentException(\n        \"brokerCloseInactiveTopicsEnabled requires brokerDeleteInactiveTopicsMode=delete_when_no_subscriptions\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    pulsar.start();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"brokerCloseInactiveTopicsEnabled only supports\")) {\n        // fix broker.conf: set mode to delete_when_no_subscriptions or disable close-inactive-topics, then retry\n    } else {\n        throw e;\n    }\n}","preventionTips":["Whenever enabling brokerCloseInactiveTopicsEnabled, also pin brokerDeleteInactiveTopicsMode=delete_when_no_subscriptions.","Treat the mode and the close flag as one coupled setting in config templates.","Add the flag/mode pairing to config CI checks.","If deletion needs delete_when_subscriptions_caught_up, disable closing instead of mixing."],"tags":["broker","configuration","startup","topics","conflicting-flags"],"backgroundTag":"invalid-configuration","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}