Skip to content

log_reporter_service: 自部署模式下 DeviceAuthException(NO_BACKEND) 触发退避计数,日志上报永久失效 #47

Description

@yunkst

问题位置lib/services/log_reporter_service.dart:264(位于 _upload 方法的 try { ... } 块内)

问题:本次重构把日志上报的鉴权从用户静态 X-API-TOKEN 改为 DeviceAuthService.instance.authedHeaders()。但 authedHeaders()ensureRegistered()register()kHasBundledBackend == false(自部署模式 / 自定义后端)时直接抛 DeviceAuthException('NO_BACKEND', '...')

该异常抛出后被 _upload 末尾的 catch (e)(line 305-308)兜住,路由到 _onUploadFailure('未知错误: DeviceAuthException(NO_BACKEND)...'),从而:

  • 每次上报都 _consecutiveFailures++
  • 连续 3 次后进入指数退避(backoffMaxSeconds=300s,最多 5 分钟一次)
  • 上报功能对自部署用户永久失效

文件 line 263 注释承诺"凭证不可用(未配置后端/未注册成功)时静默放弃本轮上报",但实际行为相反——它把可恢复的"凭证未就绪"当成真实网络失败计入退避计数。

影响

  • 回归:本次提交前,自部署用户即使没填 token,方法也走 if (token.isEmpty) return false(line 261 同位置),不计入失败计数;现在计入。
  • 自部署用户在缓冲到 20 条后第一次 flush() 就失败,3 次后进入 5 分钟一次退避;日志被本地堆积但永远无法上报。
  • 与本次同步上线的"APP 侧移除静态 API token"叠加,迫使所有托管之外的部署形态在日志侧彻底退化。

修复建议(任选其一):

  1. authedHeaders() 调用前先 if (!kHasBundledBackend) return false;——自部署模式无设备服务,本来也不该走这条鉴权。
  2. authedHeaders() 调用从 try 块内提到 if (host.isEmpty) return false; 之后、try 之前(用单独的 try/catch (DeviceAuthException) { return false; }),确保不计入 _consecutiveFailures
  3. _onUploadFailure 处区分"凭证未就绪"与"真网络错误",前者直接 return false 不计数。

backend_settings_screen.dart 文案写"AI 托管模式已使用内置服务器地址…此项仅本地开发调试自定义后端时有效",意味着自部署路径仍被支持;这条 bug 等于让自部署路径的日志上报失效,与产品定位冲突。


忽略指南:在 lib/services/log_reporter_service.dart:264 添加注释 // cr-ignore <CR_IGNORE_IID_HASH>: <你的理由>,下次审查会自动关闭。

Activity

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