temporalio/temporal · error

missing PollWorkflowTaskQueueResponse

Error message

missing PollWorkflowTaskQueueResponse

What it means

respondQueryTaskCompleted handles legacy query workflow tasks and requires the polled PollWorkflowTaskQueueResponse to be non-nil. A nil task means no query task was actually polled before attempting to respond, so there is nothing to answer. The helper fails fast with this message rather than panicking on task.Query access.

Source

Thrown at common/testing/taskpoller/taskpoller.go:477

	}

	resp, err := p.respondTaskCompleted(ctx, opts, task, reply)
	if err != nil {
		return nil, err
	}

	return resp, nil
}

func (p *workflowTaskPoller) respondQueryTaskCompleted(
	ctx context.Context,
	task *workflowservice.PollWorkflowTaskQueueResponse,
	reply *workflowservice.RespondQueryTaskCompletedRequest,
	err error,
) (*workflowservice.RespondQueryTaskCompletedResponse, error) {
	p.t.Helper()
	if task == nil {
		return nil, errors.New("missing PollWorkflowTaskQueueResponse")
	}
	if task.Query == nil {
		return nil, errors.New("missing Legacy Query in PollWorkflowTaskQueueResponse")
	}
	if reply == nil {
		return nil, errors.New("missing RespondQueryTaskCompletedRequest")
	}

	// setting the fields for RespondQueryTaskCompletedResponse
	if reply.Namespace == "" {
		reply.Namespace = p.namespace
	}
	if reply.TaskToken == nil {
		reply.TaskToken = task.TaskToken
	}

	if err != nil {
		reply.ErrorMessage = err.Error()

View on GitHub (pinned to bde624efd1)

Solutions

  1. Ensure a legacy query (QueryWorkflow with query reject condition / legacy API) was actually dispatched before calling HandleQuery
  2. Make the mock PollWorkflowTaskQueue client return a response with Query populated
  3. Check that the poll step in the test did not return NoWorkflowTaskAvailable and get ignored

Example fix

// before
if resp == nil { return nil }
// after
require.NotNil(t, resp)
require.NotNil(t, resp.Query)
return poller.HandleQuery(ctx, resp, reply)
Defensive patterns

Strategy: validation

Validate before calling

if task == nil {
    return errors.New("no polled query task to respond to")
}

Try / catch

resp, err := poller.HandleQuery(ctx, task, reply)
if err != nil && strings.Contains(err.Error(), "missing PollWorkflowTaskQueueResponse") {
    // poll returned nil; check for NoWorkflowTaskAvailable upstream
}

Prevention

When it happens

Trigger: Calling HandleQuery/handleQuery where the poll callback chain yields a nil *workflowservice.PollWorkflowTaskQueueResponse into respondQueryTaskCompleted.

Common situations: Test polls a task queue with no legacy query available (NoWorkflowTaskAvailable path propagated as nil); mock client returns nil response without error.

Related errors


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