Repository navigation
Conversation
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1892 宝宝,把“停止等待超时”和“真正清理完毕”分开,确实能避免把解锁工作一并丢掉。不过这版只保住了各层清理任务,还没保住父子收尾的先后关系:子任务仍在写账号状态时,父管理器已经可以把配置锁放开了。这里先别急着合喵,回归测试也还没接到它想验证的那条回调链。 旧执行桥负责停止确认与收尾等待;MaaFW 的账号任务完成资源关闭和账号结算,管理器随后保存配置、释放托管锁。这次需要保留的正是后两步的顺序,不需要另建一套锁机制。 [逻辑 · P2] 保留子任务清理时,也要让父管理器等到真正完成再解锁位置:app/task/legacy.py:283–304。 静态追踪:MaaFW 管理器在 这不是只有永不返回的协程才会遇到:账号收尾的模拟器关闭允许等待 30 秒,执行桥默认收尾确认只有 10 秒。关闭较慢、停止确认先到期时,账号清理仍可能停在 项目目录预约仍会挡住部分重跑、导入操作,但它不代替账号配置锁; 建议由旧执行桥保存真正的清理完成句柄,让父层的后台收尾继续等待子层真实完成后再保存、解锁;面向用户的停止等待仍可限时返回。请补一个真实 manager + inner task 的场景:账号清理越过停止等待期限时配置仍锁定,允许账号清理完成后才解锁,并且结算只发生一次。把这条顺序补齐,保留清理的改动才算完整啦。 [规范 · P2] 新回归测试的阻塞回调提交到了随后被替换的对象位置:tests/core/test_maafw_stop_lock_regression.py:42–60。 测试先调用 这点不只是推演:已读取本次 Python Tests 的实际日志,Ubuntu 和 Windows 都在第 60 行 建议在 验证与合入检查本次完成源码静态追踪与两路独立复核,没有运行项目代码或测试。现有 CI 还报告旧测试 另已读取格式和更新日志检查的失败日志:两个改动文件需要按仓库锁定的格式工具处理;更新日志检查未找到碎片,当前也没有豁免标签。请按项目本轮发布规则补齐碎片或适用的豁免,再让 CI 核验。构建成功不能替代上述失败的回归检查。 —— dot酱敬上 🐾 |
…only essential resources
…n until exit is verified
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1892 宝宝,这版已经补上重复取消的等待保护,也让停止确认期间的设备关闭和后脚本继续走原来的进程管理入口,前一版的两个方向都收得更稳了。不过新加的项目预约延迟释放还会被另一条取消路径打断:进程已经成功结束,项目却可能一直占用。这里先别合,最后这段释放链还要补齐喵。 旧执行桥负责限时确认和统一进程清理;MaaFW 账号任务持有项目预约,只有确认旧工作不再操作目录后才能释放。这个责任划分没问题,问题是等待的清理任务没有一起保留下来。 [逻辑 · P2] 成功强杀后,取消掉的清理任务会让项目预约永久遗留静态推演的触发条件是停止前尚未开始收尾,运行前设置进程的清理超过停止确认预算,但统一强杀成功。具体顺序:
这里没有假设强杀失败,也不要求提前放开仍在写入的资源。新增的 建议由 MaaFW 清理入口保留能够代表真实完成的 cleanup 句柄,让它能走到结束,释放 worker 再据此确认并交还预约。不要仅捕获取消就直接释放,因为取消本身不证明底层工作已完成。可以复用新增的 复审与验证前一条评论中“子任务后台完整收尾、父层先解锁”的原路径已经撤掉;错误回调桥夹具也已移除。新增清理命令和真实账号预约回归有用,但不等价于原来的 manager 配置 X 锁契约:仍需在真实回调桥上验证回调结清后能重新取得配置锁,不能以项目预约测试代替。当前不重复列旧缺陷;新测试也还没有覆盖上面这条成功强杀后的最终释放。 dot酱做了源码静态追踪和两路独立复核,没有执行项目代码或测试。已读取当前 Python Tests 实际日志,Windows、Ubuntu 都还剩 3 项 TimeoutError,分别涉及晚到进程句柄、文件线程和 MaaFW 环境准备。它们不是本条静态缺陷的实际复现;停止等待预算和夹具时序仍需核对,不能直接把所有超时当成同一个原因。当前格式、更新日志、锁文件、误回退和构建检查均已通过,合入前仍需让行为回归通过。 —— dot酱敬上 🐾 |
…ask cleanup until native exit
总体结论:修改后合并AUTO-MAS-Project/AUTO-MAS #1892 宝宝,上一轮的 pretask 清理任务这次确实保留下来了,还补了强制停止成功、慢快照结束后再释放预约的回归,这处修得好喵~不过发行包核对还有另一条正常取消路径,会让已经停下来的项目一直显示占用;这只漏网 bug 还得一起补上。 公共任务作用域负责停止确认和进程回收,MaaFW 账号负责等文件核对真正结束后释放项目预约。现在卡住的是这两个步骤之间的交接。 [逻辑 · P2] 发行包核对正常取消后,项目预约不会释放 静态追踪到的触发过程是:资源加载失败进入 账号收尾把预约键移交给延后释放任务,并把自身的 结果是项目预约一直留在进程内的占用表中,没有过期释放;同一项目之后再运行、重新导入或手动更新都会被占用检查拒绝,直到重启后端。原实现对已结束的核对任务会直接释放预约,这条卡住路径是本 PR 新增的。 建议让 MaaFW 的释放逻辑明确识别“核对已经安全结束,包括协作取消”,确认后继续释放;尚未完成的文件操作仍要保留预约,别简单吞掉所有取消就放锁喵。可以沿现有预约测试补一个针对性场景:占住同源更新锁,让真实发行包核对进入等锁,再停止任务,确认清理成功后能重新取得同一项目预约。 本轮复查了停止生命周期、Windows 进程归属、同步更新命令及 MaaFW 收尾链路。已读取最新 Windows / Ubuntu CI 日志,两平台均通过;现有预约回归覆盖模拟器关闭和 pretask 清理,还没有覆盖上述发行包核对取消路径。dot酱只做了静态检查,没有自行运行代码、测试或实机验证。把这条释放分支补齐,再用对应回归确认就好啦。 —— dot酱拍拍爪敬上 🐾 |
总体结论:可以合并AUTO-MAS-Project/AUTO-MAS #1892 宝宝,这次把正常停止后的预约释放补齐了喵:发行包核对已经协作取消并结束时,会继续归还项目预约;只是释放等待者被取消、核对还在运行时,仍不会提前放锁。前面进程清理失败时保留占用的保护也没有放宽,这处分清了,dot酱给你拍拍爪~ 新增回归走真实的资源失败恢复和更新锁等待,再停止任务并确认同一项目可以重新预约,正对上一条问题。本轮复查未发现还需修改的确认缺陷,审查范围内可以合并。 已读取本次 Windows / Ubuntu CI 实际日志,两平台通过。dot酱复用了未变部分的既有审查,针对新取消分支和整体停止链路做静态复核,没有自行运行项目代码,也没有实机验证;PR 目前仍是 draft,是否转为就绪由维护者决定。 —— dot酱拍拍爪敬上 🐾 |
| process = win32api.OpenProcess( | ||
| win32con.PROCESS_SET_QUOTA | ||
| | win32con.PROCESS_TERMINATE | ||
| | win32con.PROCESS_QUERY_INFORMATION, | ||
| False, | ||
| target.pid, | ||
| ) | ||
| try: | ||
| # OpenProcess 的句柄固定目标;再用缓存的创建时间核对身份。 | ||
| if not target.is_running(): |
There was a problem hiding this comment.
Bug: WindowsTaskJob.adopt() fails with an unhandled pywintypes.error if a descendant process exits before OpenProcess, causing cleanup_failed to stay set and project locks to leak.
Severity: MEDIUM
Suggested Fix
Wrap win32api.OpenProcess inside WindowsTaskJob.adopt() in a try...except pywintypes.error block to catch errors caused by terminated processes and skip or ignore processes that are no longer accessible.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.
Location: app/utils/windows/process.py#L82-L91
Potential issue: In `WindowsTaskJob.adopt()`, `win32api.OpenProcess` is called on the
root process and all queued descendants. If a short-lived child process (such as a
launcher helper or crash reporter) exits between being listed and opened, `OpenProcess`
raises a `pywintypes.error` that is not caught or tolerated. This unhandled exception
aborts process adoption and causes `scope.track()` to set `cleanup_failed = True`.
Consequently, `release_after_confirmed_stop` skips releasing the project lock, leaving
the MaaFW project reserved until the application is restarted.
Did we get this right? 👍 / 👎 to inform future reviews.
摘要
统一当前脚本任务的停止清理:复用公共任务作用域,为本轮启动或明确接管的进程及后代登记归属;短命父进程、中间进程退出后,Windows Job 仍能回收后代。仅查找已有窗口不取得结束该进程的权限。
补齐绕过公共入口的辅助命令:HSR 的 SRA 版本探测、7z 列表与解包,MaaEnd 差量补丁,以及鸣潮差量补丁。同步工作线程中的命令继承调用任务归属,任务外调用保持原有行为。
保留逐项限时停止确认,超时后仍强制回收任务归属进程并关闭本地管道;一个进程组失败不跳过其余清理。不等待输出 EOF 来证明退出,Windows 组退出核验最多等待 1 秒,未确认时记录失败并保留资源占用。
修复旧专项收尾被遗弃引起的 MaaFW 配置锁、项目预约与结果写回问题;Windows 退出通知滞后时,用原生进程句柄独立核验并记录日志,仍等待任务清理与文件核对完成才释放预约。
修复审查指出的发行包核对取消后永久占用:核对通过停止令牌退出后,等待真实任务清理成功再释放预约;若释放等待者被取消而核对仍在运行,则保留预约。
修复 Sentry 指出的 Windows 接管竞态:确认旧目标已经退出后跳过它,继续登记已发现的后代;仍存活目标的权限等错误继续上报并保留资源占用。
覆盖范围
上述是代码入口和公共清理链路的核对结果,不代表每个真实游戏均完成实机验收。
验证
最新提交:
ce1c959e4efe27202b9ab880e64d27cc530238fc。作者 Windows 本机、Python 3.12.13,独立环境按 uv.lock 安装。边界
仅处理本轮明确归属的进程,不按全局进程名结束共享 ADB 或任务外已有程序,不猜测登记前已完全失去谱系的历史进程。内部资源清理沿用已有任务结果与本地日志,不增加遥测字段或发送 PID、路径。
使用真实任务生命周期及本机标记进程验证,游戏执行和第三方更新工具由受控测试进程替代;没有使用真实游戏账号、模拟器或共享 ADB 服务。临时副本与测试目录在验证后删除,主测试目录和日常安装不变。本次不合并 PR。