基线 origin/main 0c9b459。推送 worker 只在 WakePush 时跑一轮 PushPending,下面三条路径漏了唤醒,在线空闲时消息或回执会停住。
origin/main
0c9b459
WakePush
PushPending
dispatchDueBatch
pending
dropped
rejected
completed
receipts.acked=0
Submit
WakePush(senderID)
max_receive_bytes
rejectTooLarge
pushed_conn IS NULL
expire_at
Recall
recalled
pushed_conn
flushRevokes
internal/app/message/push.go
too_large
internal/app/message/ack.go
internal/app/message/submit.go
Ack
只改 internal/app/message/ 与对应测试。不改 PublishDown 签名。测试监听 :0,数据放临时目录。偏差写入 docs/DEVIATIONS.md 新节 ### 复审修复 R3-01。不要合 feat/fix-3-downlink-deadlock。
internal/app/message/
PublishDown
:0
docs/DEVIATIONS.md
### 复审修复 R3-01
feat/fix-3-downlink-deadlock
????????? (#65)?
feat/fix-r3-65-wake
b79bba391149877fc4fef9d374eb4bd0c192b5e3
go test ./internal/app/message/
task check
origin/feat/fix-r3-65-wake
已合入 main:443a6c6 (#65);当前 origin/main HEAD 2d1dfd7。
443a6c6
2d1dfd7
No dependencies set.
The note is not visible to the blocked user.
现象
基线
origin/main0c9b459。推送 worker 只在WakePush时跑一轮PushPending,下面三条路径漏了唤醒,在线空闲时消息或回执会停住。dispatchDueBatch只把仍为pending的接收方放进唤醒集合。当场变成dropped/rejected/completed并写入的回执不会叫醒发送方。发送方若已握手且之后不再自己收发,回执一直留在receipts.acked=0。立即发送在Submit里会WakePush(senderID),这条到点路径没有。PushPending按窗口取出一批。前面若干条因超过max_receive_bytes或包上限被rejectTooLarge时,只WakePush发送方。这一轮结束后 worker 回去等待。排在后面、仍是pending且pushed_conn IS NULL的正常消息不再推。接收方一直在线、不保留且expire_at为空时,到期循环也不会清掉它们。Recall把pending改成recalled并清掉pushed_conn,窗口空出格子,但只flushRevokes,没有WakePush接收方。确认路径会唤醒,撤回不会。窗口里若只占着被撤回的那几条,后面排队的消息不再下发。位置
internal/app/message/push.go:dispatchDueBatch只唤醒 pending 接收方;too_large分支只唤醒发送方internal/app/message/ack.go:Recall成功后没有WakePushinternal/app/message/submit.go的WakePush(senderID),Ack里对接收方的WakePush方案
dispatchDueBatch在本条已分发时,除 pending 接收方外,始终WakePush发送方(有回执或终态都要)。too_large拒绝后,若本轮没有成功占满窗口,对当前接收方再WakePush一次,让 worker 继续取后面的 pending。不要在同一次PushPending里递归把整表扫完。Recall对每个被改成recalled的接收方WakePush。已推送的撤回通知仍走现有flushRevokes。约束
只改
internal/app/message/与对应测试。不改PublishDown签名。测试监听:0,数据放临时目录。偏差写入docs/DEVIATIONS.md新节### 复审修复 R3-01。不要合feat/fix-3-downlink-deadlock。????????? (#65)?
feat/fix-r3-65-wakeb79bba391149877fc4fef9d374eb4bd0c192b5e3dispatchDueBatch?????? WakePush ???;too_large??????? WakePush ???;Recall? recalled ??? WakePush(????? flushRevokes)go test ./internal/app/message/??;task check??origin/feat/fix-r3-65-wake,?? main已合入 main:
443a6c6(#65);当前 origin/main HEAD2d1dfd7。