mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-10-16 22:30:43 +00:00
fix(ingest): let paho auto-ack MQTT deliveries
Sessions are clean and client IDs random, so deferring acks never bought redelivery; it only capped delivery at the broker's inflight window and pushed backlog into the broker queue, where drops are silent.
This commit is contained in:
@@ -249,7 +249,6 @@ func (w *Worker) Start(ctx context.Context) {
|
||||
}
|
||||
queue := newMessageQueue(8, 2048, 32<<20, func(ctx context.Context, msg mqtt.Message) {
|
||||
w.handleMessageContext(ctx, msg)
|
||||
msg.Ack()
|
||||
})
|
||||
reportDrops := func() {
|
||||
if n := queue.takeDropped(); n > 0 {
|
||||
@@ -268,13 +267,13 @@ func (w *Worker) Start(ctx context.Context) {
|
||||
|
||||
// Isolate workers across deployments; Paho reuses this ID on reconnect.
|
||||
// Keep it alphanumeric and within MQTT 3.1's 23-character client ID limit.
|
||||
// Auto-ack: sessions are clean, so deferring acks only throttled the broker's inflight window.
|
||||
opts := mqtt.NewClientOptions().
|
||||
AddBroker(w.cfg.URL).
|
||||
SetClientID(rand.Text()[:23]).
|
||||
SetUsername(w.cfg.Username).
|
||||
SetPassword(w.cfg.Password).
|
||||
SetAutoReconnect(true).
|
||||
SetAutoAckDisabled(true).
|
||||
SetMaxReconnectInterval(30 * time.Second).
|
||||
SetKeepAlive(30 * time.Second).
|
||||
SetPingTimeout(10 * time.Second).
|
||||
@@ -335,10 +334,7 @@ func (w *Worker) subscribe(client mqtt.Client, queue *messageQueue) {
|
||||
// meshcore/{IATA}/{pubkey}/status
|
||||
// We do NOT subscribe to /internal (Role 2 access).
|
||||
tok := client.Subscribe("meshcore/#", 1, func(_ mqtt.Client, msg mqtt.Message) {
|
||||
if !queue.enqueue(msg) {
|
||||
// Counted drops must release the broker's inflight slot.
|
||||
msg.Ack()
|
||||
}
|
||||
queue.enqueue(msg)
|
||||
})
|
||||
if tok.Wait() && tok.Error() != nil {
|
||||
w.log.Error("subscribe error", "error", tok.Error())
|
||||
|
||||
@@ -141,24 +141,13 @@ type completedSubscribe struct{ mqtt.Token }
|
||||
func (completedSubscribe) Wait() bool { return true }
|
||||
func (completedSubscribe) Error() error { return nil }
|
||||
|
||||
type ackMessage struct {
|
||||
mqtt.Message
|
||||
acked bool
|
||||
}
|
||||
|
||||
func (m *ackMessage) Ack() { m.acked = true }
|
||||
|
||||
func TestSubscribeReleasesRejectedMessage(t *testing.T) {
|
||||
func TestSubscribeCountsRejectedMessage(t *testing.T) {
|
||||
w, _ := newTestWorker()
|
||||
q := newMessageQueue(1, 1, 1, func(context.Context, mqtt.Message) { t.Error("rejected message processed") })
|
||||
defer q.close(context.Background())
|
||||
client := &subscribeCapture{}
|
||||
w.subscribe(client, q)
|
||||
m := &ackMessage{Message: queueMessage("aa", "packets", 0)}
|
||||
client.callback(client, m)
|
||||
if !m.acked {
|
||||
t.Fatal("rejected message still occupies the broker inflight window")
|
||||
}
|
||||
client.callback(client, queueMessage("aa", "packets", 0))
|
||||
if q.takeDropped() != 1 {
|
||||
t.Fatal("rejected message was not counted")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user