{"record":{"id":"bc41ba2a73b18fd5","repo":"apache/pulsar","slug":"invalid-backlog-quota-type-s-valid-options-are","errorCode":null,"errorMessage":"Invalid backlog quota type '%s'. Valid options are: %s","messagePattern":"Invalid backlog quota type '(.+?)'\\. Valid options are: (.+?)","errorType":"validation","errorClass":"ParameterException","httpStatus":null,"severity":"error","filePath":"pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java","lineNumber":1315,"sourceCode":"                + \"You can set size or time to control the backlog, or combine them together to control the backlog. \")\n        private String backlogQuotaTypeStr = BacklogQuota.BacklogQuotaType.destination_storage.name();\n\n        @Override\n        void run() throws PulsarAdminException {\n            BacklogQuota.RetentionPolicy policy;\n            BacklogQuota.BacklogQuotaType backlogQuotaType;\n\n            try {\n                policy = BacklogQuota.RetentionPolicy.valueOf(policyStr);\n            } catch (IllegalArgumentException e) {\n                throw new ParameterException(String.format(\"Invalid retention policy type '%s'. Valid options are: %s\",\n                        policyStr, Arrays.toString(BacklogQuota.RetentionPolicy.values())));\n            }\n\n            try {\n                backlogQuotaType = BacklogQuota.BacklogQuotaType.valueOf(backlogQuotaTypeStr);\n            } catch (IllegalArgumentException e) {\n                throw new ParameterException(String.format(\"Invalid backlog quota type '%s'. Valid options are: %s\",\n                        backlogQuotaTypeStr, Arrays.toString(BacklogQuota.BacklogQuotaType.values())));\n            }\n\n            String namespace = validateNamespace(namespaceName);\n\n            BacklogQuota.Builder builder = BacklogQuota.builder().retentionPolicy(policy);\n            if (backlogQuotaType == BacklogQuota.BacklogQuotaType.destination_storage) {\n                // set quota by storage size\n                if (limit == null) {\n                    throw new ParameterException(\"Quota type of 'destination_storage' needs a size limit\");\n                }\n                builder.limitSize(limit);\n            } else {\n                // set quota by time\n                if (limitTimeInSec == null) {\n                    throw new ParameterException(\"Quota type of 'message_age' needs a time limit\");\n                }\n                builder.limitTime(limitTimeInSec.intValue());","sourceCodeStart":1297,"sourceCodeEnd":1333,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNamespaces.java#L1297-L1333","documentation":"The --backlog-quota-type argument of set-backlog-quota is parsed with BacklogQuota.BacklogQuotaType.valueOf(). Only the enum constants (destination_storage, message_age) are accepted; anything else throws this ParameterException listing valid options.","triggerScenarios":"Running `pulsar-admin namespaces set-backlog-quota <ns> --backlog-quota-type <bad-string> ...` where backlogQuotaTypeStr doesn't exactly match a BacklogQuotaType constant.","commonSituations":"Typing 'destination-storage' or 'storage' instead of 'destination_storage'; wrong case ('Message_Age'); scripts ported from configs that use hyphenated or camelCase names.","solutions":["Use 'destination_storage' for size-based quotas or 'message_age' for time-based quotas","Match exact case and underscores as printed in the error","Verify the enum on your Pulsar version if upgrading"],"exampleFix":"// before\npulsar-admin namespaces set-backlog-quota my-tenant/my-ns --backlog-quota-type destination-storage --limit-size 5G\n// after\npulsar-admin namespaces set-backlog-quota my-tenant/my-ns --backlog-quota-type destination_storage --limit-size 5G","handlingStrategy":"validation","validationCode":"// pre-check in Java before invoking\nboolean valid = Arrays.stream(BacklogQuota.BacklogQuotaType.values())\n        .anyMatch(v -> v.name().equals(quotaTypeStr));","typeGuard":"function isValidBacklogQuotaType(s) { return ['destination_storage','message_age'].includes(s); }","tryCatchPattern":"try {\n    admin.namespaces().setBacklogQuota(ns, quota, type);\n} catch (IllegalArgumentException e) {\n    // print BacklogQuota.BacklogQuotaType.values() and correct the argument\n}","preventionTips":["Use underscored lowercase constants: destination_storage, message_age","Never translate config-key spellings into CLI values","Test quota commands against a dev cluster first"],"tags":["cli","enum-parsing","backlog-quota","pulsar-admin"],"backgroundTag":"invalid-enum-value","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"}