[R3-04][high] Go SDK 上行发布失败后发送一直挂起 #68

Closed
opened 2026-09-30 17:18:25 +08:00 by nixevol · 2 comments
Owner

现象

基线 origin/main 0c9b459。dispatchSend 在 PublishUp 返回错误时删掉 pending、把 inflight 清掉,然后直接 return。没有 regenerateSendLocked,也没有 finishSend,也没有把条目放回队列再泵。

调用方的 Send 会一直等。若此时还没走到 OnOffline,重连后的 requeueInflightLocked 只处理仍标记为 inflight 的条目,这条会被跳过,或者之后按旧 rid 再发。K-00 要求每次重交使用新的 rid,并保留 id、body、send_at_ms。

位置

  • sdk/go/send.go:dispatchSend 里 PublishUp 失败分支
  • 对照:sdk/go/client.go 的 regenerateSendLocked / requeueInflightLocked

方案

PublishUp 失败且未要求停止重连时:保留 id / body / send_at_ms,生成新 rid,清掉这次 inflight,并唤醒发送队列继续泵。已停止重连时才 finishSend 返回错误。不要在失败路径上静默 return。

补假传输测试:发布失败一次后,Send 不应永久挂起;重试载荷的 rid 必须变化,业务字段不变。

约束

只改 sdk/go/。不要改 Python / Java / JS。偏差节 ### 复审修复 R3-04。

## 现象 基线 `origin/main` `0c9b459`。`dispatchSend` 在 `PublishUp` 返回错误时删掉 pending、把 `inflight` 清掉,然后直接 `return`。没有 `regenerateSendLocked`,也没有 `finishSend`,也没有把条目放回队列再泵。 调用方的 `Send` 会一直等。若此时还没走到 `OnOffline`,重连后的 `requeueInflightLocked` 只处理仍标记为 inflight 的条目,这条会被跳过,或者之后按旧 `rid` 再发。K-00 要求每次重交使用新的 `rid`,并保留 `id`、`body`、`send_at_ms`。 ## 位置 - `sdk/go/send.go`:`dispatchSend` 里 `PublishUp` 失败分支 - 对照:`sdk/go/client.go` 的 `regenerateSendLocked` / `requeueInflightLocked` ## 方案 `PublishUp` 失败且未要求停止重连时:保留 `id` / `body` / `send_at_ms`,生成新 `rid`,清掉这次 inflight,并唤醒发送队列继续泵。已停止重连时才 `finishSend` 返回错误。不要在失败路径上静默 return。 补假传输测试:发布失败一次后,`Send` 不应永久挂起;重试载荷的 `rid` 必须变化,业务字段不变。 ## 约束 只改 `sdk/go/`。不要改 Python / Java / JS。偏差节 `### 复审修复 R3-04`。
Author
Owner

已在分支 feat/fix-r3-68-go-sdk 修复(HEAD 9a588ce)。

原因:dispatchSend 在 PublishUp 失败且未停止重连时删除 pending、清 inflight 后直接 return,既不 regenerateSendLocked 也不 drainSendQueue/finishSend,Send 永久挂起;重连时 requeueInflightLocked 也捡不回。

做法:未 stopReconnect 时保留 id/body/send_at_ms,换新 rid,清本次 inflight 并唤醒发送队列;已停止重连时 finishSend 返回错误。

验证:go test ./...(sdk/go)通过;假传输发布失败一次后 Send 不挂起,重试 rid 变化、业务字段不变。

未合 main。

已在分支 `feat/fix-r3-68-go-sdk` 修复(HEAD `9a588ce`)。 **原因**:`dispatchSend` 在 `PublishUp` 失败且未停止重连时删除 pending、清 inflight 后直接 return,既不 `regenerateSendLocked` 也不 `drainSendQueue`/`finishSend`,`Send` 永久挂起;重连时 `requeueInflightLocked` 也捡不回。 **做法**:未 `stopReconnect` 时保留 id/body/send_at_ms,换新 rid,清本次 inflight 并唤醒发送队列;已停止重连时 `finishSend` 返回错误。 **验证**:`go test ./...`(sdk/go)通过;假传输发布失败一次后 Send 不挂起,重试 rid 变化、业务字段不变。 未合 main。
Author
Owner

已合入 main:2415314 (#68);当前 origin/main HEAD 2d1dfd7。

已合入 main:`2415314` (#68);当前 origin/main HEAD `2d1dfd7`。
Sign in to join this conversation.