apalis-dev / apalis-dev/apalis-postgres

[Bug]: AbortError is ignored — calculate_status has the abort branch commented out

オープン
#105 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug
主要言語
Rust
スター
9
フォーク
13
PR マージ指標
30日以内にマージされた PR はありません

説明

### What happened?

apalis-postgres 1.0.0-rc.8 with apalis 1.0.0-rc.9.

In src/ack.rs the abort branch is commented out:

Err(e) => match &e {
// Error::Abort(_) => State::Killed,
_ if parts.ctx.max_attempts() as usize <= parts.attempt.current() => Status::Killed,
_ => Status::Failed,
},

Every Err becomes Status::Failed and the task is refetched until max_attempts (5 by default). There is no way to tell this backend a task must not be retried.

The two retry layers also disagree. apalis-core's BackoffRetryPolicy::retry does honour it:

Err(err) if (err as &dyn Any).downcast_ref::().is_some() => None,

The in-process tower retry stops correctly, then the storage layer refetches the task anyway. RetryPolicy::retry_if has the same problem: the predicate returns false, no in-process retry happens, and the job still runs 5 times.

Repro: a task fn that always returns Err(AbortError::new(...)) against PostgresStorage. Observe 5 executions and attempts = 5.

This makes non-idempotent tasks unsafe — anything with an external side effect gets repeated 5 times even when the failure is known to be permanent.

### Expected behavior

Returning AbortError from a task fn settles the task as Killed after one attempt, with no refetch.

### Steps to reproduce

1. Build a worker on PostgresStorage with a task fn that always returns
Err(AbortError::new("permanent")).
2. Push one task and run the worker.
3. The task executes 5 times instead of once. The row ends at attempts = 5,
and every intermediate ack wrote Status::Failed instead of Killed.

Same result with RetryPolicy::retries(n).retry_if(|_| false) — the predicate
returns false, so the tower layer never retries, but the storage layer refetches
the task anyway.

### Minimal code example

```rust

```

### Version

1.0.0-rc.x

### Environment

- OS: Fedora Linux 44 (Workstation Edition)
- Rust version: 1.97.1
- Cargo version: 1.97.1

### Relevant log output

```shell

```

### Additional context

_No response_

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

Start in src/ack.rs at calculate_status and then read the storage retry path alongside BackoffRetryPolicy::retry and RetryPolicy::retry_if. Run the described PostgresStorage reproduction with a task returning AbortError and verify that it executes once, is acknowledged as Killed, and is not refetched.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
postgres, rust
領域
backend, databases
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
静か
明瞭さ
明確に書かれている
初心者へのやさしさ
64/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。