{"record":{"id":"c1c406f35094ec3e","repo":"risingwavelabs/risingwave","slug":"the-domain-only-can-be-specified-as-persistent-o","errorCode":null,"errorMessage":"The domain only can be specified as 'persistent' or 'non-persistent'. Input domain is '{}'","messagePattern":"The domain only can be specified as 'persistent' or 'non-persistent'\\. Input domain is '(.+?)'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/connector/src/source/pulsar/topic.rs","lineNumber":142,"sourceCode":"                PERSISTENT_DOMAIN, PUBLIC_TENANT, DEFAULT_NAMESPACE, parts[0],\n            ),\n            3 => format!(\"{}://{}\", PERSISTENT_DOMAIN, topic),\n            _ => {\n                bail!(\n                    \"Invalid short topic name '{}', \\\n                it should be in the format of <tenant>/<namespace>/<topic> or <topic>\",\n                    topic\n                );\n            }\n        };\n    }\n\n    let parts: Vec<&str> = complete_topic.splitn(2, \"://\").collect();\n\n    let domain = match parts[0] {\n        PERSISTENT_DOMAIN | NON_PERSISTENT_DOMAIN => parts[0],\n        _ => {\n            bail!(\n                \"The domain only can be specified as 'persistent' or 'non-persistent'. Input domain is '{}'\",\n                parts[0]\n            );\n        }\n    };\n\n    let rest = parts[1];\n    let parts: Vec<&str> = rest.splitn(3, '/').collect();\n\n    if parts.len() != 3 {\n        bail!(\n            \"invalid topic name '{}'; it must be in the format <tenant>/<namespace>/<topic>\",\n            rest\n        );\n    }\n\n    let parsed_topic = Topic {\n        domain: domain.to_owned(),","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/source/pulsar/topic.rs#L124-L160","documentation":"Pulsar topic URLs must begin with the 'persistent://' or 'non-persistent://' domain. parse_topic splits the input on '://' and rejects any topic whose scheme is neither, because RisingWave needs the domain to construct the fully-qualified Pulsar topic path used by the connector.","triggerScenarios":"Calling Topic::new/parse_topic with a topic string whose scheme (the part before '://') is misspelled or unrecognized, e.g. 'persistant://tenant/ns/topic', 'kafka://...', or a bare URL with an unknown prefix.","commonSituations":"Copy-pasting a topic URI from another messaging system, typos in 'persistent'/'non-persistent', or users omitting a '/' so the auto-defaulting branch (which prepends persistent://public/default/) does not apply.","solutions":["Fix the domain prefix to exactly 'persistent://' or 'non-persistent://'","If no domain is intended, pass the topic as 'tenant/namespace/topic' (3 slash-separated parts) or a bare topic name so it is auto-prefixed","Check for typos like 'persistant' or trailing whitespace before '://'"],"exampleFix":"// before\nlet topic = parse_topic(\"persistant://public/default/events\");\n// after\nlet topic = parse_topic(\"persistent://public/default/events\");","handlingStrategy":"validation","validationCode":"function validatePulsarDomain(topic) {\n  if (topic.includes('://') && !/^(persistent|non-persistent):\\/\\//.test(topic)) {\n    throw new Error(`domain must be 'persistent' or 'non-persistent': ${topic}`);\n  }\n}","typeGuard":"const hasValidPulsarDomain = (t) => !t.includes('://') || /^(persistent|non-persistent):\\/\\//.test(t);","tryCatchPattern":"try { const topic = parse_topic(input); } catch (e) { if (String(e).includes(\"domain only can be specified\")) { fixDomainAndRetry(); } else { throw e; } }","preventionTips":["Always use full 'persistent://tenant/namespace/topic' URLs from the Pulsar console","Beware of typos like 'persistant'","Rely on the auto-prefixing behavior by passing bare 'tenant/ns/topic' strings instead of a custom scheme"],"tags":["pulsar","config","url"],"backgroundTag":"invalid-url-format","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}