復現步驟
- Alpha 連接 Beta(P2P 成功)
- 殺死 Beta 進程
- 在 ping_timeout(10s)內 Alpha 向 peer_001 發消息
實際行為
返回 {"ok":true,"message_id":"msg_xxx"}(200)
消息實際寫入 TCP 緩衝區後,由於對端已死,靜默丟失
根因(架構層)
- ThreadingHTTPServer + asyncio 混合架構:ws.send 是非確認式(fire-and-forget)
- TCP 層:send 寫入本地緩衝區即返回,不等對端 ACK
- 斷線感知:需等 WebSocket ping_interval/ping_timeout 觸發(默認 20s/10s),期間 ok=true 是假成功
修復嘗試結果
- future.result(timeout=5) 等待 send → 仍然假成功(send 寫緩衝區,非 ACK)
- relay 降級前清空 peer registry → 部分有效,但 ping_timeout 前窗口保留
真正修復需要
- 應用層 ACK:接收方回
acp.ack,發送方等待確認
- 或:降低 ping_interval/ping_timeout(3s/3s),縮短假成功窗口
- 或:重構為純 asyncio 架構
當前狀態
⚠️ 已知架構限制,調整為 P2。在 tests/test_scenario_fg.py G4 中標記為 known-limitation。
復現步驟
實際行為
返回
{"ok":true,"message_id":"msg_xxx"}(200)消息實際寫入 TCP 緩衝區後,由於對端已死,靜默丟失
根因(架構層)
修復嘗試結果
真正修復需要
acp.ack,發送方等待確認當前狀態
tests/test_scenario_fg.pyG4 中標記為 known-limitation。