temporalio/temporal · error

error describing task queue with name %s: %s

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.

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)

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.