apalis-dev / apalis-dev/apalis-postgres

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

未关闭
#105 0 条评论 0 个 reaction 已指派 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 摘要。