feat(python/robomp): added automatic event retry scheduling with backoff delays
- Added event retry settings with parsed delay schedules and jittered delay computation. - Extended event persistence to persist an `available_at` timestamp, honor it during dequeuing, and clear it when re-queuing. - Updated worker failure handling to queue bounded retries with backoff and transition to failed only when the retry budget is exhausted.
This commit is contained in:
@@ -301,8 +301,25 @@ class WorkerPool:
|
||||
self.db.mark_event(row.delivery_id, "failed", error="cancelled by operator")
|
||||
else:
|
||||
tb = traceback.format_exc(limit=20)
|
||||
log.exception("event handler failed", extra={"delivery": row.delivery_id})
|
||||
self.db.mark_event(row.delivery_id, "failed", error=f"{exc}\n{tb}")
|
||||
err = f"{exc}\n{tb}"
|
||||
max_retries = self.settings.event_max_retries
|
||||
delay = self.settings.retry_delay_seconds(row.attempts)
|
||||
if 0 < row.attempts <= max_retries and self.db.schedule_retry(
|
||||
row.delivery_id, delay_seconds=delay, error=err
|
||||
):
|
||||
log.warning(
|
||||
"event retry scheduled",
|
||||
extra={
|
||||
"delivery": row.delivery_id,
|
||||
"key": row.issue_key,
|
||||
"attempt": row.attempts,
|
||||
"max_retries": max_retries,
|
||||
"retry_in_seconds": round(delay, 1),
|
||||
},
|
||||
)
|
||||
else:
|
||||
log.exception("event handler failed", extra={"delivery": row.delivery_id})
|
||||
self.db.mark_event(row.delivery_id, "failed", error=err)
|
||||
finally:
|
||||
self._cancelled.discard(row.delivery_id)
|
||||
self._shutdown_cancelled.discard(row.delivery_id)
|
||||
|
||||
Reference in New Issue
Block a user