{"record":{"id":"c5fcf435f6794841","repo":"temporalio/temporal","slug":"unable-to-get-namespace-details-w","errorCode":null,"errorMessage":"unable to get namespace details: %w","messagePattern":"unable to get namespace details: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"service/worker/deletenamespace/activities.go","lineNumber":206,"sourceCode":"\t\tsuffix := fmt.Sprintf(\"-deleted-%s\", nsID.String()[:suffixLength])\n\t\tif strings.HasSuffix(nsName.String(), suffix) {\n\t\t\tlogger.Info(\"Namespace is already renamed for deletion\")\n\t\t\treturn nsName, nil\n\t\t}\n\t\tnewName := fmt.Sprintf(\"%s%s\", nsName, suffix)\n\n\t\t_, err := a.metadataManager.GetNamespace(ctx, &persistence.GetNamespaceRequest{\n\t\t\tName: newName,\n\t\t})\n\t\tswitch err.(type) {\n\t\tcase nil:\n\t\t\tlogger.Warn(\"Regenerate namespace name due to collision.\", tag.String(\"wf-new-namespace\", newName))\n\t\tcase *serviceerror.NamespaceNotFound:\n\t\t\tlogger.Info(\"Generated new name for deleted namespace.\", tag.String(\"wf-new-namespace\", newName))\n\t\t\treturn namespace.Name(newName), nil\n\t\tdefault:\n\t\t\tlogger.Error(\"Unable to get namespace details.\", tag.Error(err))\n\t\t\treturn namespace.EmptyName, fmt.Errorf(\"unable to get namespace details: %w\", err)\n\t\t}\n\t}\n\t// Should never get here because namespace ID is guaranteed to be unique.\n\treturn namespace.EmptyName, fmt.Errorf(\"unable to generate new name for deleted namespace %s. ID %q is not unique\", nsName, nsID)\n\n}\n\nfunc (a *localActivities) RenameNamespaceActivity(ctx context.Context, nsID namespace.ID, previousName namespace.Name, newName namespace.Name) error {\n\tif newName == previousName {\n\t\treturn nil\n\t}\n\n\tctx = headers.SetCallerName(ctx, previousName.String())\n\n\trenameNamespaceRequest := &persistence.RenameNamespaceRequest{\n\t\tPreviousName: previousName.String(),\n\t\tNewName:      newName.String(),\n\t}","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/service/worker/deletenamespace/activities.go#L188-L224","documentation":"GenerateDeletedNamespaceNameActivity generates a new name for a namespace being deleted and confirms uniqueness via GetNamespace. On any error other than NamespaceNotFound or AlreadyExists-style collision handling, it logs and wraps the failure with this error, returning an empty namespace name. NamespaceNotFound is the expected success signal (name is free).","triggerScenarios":"The GetNamespace lookup performed inside the uniqueness-check loop returns an unexpected error — persistence failure, timeout, or any non-NamespaceNotFound service error — during deleted-namespace name generation.","commonSituations":"Frontend/persistence outage while running the delete-namespace workflow; namespace cache/persistence inconsistency; transient DB errors during the rename step of namespace deletion.","solutions":["Retry the delete-namespace workflow once the underlying GetNamespace/persistence failure is resolved — the generation loop is idempotent.","Inspect the wrapped error (and the logged tag.Error) to determine whether it's a persistence, timeout, or frontend lookup failure.","Verify the frontend/namespace service is reachable from the worker executing this activity.","Add a retry policy on this activity so transient lookups failures don't fail namespace deletion outright."],"exampleFix":"// before\nname, err := activities.GenerateDeletedNamespaceNameActivity(ctx, nsName, nsID) // transient GetNamespace error aborts\nif err != nil {\n  return err\n}\n// after\nerr = workflow.ExecuteActivity(ctx, a.GenerateDeletedNamespaceNameActivity, nsName, nsID).Get(ctx, &name) // with RetryPolicy in ActivityOptions\nif err != nil {\n  logger.Warn(\"namespace rename pending; will retry\", tag.Error(err))\n  return err // workflow retry policy retries\n}","handlingStrategy":"retry","validationCode":"// verify namespace frontend availability before the rename step\nif _, err := frontendClient.GetNamespace(ctx, &frontendservice.GetNamespaceRequest{Namespace: nsName.String()}); err != nil {\n  var nf *serviceerror.NamespaceNotFound\n  if !errors.As(err, &nf) {\n    return fmt.Errorf(\"namespace lookup unhealthy; postpone deletion: %w\", err)\n  }\n}","typeGuard":null,"tryCatchPattern":"err := workflow.ExecuteActivity(ctx, a.GenerateDeletedNamespaceNameActivity, nsName, nsID).Get(ctx, &newName)\nif err != nil {\n  if strings.Contains(err.Error(), \"unable to get namespace details\") {\n    logger.Warn(\"transient namespace lookup failure during rename; will retry\", tag.Error(err))\n    return err // workflow-level retry\n  }\n  return err\n}","preventionTips":["Use a retry policy on GenerateDeletedNamespaceNameActivity for transient lookup failures.","Treat NamespaceNotFound as success (name is available) — only retry other error types.","Check frontend service health before executing the delete-namespace workflow.","Monitor GetNamespace latency/errors from the worker service."],"tags":["go","namespace","persistence","lookup-failed"],"backgroundTag":"namespace-lookup-failed","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}