Skip to content

ASSIGNMENT_TIMEOUT handler never resolves/rejects its PendingAssignment promise — await job.promise hangs forever + memory leak #2176

Description

@tsushanth

Bug description

packages/agents/src/worker.ts lines 853–862 handle ASSIGNMENT_TIMEOUT by logging a warning, but never resolve or reject the PendingAssignment promise:

case proto.ServerMessage_Message.Case.assignment: {
  // ...resolves the promise correctly
}
// ASSIGNMENT_TIMEOUT case:
default: {
  logger.warn('assignment timed out');
  // ← promise at this.#pending[req.id] is never resolved or rejected
}

Any caller await-ing this.#pending[req.id]?.promise hangs forever. The timed-out entry is also never deleted from #pending, so each timed-out job leaks one unresolvable Promise + entry indefinitely.

Fix

Reject the pending promise on timeout and clean up the entry:

case 'timeout': {
  const pending = this.#pending[req.id];
  if (pending) {
    delete this.#pending[req.id];
    pending.reject(new Error(`Job assignment timed out for job ${req.id}`));
  }
  logger.warn('assignment timed out');
  break;
}

Environment

  • Verified against current main branch (packages/agents/src/worker.ts)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions