Skip to content

Commit 898b297

Browse files
committed
fix: handle enqueue failure in retry to prevent job loss
Only delete job record after successful re-enqueue. If enqueue fails, re-add PID to failed queue so the job can be retried later.
1 parent 9d414b1 commit 898b297

1 file changed

Lines changed: 13 additions & 7 deletions

File tree

src/Queue/Broker/Redis.php

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,20 @@ public function retry(Queue $queue, ?int $limit = null): void
149149
break;
150150
}
151151

152-
$this->enqueue($queue, $job->getPayload());
152+
$enqueued = $this->enqueue($queue, $job->getPayload());
153153

154-
/**
155-
* Remove old job record after re-enqueueing to prevent memory leak.
156-
*/
157-
$this->connection->remove("{$queue->namespace}.jobs.{$queue->name}.{$pid}");
158-
159-
$processed++;
154+
if ($enqueued) {
155+
/**
156+
* Remove old job record after successful re-enqueue to prevent memory leak.
157+
*/
158+
$this->connection->remove("{$queue->namespace}.jobs.{$queue->name}.{$pid}");
159+
$processed++;
160+
} else {
161+
/**
162+
* Re-add PID to failed queue if enqueue failed so job isn't lost.
163+
*/
164+
$this->connection->leftPush("{$queue->namespace}.failed.{$queue->name}", $pid);
165+
}
160166
}
161167
}
162168

0 commit comments

Comments
 (0)