Skip to content

[BUG-012] Relay fallback causes silent message loss: sender gets ok=true but receiver is offline #6

@Kickflip73

Description

@Kickflip73

復現步驟

  1. Alpha 連接 Beta(P2P 成功)
  2. 殺死 Beta 進程
  3. 在 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 前窗口保留

真正修復需要

  1. 應用層 ACK:接收方回 acp.ack,發送方等待確認
  2. 或:降低 ping_interval/ping_timeout(3s/3s),縮短假成功窗口
  3. 或:重構為純 asyncio 架構

當前狀態

⚠️ 已知架構限制,調整為 P2。在 tests/test_scenario_fg.py G4 中標記為 known-limitation。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions