Skip to content

v0.7.0:legacy Qoder 账号签到/积分/目录刷新报 account not found,worker 回退未生效 #329

Closed

Description

@jojojonathan

Description

v0.7.0 的 in-process PAT bridge(#313,commit 483810e)对升级前添加的 legacy Qoder 账号存在回归:这类账号只有 legacy CLI blob、没有 credential-payload 行,升级后未重新登录时,定时签到、控制台积分刷新、模型目录刷新全部以 "account not found" 失败,worker 回退路径不会生效,账号在网关请求时不可用。

重新用 PAT 登录后 payload 行生成、走 in-process 路径,症状消失,因此该问题容易被当成"凭据过期/需要重新登录"而漏报;但在 #313 的设计里 legacy 账号本应继续由 Node worker 承接。

Steps to Reproduce

  1. 在 v0.7.0 之前的版本上通过 CLI blob 登录添加 Qoder 账号(不产生 credential-payload 行)
  2. 升级到 v0.7.0,不重新登录
  3. 观察定时签到 / 控制台"刷新积分" / 模型目录刷新,返回 "account not found"

Expected Behavior

按 Bridge() 注释声明的设计意图,legacy 账号应返回 ErrPATRequired,Models / Quota / Checkin 据此回退到 worker 路径,账号继续可用。

Actual Behavior

internal/providers/qoder/pat.go 的 Bridge()(v0.7.0 tag 第 159 行附近)中,LoadCredentialPayload 出错时原样透传:

format, payload, err := store.LoadCredentialPayload(ctx, accountID)
if err != nil {
    return nil, err // legacy 账号无 payload 行,透传的是 store 的 ErrAccountNotFound
}

只有 store == nil 一种情形返回 ErrPATRequired。legacy 账号拿到的是 store 的 ErrAccountNotFound,而调用方的回退分支只认 ErrPATRequired(internal/providers/qoder/adapter.go 约 221/531 行,checkin.go 约 44 行):

} else if !errors.Is(err, ErrPATRequired) {
    return nil, err
}
// Legacy fallback: account has no PAT, talk to the worker.

错误类型不匹配,回退分支永远走不进去,整个调用直接失败。

Possible Fix

把 payload 行缺失映射回哨兵错误即可(我们在 fork 上验证过该修复对 legacy 账号生效,签到/积分/目录均正常回退到 worker):

format, payload, err := store.LoadCredentialPayload(ctx, accountID)
if err != nil {
    if errors.Is(err, accounts.ErrAccountNotFound) {
        return nil, ErrPATRequired
    }
    return nil, err
}

第二组回归:PAT 登录成功后不显示额度,签到也不可用

同样由 #313 引入、影响的是新登录 PAT 账号(有 credential-payload 行)这一侧:

额度不刷新(机制已定位)。 v0.7.0 的 qoder adapter 未注册 Prober(Adapter() 返回的 bundle 不含 Prober),而额度刷新的所有路径都依赖它:

  • internal/runtime/manager_maintenance.go 的 refreshCheckinQuota / refreshQuotaOnly:adapter.Prober != nil 才走 fetchProviderQuota,否则回落 worker URL
  • internal/runtime/manager_probe.go 的 refreshInProcess:probe 成功后才触发额度刷新与状态落库

PAT 账号走 in-process 路径、没有 worker URL,Prober 又未注册,两条路都不满足:登录成功后额度永不刷新,控制台不显示额度,账号状态也停留在未就绪/离线(refreshOne 不 probe 无 URL 的 child-runtime item)。

签到不可用(实测观察)。 签到链路对 PAT 账号走 Bridge 的 in-process campaigns 接口。我们在修复环境的实测:PAT 账号 in-process 签到返回"签到活动未开放"(campaigns 接口无可领活动),同一时刻同体系的 legacy worker 账号签到成功(+100 积分)——两条签到路径的活动可见性不一致,PAT 账号签不上、拿不到积分。另外若 bridge() 返回非 ErrPATRequired 错误(如 session 刷新失败),签到同样没有 worker 回退,直接失败。

修复方向(fork 上已验证)。 注册 Prober 并让 Probe 先经 Bridge() 探测(legacy 账号回落 worker /health),refreshInProcess 即可恢复额度刷新与状态持久化;签到活动可见性差异建议单独核对 in-process campaigns 接口与 worker /admin/checkin 的 token 类型 / 入口是否一致(CN 区 securityOauthToken 与 OpenAPI token 的活动入口)。

关联

Environment

  • v0.7.0(Linux Docker 部署,fork 环境合并 v0.7.0 tag 后排查定位)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions