{"record":{"id":"df51763bc91d32f9","repo":"temporalio/temporal","slug":"failure-message","errorCode":null,"errorMessage":"${failure.Message}","messagePattern":"\\$\\{failure\\.Message\\}","errorType":"exception","errorClass":"ErrRegister","httpStatus":null,"severity":"error","filePath":"service/worker/workerdeployment/client.go","lineNumber":393,"sourceCode":"\t// starting and updating the deployment version workflow, which in turn starts a deployment workflow.\n\toutcome, err := d.updateWithStartWorkerDeployment(ctx, namespaceEntry, deploymentName, &updatepb.Request{\n\t\tInput: &updatepb.Input{Name: RegisterWorkerInWorkerDeployment, Args: updatePayload},\n\t\tMeta:  &updatepb.Meta{UpdateId: requestID, Identity: identity},\n\t}, identity, requestID, d.getSyncBatchSize())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn d.handleRegisterVersionFailures(outcome)\n}\n\nfunc (d *ClientImpl) handleRegisterVersionFailures(outcome *updatepb.Outcome) error {\n\tif failure := outcome.GetFailure(); failure.GetApplicationFailureInfo().GetType() == errMaxTaskQueuesInVersionType ||\n\t\tfailure.GetApplicationFailureInfo().GetType() == errTooManyVersions {\n\t\treturn newResourceExhaustedError(failure.GetMessage())\n\t} else if failure.GetApplicationFailureInfo().GetType() == errNoChangeType {\n\t\treturn nil\n\t} else if failure != nil {\n\t\treturn ErrRegister{error: errors.New(failure.Message)}\n\t}\n\treturn nil\n}\n\nfunc newResourceExhaustedError(message string) *serviceerror.ResourceExhausted {\n\treturn &serviceerror.ResourceExhausted{\n\t\tMessage: message,\n\t\tScope:   enumspb.RESOURCE_EXHAUSTED_SCOPE_NAMESPACE,\n\t\tCause:   enumspb.RESOURCE_EXHAUSTED_CAUSE_WORKER_DEPLOYMENT_LIMITS,\n\t}\n}\n\nfunc (d *ClientImpl) handleUpdateVersionFailures(outcome *updatepb.Outcome, deploymentName, buildID string) error {\n\tif failure := outcome.GetFailure(); failure.GetApplicationFailureInfo().GetType() == errVersionNotFound {\n\t\treturn serviceerror.NewNotFoundf(ErrWorkerDeploymentVersionNotFound, buildID, deploymentName)\n\t} else if failure.GetApplicationFailureInfo().GetType() == errFailedPrecondition {\n\t\treturn serviceerror.NewFailedPrecondition(failure.Message)\n\t} else if failure != nil {","sourceCodeStart":375,"sourceCodeEnd":411,"githubUrl":"https://github.com/temporalio/temporal/blob/bde624efd13fbd3843654058db6d9c716166318b/service/worker/workerdeployment/client.go#L375-L411","documentation":"In the worker deployment (versioning) client, handleRegisterVersionFailures translates a failed RegisterVersion outcome into a Go error. For unrecognized application-failure types it wraps failure.Message in ErrRegister. The message text itself comes from the server, so this error surfaces whatever the history/frontend service rejected the registration with.","triggerScenarios":"RegisterTaskQueueWorker, SetCurrentVersion, or SetRampingVersion completes and the response outcome carries an ApplicationFailureInfo whose type is not errMaxTaskQueuesInVersionType, errTooManyVersions, or errNoChangeType — i.e. any other server-side registration failure.","commonSituations":"Worker deployment versions exceeding limits in forms not covered by the typed errors; task queue/partition lookup failures server-side; mismatched worker build IDs or deployment names; server version older/newer than client expectations so new failure types fall into the generic branch.","solutions":["Read ErrRegister's embedded message — it contains the server's explanation — and fix the underlying deployment/task queue issue it names.","Upgrade the SDK/client so newer typed failure kinds are translated instead of falling into the generic ErrRegister branch.","Verify worker deployment name, version, and task queue names match an existing valid deployment registration.","Retry registration only after fixing the cause; ErrRegister wraps a plain error, not a retryable one, so blind retries fail identically."],"exampleFix":"// before\nerr := client.RegisterTaskQueueWorker(ctx, req) // returns ErrRegister{...}\nlog.Fatal(err)\n// after\nvar regErr workerdeployment.ErrRegister\nif errors.As(err, &regErr) {\n    logger.Error(\"worker version registration rejected by server\", \"reason\", regErr.Error())\n    return regErr\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"var regErr workerdeployment.ErrRegister\nif errors.As(err, &regErr) {\n    // server rejected registration; inspect regErr.Error()\n}","tryCatchPattern":"err := client.RegisterTaskQueueWorker(ctx, req)\nif err != nil {\n    var regErr workerdeployment.ErrRegister\n    if errors.As(err, &regErr) {\n        logger.Error(\"registration rejected\", \"msg\", regErr.Error())\n    } else {\n        // transport error: may be retryable\n        return err\n    }\n}","preventionTips":["Read the wrapped server message before retrying","Keep client and server versions aligned so typed failures are translated","Verify deployment name/version and task queue names before registration","Treat ErrRegister as non-retryable until its cause is fixed"],"tags":["go","worker-deployment","versioning","error-translation"],"backgroundTag":"version-registration-rejected","analyzedSha":"bde624efd13fbd3843654058db6d9c716166318b","analyzedAt":"2026-09-01T07:18:39.080Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}