版本: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。
复现
- 更新源选 Mirror酱,先触发一次更新检查(这时下载地址是新的)
- 四小时内不要再检查,直接
POST /api/update/download
- 下载 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 的连接失败,没有一条「下载失败」的结论行,上层看到的就是「开始下载」之后再无消息,很容易误判成网速慢。如果能在重试耗尽后补一条明确的失败日志会好排查很多。
版本:v5.4.0(后来升到了 v5.5.0-beta.1)
更新源:Mirror酱,beta 通道
现象
8 月 27 日起,每次开机自动更新都停在「开始下载」,更新包一直没下下来,版本卡在 v5.4.0 不动。
debug/app.log:三次重试全是 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。
复现
POST /api/update/download对照
先
POST /api/update/check带上if_force: true,再POST /api/update/download:同一台机器、同一条网络、同一个 CDK,只差一个
if_force。100 多兆十秒就下完了,所以不是网络问题。建议
缓存版本号本身没问题,问题在于把一次性下载地址也跟着缓存了。可以在
download_update()取地址之前无条件刷新一次版本信息,或者把下载地址单独存、并且每次下载前都重新获取。另外这个失败目前是静默的:日志里只有 404 的连接失败,没有一条「下载失败」的结论行,上层看到的就是「开始下载」之后再无消息,很容易误判成网速慢。如果能在重试耗尽后补一条明确的失败日志会好排查很多。