Windows: peers.py inbox read crashes on os.O_NONBLOCK (bare use; defensive getattr form already used elsewhere) — and the read receipt is persisted before the crash
维护者通常 1 天内回复
还没有人认领这个 Issue。
- #5512 来自 @Jah-yee —— 已关闭,未合并
评估
调研方向
Start with loopx/control_plane/collaboration/peers.py at input_readiness() and compare its os.O_NONBLOCK use with the defensive forms in loopx/collaboration_mcp.py and loopx/control_plane/todos/completion_result.py. Reproduce on Windows with an inbox brief containing inputs; done means the read no longer crashes and the persisted receipt behavior is understood.
由索引模型根据 Issue 内容生成。
描述
Summary
On Windows, peers.py's inbox read path crashes unconditionally whenever a peer request brief carries inputs, because input_readiness() uses os.O_NONBLOCK — an attribute that does not exist on Windows. Two properties make this worse than a plain crash:
- It is on the main read path (
read_inbox()→input_readiness(), peers.py), triggered by any brief with staged inputs — including the brief shapes in this repo's own test fixtures. - The read receipt is persisted before the crash. After the AttributeError, an after-the-fact look at
reads/<request_id>.jsonshows a recorded read (kind=receiver_cli_read,read_atset) even though the read actually failed — the receipt systematically misreports the outcome.
A one-line fix matches the pattern already used elsewhere in this same codebase (see below).
Repro (Windows, current main)
git rev-parse HEAD # d74554b48...
python -c "import os; print(hasattr(os, 'O_NONBLOCK'))" # False on win32
Then call the read path with a brief that has inputs (sandbox registry + workspace, minimal peers.request(...) followed by read_inbox(...)):
File "...\loopx\control_plane\collaboration\peers.py", line 547, in input_readiness
os.open(path, os.O_RDONLY | os.O_NONBLOCK)
AttributeError: module 'os' has no attribute 'O_NONBLOCK'
- Crash frame chain:
read_inbox→input_readiness(line 547 on current main; 523 on v1.2.2). - Before raising, the receipt
reads/<request_id>.jsonis already on disk withkind=receiver_cli_readandread_atwritten. - Briefs without an
inputskey do not hit the path (the staging guard returns early) — the failure is deterministic for any input-bearing brief on Windows, and retrying cannot succeed.
The fix already exists in this repo — twice
The defensive form is used elsewhere; only peers.py is bare (both verified on current main, git grep -n "O_NONBLOCK" upstream/main):
loopx/collaboration_mcp.py:867—getattr(os, "O_NONBLOCK", 0)loopx/control_plane/todos/completion_result.py:32—getattr(os, "O_NONBLOCK", 0)- vs.
loopx/control_plane/collaboration/peers.py:547— bareos.O_NONBLOCK
Suggested fix for peers.py (one line, consistent with those two precedents):
os.open(path, os.O_RDONLY | getattr(os, "O_NONBLOCK", 0))
On POSIX this is behavior-identical; on Windows the readiness probe degrades to a blocking open (or can be skipped, matching whatever the other call sites intend).
Impact notes
- Platform: Windows (any brief with
inputs); POSIX unaffected. - The persisted-but-failed receipt is the nastier half: any later audit of
reads/concludes the read succeeded. If there is a preferred outcome (e.g. record the read only after readiness succeeds, or record a failure kind), that would fix the misreport too — we're flagging it rather than prescribing, since the receipt-ordering may be intentional for crash recovery.
Our context
We hit this while operating a research squad on Windows against dsh 0.2.0rc2: three parallel workers all died on read_inbox with empty stdout/stderr, and the leftover receipts initially made it look like the reads had succeeded. Happy to turn the fix into a PR if the approach above is agreed — or an alternative if maintainers prefer dropping the readiness probe on Windows.
- 主要语言
- Python
- 星标
- 6.2k
- 派生
- 596
- 平均合并
- 7 小时 35 分钟
- 30 天内合并 PR
- 928
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
loopx-project/loopx 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 84/100
loopx-project/loopx#6842 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
loopx-project/loopx#6108 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
loopx-project/loopx#5688 · 2 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 60/100
loopx-project/loopx#5632 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
loopx-project/loopx#5443 · 1 条评论 ·
维护者通常 1 天内回复
查看 loopx-project/loopx 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 62/100
维护者通常 1 天内回复
-
namespace operations
难度 1/5 1 小时以内 新手友好度 72/100
EclipseFdn/open-vsx.org#14623 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 76/100
developmentseed/titiler-cmr#261 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
andrewyng/openworker#774 ·
维护者通常 1 天内回复
-
aggfunc未关闭
难度 2/5 1-3 小时 新手友好度 68/100
worldbank/blackmarblepy#160 ·