Skip to content

finding(objectql): reap 的每轮上限是「按 (对象, where 作用域)」计的 —— N 个租户覆写把一轮的实际预算变成 (N+1) × 10000 行 #5756

Description

@os-zhuang

观察类 finding,来自 #5194 / PR #5753 的实现。今天没有用户会撞到,记录在案由 PM 定级。

事实(origin/main + PR #5753)

REAP_BATCH_SIZE (500) × REAP_MAX_BATCHES_PER_SWEEP (20) 的注释说的是「bound one sweep's work」。实际上这个预算是在 batchedReap() 一次调用内计的,而 reap() 在有租户覆写时会多次调用它(lifecycle-service.ts:1128 起):

  • 每个声明了 maxAge/expireAfter 覆写的租户一个 pass(organization_id: t.tenantId + 该租户自己的 cutoff);
  • 外加一个全局 pass($or: [{organization_id: {$nin: [...]}}, {organization_id: null}])。

于是 N 个租户覆写 ⇒ 一个对象一轮最多删 (N+1) × 10000 行,而不是注释承诺的 10000。

为什么这不是 #5194 的回归,也不是当下的故障

值得记下来的原因

「bound one sweep's work」是文件里写明的承诺,而在租户覆写存在时它字面上不成立 —— 下一个读这段注释的人会按 10000 估算一轮的成本。要么把预算改成跨 pass 共享(一个对象一轮一份 10000,按 pass 依次消耗),要么把注释改成「per (object, scope)」并说明为什么这样是对的。两种都是小改动,但属于语义取舍,不该由本 PR 顺手决定。

PR #5753 的正文里已如实记了这一条。

Found-during: #5194 / PR #5753

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions