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

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