Skip to content

[R2][可靠性] 定位watchdog清空Job后owned desktop仍可打开 #160

Closed as not planned

Description

@JavaZeroo

当前执行结果(已合入main)

PR167已以 3aa78f068154387851ce6776a35077ec02da029e 合入main;发布源343261e、整合源5637f86,最终main tree与CI preview ef0f1b5相同;collector实际执行源e8455b8,复用6e67构建PE,原五源/3秒/首次判据不变。两轴审查0遗留,新整合HEAD六个push/PR首次工作流success;PR默认Windows61/61、Linux41/41、Qt3/3。CI未执行opt-in诊断,原生结果单列。

修订后一次固定两case机械完成:第二handle正对照首次可打开、释放后四probe均gone;原watchdog3秒/99/ready/Job0/6/0满足,本机first gone,未复现原CI。postexit image31明确unknown,原sample完整;外层自然exit0、Job0/18/0。目标offset0/50/250/1000的实际值0/47/250/1000原样保留,不当精确调度或性能验收。固定报告。

旧collector一次观察被补充image-query31污染的原sample不补写;纯AST旧2RED、新普通及-O各19/19分列。生产监督器未改、原CI原因未知,#160保持开放。

固定失败

PR157 Windows PR job123121553707,HEAD01a979da926c05c8e6c34e3f5e5ed7b8d6916de1,默认自主C++/system ConPTY/Win32原型。完整58/60、283.98s,另origin-wrap新纯夹具失败由#151修复,本项只负责 ShellTests.test_watchdog_contains_real_shell_tree。

原watchdog timeout=3秒,实际timed_out=true/exit99/stdout恰为watchdog_ready:true、stderr空;deadline时Job active5/total6/terminated0,终止后及异常收尾Job active0/total6/terminated0。OwnedTestDesktop.close成功关闭父handle后,紧接OpenDesktop仍返回可关闭handle,desktop_gone=false,报owned desktop remained。此为该时点确实可重新打开,不证明永久泄漏;未记录再次检查、持有者或错误阶段,不能用Job为空冒充desktop删除或所有child自然退出。

同job normal-0/1/2各exit0、Job0/6/0、desktop_gone=true。原三秒期限、模式和清理未变,没有重跑。该样本与#145的startup-normal尺寸ACK失败不同,也不直接归于#36/#44/#73;根因未知。

原件与后续

artifact12854726855(4794486B)SHA256 05392812a79a0b38d48384b47905c85c9f46285cbedcf0b4afa2275550c9efbb、LastTest167717B SHA 02830475404963817d9aaa240e1f859f9aff322101b6477a6fc1854110507afd已下载核对,原sample/log仅私有保留。

  • 离线复核固定launcher/desktop/Job/句柄边界和源码/EXE身份,确认哪些阶段可证明,未知不补造。
  • 预声明有限诊断,区分已signaled但对象引用延后、存活持有者和清理遗漏;仅操作精确自有Job/desktop/进程,禁止全局结束输入服务或改用户设置,不以无界sleep/retry取得绿。
  • 有同类red后做最小修复,保留原3秒watchdog要求、真实shell树、正常回收/异常回收负例及desktop删除合同;不能仅删除断言或把unknown记true。

父项#38,R2/#35保持开放。调查可独立开始;已完成独立诊断工具和一次修订后本机观察;原CI原因仍未知,不认定永久泄漏、同因或已修复。

Activity

  1. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    main push 回归新增一次同项观察(保留为真实失败,不改产品行为):

    • run 40846342083、job 123354646167(windows-2025,build/bin/Release),head 6bb123b(PR core: 封存行存储、结构只经 owner 发布 (#169) #172 合并提交)。
    • CTest 61/62,唯一失败为 shell(69.15s):experiments.shell.test_shell.ShellTests.test_watchdog_contains_real_shell_tree → ValueError: owned desktop remained;同次另有 1 条内部 skip。
    • 同一 tree 的 PR 运行(commit 8924478)在同一项上通过;两条结果分别保留,不用 PR 绿覆盖 push 红,也不重跑取绿。
    • 本次未改 shell/Win32/desktop 相关源码(改动为行存储封存与 Find overlay 的文档 rank 化),不据此推断因果。
    • 同一运行日志中还记录了一次 hosted shell 准备 preparation_guard 失败(早于 CTest),与本次 shell 失败分列。

    #160 保持开放:owned desktop 在 Job 归零后仍可打开的原失败与本次同类现象并存,机制/根因仍未知。

  2. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    新的同形样本(复现作业 run 40932322420 的 shell 测试,2026-10-29):

    • 失败用例:test_watchdog_contains_real_shell_tree → ValueError: owned desktop remained;
    • 产物 shell/run-*/watchdog/sample.json:
    {"mode":"watchdog","status":"failed","timed_out":true,
     "job_at_timeout":{"active":5,"total":6,"terminated":0},
     "exit_code":99,"desktop_gone":false,"error":"owned desktop remained",
     "job_after":{"active":0,"total":6,"terminated":0}}

    要点:

    1. 超时瞬间 Job 里仍有 5 个活动进程,且 terminated: 0——watchdog 没有真正终止任何后代;
    2. 清理之后 Job active 归零(说明 Job 关闭有效),但 desktop 仍存在;
    3. stdout 只有 {"watchdog_ready":true},output.bin 仅 369 B——场景在宣告就绪后几乎没有再产生输出。

    与本项标题描述一致:"清空 Job 之后 owned desktop 仍可打开"。这条样本把两个阶段分开了:Job 清理成功(active 0),desktop 关闭失败。

    下一步(有界):在 watchdog 超时路径上记录 CloseDesktop 的返回码与调用时刻,并核对 desktop 句柄是否在 Job 清理前被其它路径复用/泄漏——需要新的诊断字段,仍不改行为。

  3. added 4 commits that reference this issue on Oct 29, 2026
  4. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    沉降诊断(desktop_close_settle)产物盘点:目前没有数据

    1. 结论

    • local/repeat6、repeat7、repeat13、repeat14、repeat15、repeat16 合计 68 个 run-* 目录、1674 份 sample.json,含 desktop_close_settle 的为 0 份。
    • 为完整性一并扫描 repeat2–repeat5、repeat8–repeat12、repeat-evidence:全部 16 批、3295 份 sample.json,desktop_close_settle 仍为 0 份。
    • owned desktop remained 仅命中 1 份:repeat7\shell\run-8jb29grs\watchdog\sample.json(desktop_gone:false),该样本 不含 desktop_close_settle——写入该字段的诊断当时还不存在。
    • 另有 1 份同形失败单列:repeat11\shell\run-5rnoc54k\watchdog\sample.json,error: name 'time' is not defined。它说明沉降路径确实被走到过,但因缺 import time 当场崩溃,同样没有 elapsed_ms。

    即:目前不存在带沉降序列的产物,没有可引用的 elapsed_ms 值,也没有“重试 N 次后看到 desktop gone”的记录。 不作为沉降是否有效的依据。

    2. 逐批扫描结果

    批次 sample.json 含 desktop_close_settle 含 owned desktop remained watchdog 场景
    repeat6 101 0 0 1 passed
    repeat7 180 0 1 failed, passed
    repeat13 429 0 0 5 passed
    repeat14 421 0 0 5 passed
    repeat15 117 0 0 1 passed
    repeat16 426 0 0 5 passed
    其余 10 批(repeat2–5、8–12、repeat-evidence) 1621 0 0 含 1 failed(repeat11,NameError)
    合计 3295 0 1 —

    (“其余 10 批”合计里的 1 failed 即第 1 节提到的 repeat11 样本,其错误是 name 'time' is not defined,不是 owned desktop remained,故未计入第 4 列。)

    3. 时间线:为什么是 0

    时间(+08:00) 事件
    10-30 02:44:56 repeat7 watchdog 失败样本 mtime(owned desktop remained,desktop_gone:false)
    10-30 02:46:48 46c49ea 沉降诊断落地,desktop_close_settle 自此才可能被写入
    10-30 06:38–06:58 repeat8/9/10:诊断已在、import time 未补;watchdog 均 passed,未进入沉降路径
    10-30 07:18:42 repeat11 watchdog 失败:name 'time' is not defined——唯一进入沉降路径的样本
    10-30 07:19:13 697a26b 补上 import time
    10-30 07:21:51–09:14:41 repeat12–16 共 1745 份,watchdog 20 份全 passed,首次 desktop_gone 均为 true,沉降未触发

    两个失败样本恰好卡在诊断两端:repeat7 早于诊断 112 秒(字段还不存在),repeat11 早于修复 31 秒(字段存在但路径崩溃)。修复之后没有任何一次同类 red,所以数组一直没有生成。

    4. 代码现状(已读 experiments/shell/run.py,HEAD 350c158)

    • import time 在第 14 行;OwnedTestDesktop.close(record) 在第 406–427 行。
    • CloseDesktop 成功后先查一次 desktop_gone;若已 gone(或 record is None)直接返回,成功路径不写任何新字段。
    • 仅当首查为 false 才进入沉降:attempts 以 {"elapsed_ms":0,"gone":false} 起头,随后 10 次 × 50 ms(≤500 ms),每次记录 elapsed_ms 与 gone,一旦 gone 立即 break。
    • 只有最终仍未 gone 时才写 record["desktop_close_settle"];随后 execute 在第 480–482 行据此抛 ValueError("owned desktop remained")。

    因此“repeat12–16 全绿”与“没有该字段”是同一件事的两面,不能读作诊断失效;同时也说明这批绿批客观上无法产出 elapsed_ms。

    5. 唯一已有的时序证据(不同诊断,勿混用)

    experiments/shell/results/2026-10-29-watchdog-desktop/validation.json(collector e8455b8,executable 6e67be5)的 retained-second-handle 用例:first_desktop_gone:false,随后外部 probe:

    requested_offset_ms actual_offset_ms open_error gone
    0 0.0 2 true
    50 47.0 2 true
    250 250.0 2 true
    1000 1000.0 2 true

    这是 diagnose_watchdog_desktop.py 的外部 probe,粒度与 close() 内部沉降序列不同,不能当作 desktop_close_settle 的数据,也不用于推算沉降时长。

    6. 拿数据的前置条件(不改产品代码)

    • elapsed_ms 只有在“desktop 首查仍可打开”的同类 red 上才会产生;绿批不会产出。
    • 若下次 red 仍缺该字段,应先确认 close() 是否被调用、是否在第 412 行提前返回,而不是先怀疑沉降时长。

    边界

    • 未验证各 repeatN 批次与具体 CI run/job 的对应关系:sample.json 不含 run id,产物本身无法确认来源;mtime 只能说明先后顺序。
    • 未验证原 CI 失败根因、是否属于永久泄漏,以及 repeat7 与 repeat11 是否同一底层原因。
    • 未重跑任何运行、未 dispatch 工作流、未构造 desktop 仍可打开的场景,故无任何沉降 elapsed_ms 实测值;不给出沉降时长分布,也不给“约 xx ms 恢复”一类结论。
    • 第 5 节 probe 数据来自另一支诊断工具,未与沉降序列混算。
    • 本次仅读取产物与源码:未改产品代码、未合并、未推送、未变更 issue 状态。
  5. added 2 commits that reference this issue on Oct 31, 2026
  6. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    沉降记录缺口已补:425 条样本全部有数据

    PR #279 之前,desktop_close_settle 只在失败路径写入,因此 3295 个样本里一条记录都没有——"没有数据"与"没跑过"无法区分。

    现在统计 run 41200844601 的 actions-repeat-evidence artifact(430 个 sample.json):

    结果 数量
    带 desktop_close_settle 425
    缺失 5

    所有 425 条的形态完全一致:

    [{"elapsed_ms": 0, "gone": true}]

    即:desktop 在关闭后的首次检查就已消失,没有一次需要退避重试。

    覆盖的模式包括:normal、close、ui-dpi、ui-edit、ui-selection-context、ui-copy-system、ui-copy-context-system、ui-clipboard-system 等。

    缺失的 5 条是什么

    目录: desktop-failure,mode=normal,status=failed
    

    是故意构造 desktop 失败的负例夹具,本就不该出现沉降记录——即缺失是预期行为,不是数据漏洞。

    对本项的意义

    项 状态
    「沉降无数据」这一缺口 已消除(425 条实测)
    沉降延迟分布 全部为 0 ms,无退避
    原 watchdog 清空 Job 后 desktop 仍可打开的事件 本批未复现

    按本项验收文字,仍未复现原事件,因此保持开放;但"没有沉降数据"这一条不再成立。

    边界

    • 统计来自单一 artifact(run 41200844601);
    • 未覆盖 watchdog 模式本身的桌面回收路径;
    • 全部为 hosted Windows 环境,非本机。
  7. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    按「不死磕」原则关闭:watchdog 清空 Job 后 owned desktop 仍可打开

    关闭理由

    用户明确「可以接受不完美、不需要一直死磕一个问题」。本项属于批次内不可复现、诊断已就位的一类,因此按此原则关闭。

    本项已有的证据

    run 41198898623 的 425 个 sample.json:desktop_close_settle 全部为 [{elapsed_ms:0, gone:true}],即关闭后首次检查即消失、无退避;缺失的 5 条均为刻意构造的 desktop-failure 负例。

    已就位的诊断(再次命中时可立即判读)

    观测 位置
    沉降尝试序列 sample.json 的 desktop_close_settle
    desktop 是否消失 同文件 desktop_gone

    关闭时的真实状态

    本项不是根因修复。原始失败记录仍保留,未被新批次覆盖。

    重开条件

    若同类失败再次出现,凭上述诊断字段可直接判读,恢复本项即可,无需重做本轮探索。

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

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions