{"record":{"id":"fd22431ad0f62e08","repo":"apache/beam","slug":"expansionaddr-q-trying-to-use-unregistered-namespace-q","errorCode":null,"errorMessage":"expansionAddr %q trying to use unregistered namespace: %q","messagePattern":"expansionAddr %q trying to use unregistered namespace: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/xlangx/registry.go","lineNumber":214,"sourceCode":"\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif err := r.validateAddr(expansionAddr); err != nil {\n\t\treturn fmt.Errorf(\"xlangx.RegisterExpansionForUrn(%q,%q) error: %v\", urn, expansionAddr, err)\n\t}\n\tr.urnOverrides[urn] = expansionAddr\n\treturn nil\n}\n\nfunc (r *registry) validateAddr(expansionAddr string) error {\n\tu, err := url.Parse(expansionAddr)\n\tif err == nil && u.Scheme != \"\" && u.Host != \"\" {\n\t\t// This is likely a URL, so allow it.\n\t\treturn nil\n\t}\n\t// Otherwise, let's check that we have a handler registered.\n\tns, _ := parseAddr(expansionAddr)\n\tif _, ok := r.handlers[ns]; !ok {\n\t\treturn fmt.Errorf(\"expansionAddr %q trying to use unregistered namespace: %q\", expansionAddr, ns)\n\t}\n\treturn nil\n}\n\n// getHandlerFunc returns HandlerFunc and the config string to put into the params when called.\nfunc (r *registry) getHandlerFunc(urn, expansionAddr string) (HandlerFunc, string) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\t// By the time this is called, we want *some* kind of HandlerFunc at all,\n\t// So first we check for the hard override.\n\tns, config := parseAddr(expansionAddr)\n\tif ns == hardOverrideNamespace {\n\t\t// We have the override namespace and config we must use, so skip the urn step.\n\t\texpansionAddr = config // The expansionAddr becomes the full config, in case of service.\n\t\tns, config = parseAddr(config)\n\n\t} else if addr, ok := r.urnOverrides[urn]; ok {\n\t\t// If there is no hard override, check the urn overrides.","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/xlangx/registry.go#L196-L232","documentation":"The Beam xlangx registry validates expansion addresses before an override is registered. It parses the namespace from the expansion service address and requires a matching handler to have been registered via RegisterNamespaceHandler. If the address's namespace has no handler, this error is thrown to prevent later expansion failures.","triggerScenarios":"Calling RegisterOverrideForUrn with an expansionAddr whose parsed namespace (e.g. the host/URL component or scheme-derived namespace) was never registered with registry.RegisterNamespaceHandler.","commonSituations":"Typo in the namespace string when registering handlers; using a custom expansion service URL without registering its namespace; switching between local and remote expansion addresses in cross-language pipelines.","solutions":["Register a handler for the namespace first via xlangx.RegisterNamespaceHandler(ns, handler) before calling RegisterOverrideForUrn.","Check the parsed namespace with xlangx.ParseAddr (or similar) to confirm what string you must register.","If the address is a plain expansion URL that should be allowed as-is, verify it passes the URL check; else adjust the address format."],"exampleFix":"// before\nxlangx.RegisterOverrideForUrn(urn, \"localhost:50051\", overrideFn)\n// after\nxlangx.RegisterNamespaceHandler(\"localhost:50051\", handler)\nxlangx.RegisterOverrideForUrn(urn, \"localhost:50051\", overrideFn)","handlingStrategy":"validation","validationCode":"ns, _ := xlangx.ParseAddr(expansionAddr) // or registry equivalent\nif handler, ok := handlers[ns]; !ok {\n    return fmt.Errorf(\"no handler registered for namespace %q\", ns)\n}","typeGuard":"func hasHandler(ns string) bool { _, ok := xlangx.GetNamespaceHandler(ns); return ok }","tryCatchPattern":"if err := xlangx.RegisterOverrideForUrn(urn, addr, fn); err != nil {\n    if strings.Contains(err.Error(), \"unregistered namespace\") {\n        xlangx.RegisterNamespaceHandler(ns, handler)\n        err = xlangx.RegisterOverrideForUrn(urn, addr, fn)\n    }\n}","preventionTips":["Always pair RegisterNamespaceHandler with RegisterOverrideForUrn in the same setup function.","Centralize expansion address constants to avoid typos in namespaces."],"tags":["cross-language","namespace","registry","go"],"backgroundTag":"missing-required-config","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}