temporalio/temporal · error

error describing task queue with name

Error message

error describing task queue with name %s: %s

What it means

CheckIfTaskQueuesHavePollers calls DescribeTaskQueue for each task queue of a worker deployment version to see if any poller is attached. A transport/RPC failure while describing a queue is wrapped with the queue name and underlying error, aborting the deployment version state evaluation.

Solutions

  1. Inspect the wrapped inner error and fix its root cause (connectivity, auth, namespace)
  2. Retry the activity; the worker-deployment workflow retries activities on transient errors
  3. Verify the task queue names / deployment series configuration are current, not stale
  4. Increase activity timeouts if DescribeTaskQueue is consistently slow under load
Defensive patterns

Strategy: retry

Try / catch

ok, err := deployment.CheckIfTaskQueuesHavePollers(ctx, ...)
if err != nil {
    var svcErr *serviceerror.Unavailable
    if errors.As(err, &svcErr) { return retryable(err) } // transient, let activity retry
    return err
}

Prevention

When it happens

Trigger: DescribeTaskQueue failing (timeout, service unavailable, namespace not found, permission denied) while the version checking activity evaluates reachability of a deployment's task queues.

Common situations: Frontend/history outage or overload; task queue name from a stale/typo'd Build ID; namespace deleted or auth token expired; long DescribeTaskQueue latency hitting activity timeouts.

Related errors


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/f5f7c5073c92ff9f. Report an issue: GitHub.

Appendix: source

Thrown at service/worker/workerdeployment/version_activities.go:172

// CheckIfTaskQueuesHavePollers returns true if any of the given task queues has any pollers
func (a *VersionActivities) CheckIfTaskQueuesHavePollers(ctx context.Context, args *deploymentspb.CheckTaskQueuesHavePollersActivityArgs) (bool, error) {
	versionStr := worker_versioning.ExternalWorkerDeploymentVersionToString(worker_versioning.ExternalWorkerDeploymentVersionFromVersion(args.WorkerDeploymentVersion))
	for tqName, tqTypes := range args.TaskQueuesAndTypes {
		res, err := a.MatchingClient.DescribeTaskQueue(ctx, &matchingservice.DescribeTaskQueueRequest{
			NamespaceId: a.namespace.ID().String(),
			DescRequest: &workflowservice.DescribeTaskQueueRequest{
				Namespace:      a.namespace.Name().String(),
				TaskQueue:      &taskqueuepb.TaskQueue{Name: tqName, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
				ApiMode:        enumspb.DESCRIBE_TASK_QUEUE_MODE_ENHANCED,
				Versions:       &taskqueuepb.TaskQueueVersionSelection{BuildIds: []string{versionStr}},
				ReportPollers:  true,
				TaskQueueType:  enumspb.TASK_QUEUE_TYPE_WORKFLOW,
				TaskQueueTypes: tqTypes.Types,
			},
		})
		if err != nil {
			return false, fmt.Errorf("error describing task queue with name %s: %s", tqName, err)
		}
		typesInfo := res.GetDescResponse().GetVersionsInfo()[versionStr].GetTypesInfo()
		if len(typesInfo[int32(enumspb.TASK_QUEUE_TYPE_WORKFLOW)].GetPollers()) > 0 {
			return true, nil
		}
		if len(typesInfo[int32(enumspb.TASK_QUEUE_TYPE_ACTIVITY)].GetPollers()) > 0 {
			return true, nil
		}
		if len(typesInfo[int32(enumspb.TASK_QUEUE_TYPE_NEXUS)].GetPollers()) > 0 {
			return true, nil
		}
	}
	return false, nil
}

func (a *VersionActivities) GetVersionDrainageStatus(ctx context.Context, version *deploymentspb.WorkerDeploymentVersion) (*deploymentpb.VersionDrainageInfo, error) {
	logger := activity.GetLogger(ctx)
	response, err := a.WorkerDeploymentClient.GetVersionDrainageStatus(ctx, a.namespace, worker_versioning.WorkerDeploymentVersionToStringV31(version))

View on GitHub (pinned to bde624efd1)