fix: 作废投递走统一终态函数并写回执收尾
This commit is contained in:
@@ -78,6 +78,10 @@ WHERE d.state = 'pending' AND d.pushed_conn IS NULL
|
||||
}
|
||||
}
|
||||
|
||||
if err := finalizeStuckDispatchedTx(tx, nowMs, a.lim.RecordRetentionDays); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if a.lim.RecordRetentionDays > 0 {
|
||||
cutoff := nowMs - int64(a.lim.RecordRetentionDays)*24*3600*1000
|
||||
if _, err := tx.Exec(`
|
||||
@@ -120,3 +124,36 @@ DELETE FROM send_keys WHERE rowid IN (
|
||||
a.flushRevokes(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
// finalizeStuckDispatchedTx 收尾「dispatched 且已无 pending 投递」的消息(C-04 兜底,修复已卡住的数据)。
|
||||
func finalizeStuckDispatchedTx(tx *sql.Tx, nowMs int64, recordDays int) error {
|
||||
rows, err := tx.Query(`
|
||||
SELECT seq FROM messages
|
||||
WHERE state = ?
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM deliveries d WHERE d.seq = messages.seq AND d.state = 'pending'
|
||||
)
|
||||
LIMIT 500`, StateDispatched)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var seqs []int64
|
||||
for rows.Next() {
|
||||
var seq int64
|
||||
if err := rows.Scan(&seq); err != nil {
|
||||
_ = rows.Close()
|
||||
return err
|
||||
}
|
||||
seqs = append(seqs, seq)
|
||||
}
|
||||
_ = rows.Close()
|
||||
if err := rows.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, seq := range seqs {
|
||||
if err := TryFinalizeTx(tx, seq, nowMs, recordDays); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user