Skip to content

更新检查缓存四小时,导致 Mirror酱的一次性下载地址失效,下载必定 404 #440

Description

@herclyon1

版本:v5.4.0(后来升到了 v5.5.0-beta.1)
更新源:Mirror酱,beta 通道

现象

8 月 27 日起,每次开机自动更新都停在「开始下载」,更新包一直没下下来,版本卡在 v5.4.0 不动。

debug/app.log

更新服务 | 开始下载: https://mirrorchyan.com/api/resources/download/<一次性令牌>
主程序   | HTTP Request: GET https://mirrorchyan.com/... "HTTP/1.1 404
更新服务 | 连接失败: https://mirrorchyan.com/..., 状态码: 404, 剩余重试次数: 2
更新服务 | 连接失败: ..., 状态码: 404, 剩余重试次数: 1
更新服务 | 连接失败: ..., 状态码: 404, 剩余重试次数: 0

三次重试全是 404,之后就没有下文了,也不生成 UpdatePack_*.zip

紧挨着的上一条日志是:

更新服务 | 四小时内已进行过一次检查, 直接使用缓存的版本更新信息

原因

app/services/update.py 里:

  • check_update()if_force 为假、且距上次检查不足四小时时,直接返回缓存的版本信息,不再向 Mirror酱 发请求(178-184 行)
  • 只有真正发请求那一支里才会执行 self.mirror_chyan_download_url = version_info["data"]["url"](223-224 行)
  • 下载时 _get_download_url() 返回的就是 self.mirror_chyan_download_url(149-163 行)

Mirror酱 的下载地址是一次性的,用过或过期就作废。走缓存分支时这个地址不会刷新,下载时拿到的还是上一次检查留下的那个,于是必定 404。

复现

  1. 更新源选 Mirror酱,先触发一次更新检查(这时下载地址是新的)
  2. 四小时内不要再检查,直接 POST /api/update/download
  3. 下载 404,重试三次后失败,不产生更新包

对照

POST /api/update/check 带上 if_force: true,再 POST /api/update/download

更新服务 | 获取版本信息成功
更新服务 | 开始下载: https://mirrorchyan.com/api/resources/download/<新的一次性令牌>
更新服务 | 连接成功: ..., 状态码: 200
更新服务 | 下载完成: 实际下载大小: 107754478 字节, 耗时: 9.93 秒

同一台机器、同一条网络、同一个 CDK,只差一个 if_force。100 多兆十秒就下完了,所以不是网络问题。

建议

缓存版本号本身没问题,问题在于把一次性下载地址也跟着缓存了。可以在 download_update() 取地址之前无条件刷新一次版本信息,或者把下载地址单独存、并且每次下载前都重新获取。

另外这个失败目前是静默的:日志里只有 404 的连接失败,没有一条「下载失败」的结论行,上层看到的就是「开始下载」之后再无消息,很容易误判成网速慢。如果能在重试耗尽后补一条明确的失败日志会好排查很多。

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions