feat(download): persist retry state and dead-letter
Retry count and queue status were in-memory only and lost on restart, so failed downloads could not be safely resumed and permanently-failed episodes silently blocked re-queueing via the episode-id unique index. - Add status + retry_count columns to DownloadQueueItem - Replace unique(episode_id) with unique(episode_id, status) so permanently_failed rows do not block new pending entries - Add PERMANENTLY_FAILED to DownloadStatus enum - Persist retry_count on each failure; mark permanently_failed once max_retries reached - QueueRepository reads status/retry_count from DB instead of defaulting to PENDING/0 - Stop double-incrementing retry_count in retry_failed_items; increment only happens in _process_download on failure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -70,6 +70,8 @@ def _make_db_item(
|
||||
completed_at: datetime | None = None,
|
||||
error_message: str | None = None,
|
||||
download_url: str | None = None,
|
||||
status: str = "pending",
|
||||
retry_count: int = 0,
|
||||
):
|
||||
"""Build a fake DB DownloadQueueItem."""
|
||||
episode = MagicMock()
|
||||
@@ -91,6 +93,8 @@ def _make_db_item(
|
||||
db_item.completed_at = completed_at
|
||||
db_item.error_message = error_message
|
||||
db_item.download_url = download_url
|
||||
db_item.status = status
|
||||
db_item.retry_count = retry_count
|
||||
return db_item
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user