Repository navigation
fix(recovery): 修复反复退出未重启模拟器及任务恢复上限误计数 - #1426
Conversation
游戏反复退出时按现有开关和阈值升级为模拟器恢复,避免仅重启游戏而无法恢复运行环境。 任务上限只累计已完成的模拟器重启,保留重启后的任务重试;游戏未运行和设备离线不触发业务任务延期。同步四种语言说明、恢复文档与回归测试。 验证:173 项关联离线测试通过,后端 Ruff 静态检查与差异检查通过;未进行真实模拟器验证。
自审发现定时重启和设备离线恢复完成后仍保留旧的游戏退出计数,可能提前再次触发模拟器重启。统一在模拟器重启完成时清零,重启失败或操作忙碌时保留。 补充真实恢复入口的清零与忙碌保留断言,同步恢复文档。173 项关联测试和 104 个子测试通过;未进行真实模拟器验证。
|
⏳ CI 检查进行中,报告将在完成后更新。 |
审阅者指南本 PR 修复游戏登录后反复退出无法升级为模拟器恢复,以及任务恢复上限在尚未完成或未验证模拟器重启时被提前消耗的问题:新增独立退出计数并复用既有升级开关和阈值,同时将任务额度改为仅统计该任务故障引发且成功完成的模拟器重启,耗尽后下一次恢复请求才延期任务,并同步文档、多语言文案和全面回归测试。 游戏反复退出与模拟器恢复的时序图sequenceDiagram
participant Scheduler
participant Game
participant Emulator
Scheduler->>Game: _run(command)
Game-->>Scheduler: GameNotRunningError
Scheduler->>Scheduler: increment consecutive_game_not_running
alt threshold reached and Error_GameStuckRestart enabled
Scheduler->>Emulator: _try_restart_emulator()
Emulator-->>Scheduler: restart completed
Scheduler->>Scheduler: reset consecutive_game_not_running
else threshold not reached
Scheduler->>Scheduler: task_call(Restart)
end
每个任务的模拟器重启上限时序图sequenceDiagram
participant Scheduler
participant Task
participant Emulator
Scheduler->>Task: _restart_emulator_for_task(task)
Scheduler->>Scheduler: _record_task_restart(task, False)
alt limit already reached
Scheduler->>Task: defer task until next schedule
else restart still available
Scheduler->>Emulator: _try_restart_emulator()
alt emulator restart completed
Emulator-->>Scheduler: True
Scheduler->>Scheduler: increment task_restart_record
Scheduler->>Task: retry task
else restart incomplete or busy
Emulator-->>Scheduler: False
Scheduler->>Task: preserve retry and restart quota
end
end
文件级变更
提示与命令使用 Sourcery
自定义使用体验访问你的控制面板以便:
获取帮助Original review guide in EnglishReviewer's Guide本 PR 修复游戏登录后反复退出无法升级为模拟器恢复,以及任务恢复上限在尚未完成或未验证模拟器重启时被提前消耗的问题:新增独立退出计数并复用既有升级开关和阈值,同时将任务额度改为仅统计该任务故障引发且成功完成的模拟器重启,耗尽后下一次恢复请求才延期任务,并同步文档、多语言文案和全面回归测试。 Sequence diagram for repeated game exits and emulator recoverysequenceDiagram
participant Scheduler
participant Game
participant Emulator
Scheduler->>Game: _run(command)
Game-->>Scheduler: GameNotRunningError
Scheduler->>Scheduler: increment consecutive_game_not_running
alt threshold reached and Error_GameStuckRestart enabled
Scheduler->>Emulator: _try_restart_emulator()
Emulator-->>Scheduler: restart completed
Scheduler->>Scheduler: reset consecutive_game_not_running
else threshold not reached
Scheduler->>Scheduler: task_call(Restart)
end
Sequence diagram for per-task emulator restart limitssequenceDiagram
participant Scheduler
participant Task
participant Emulator
Scheduler->>Task: _restart_emulator_for_task(task)
Scheduler->>Scheduler: _record_task_restart(task, False)
alt limit already reached
Scheduler->>Task: defer task until next schedule
else restart still available
Scheduler->>Emulator: _try_restart_emulator()
alt emulator restart completed
Emulator-->>Scheduler: True
Scheduler->>Scheduler: increment task_restart_record
Scheduler->>Task: retry task
else restart incomplete or busy
Emulator-->>Scheduler: False
Scheduler->>Task: preserve retry and restart quota
end
end
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Caution Review failedThe pull request is closed.
Tip 🎯 Customize your risk assessments
✅ Automatic approvals, with your rules
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. CodeRabbit Verify
|
📋 许可确认
💯 代码质量确认
uv run ruff check . --select E9,F63,F7,F82 --ignore F821,F722npm run typecheck --prefix frontenduv run --no-sync python -m ruff check . --no-cache --select E9,F63,F7,F82 --ignore F821,F722,通过。未修改前端代码,未运行前端类型检查,故本项不勾选。module/config/argument/下的 YAML 源文件,已运行uv run -m module.config.config_updater并提交生成产物🔍 变更类型 (勾选所有适用项)
📄 PR 描述
修复游戏反复退出时一直重启游戏、没有升级为模拟器恢复,且业务任务提前被延后至次日的问题。
用户日志中,游戏多次登录主界面后又退出至 MuMu 桌面,抛出的是
GameNotRunningError。原代码只对卡死/点击过多累计升级次数;游戏一度启动成功又绕过了登录前连续启动失败的兜底。与此同时,任务恢复上限累计每次失败恢复,导致 01:39:26 智能调度在仅进行了游戏重启的情况下,以“连续恢复 5 次”为由延期至 2026-11-04 00:00。本次修改:
GameStuckRestart开关和GameStuckThreshold次数阈值升级为模拟器恢复;成功重启游戏不清除该退出计数,普通任务成功或任意一次模拟器重启完成后清除。Restart、等待导航、资源检查继续使用原有恢复流程。影响共享调度器的恢复计数。保留敏感任务停止保护、脚本错误退出规则、启动重试次数、模拟器启停互斥及退避、正常每日重启排期、低推送模式和自定义调度冷却。未修改任务业务流程、游戏识别资源、ADB 恢复设置或任何默认值。
🔗 相关 Issue
无。依据用户提供的日志和设置截图修复。
📸 修改效果截图
仅调整设置名称与帮助文字,没有布局或游戏图像变化;未采集 WebUI 对比截图。
设置名称由“同一任务连续重启上限”改为“同一任务连续重启模拟器上限”;游戏卡死设置说明补充反复退出,并明确阈值单位为次数。延期日志改为“重启模拟器 N 次后仍未成功”。
🛠️ 实现复杂度
📋 实现细节 (可选)
新增独立退出计数,避免只覆盖
GameStuckError的遗漏。自审另发现定时重启、设备离线恢复完成后可能残留旧的退出次数,已在所有模拟器重启完成的公共入口清零;启停失败或忙碌时保留。补充断言先复现该遗漏,修正后通过。任务故障通过_restart_emulator_for_task()在再次请求模拟器恢复前检查额度,只在_try_restart_emulator()返回成功后计数;共享环境故障直接保留原有恢复入口,避免把游戏或设备不可用误归为某个任务的问题。次数与进程内冷却仍只在当前调度器进程中保留;延期排期继续写入配置。既有的次日延期不会自动提前,避免覆盖用户排期。
🧪 测试步骤 (可选)
已完成的离线检查:
git diff --check通过。尚未执行:真实 MuMu 实例的反复闪退恢复、实际登录与长期挂机、WebUI 截图验证、前端类型检查。日志足以确认恢复路径遗漏,无法仅据此断定闪退的底层原因是显存或模拟器内部故障。
Sourcery 摘要
修复反复退出无法升级为模拟器恢复,以及任务恢复上限提前计数导致错误延期的问题。
错误修复:
增强功能:
文档:
测试:
Original summary in English
Summary by Sourcery
修复反复退出无法升级为模拟器恢复及任务恢复上限提前计数导致错误延期的问题。
Bug Fixes:
Enhancements:
Documentation:
Tests: