mirror of
https://github.com/pgsty/minio.git
synced 2026-08-10 00:03:29 +03:00
Persist offline mqtt events in the queueDir and replay (#7037)
This commit is contained in:
committed by
Harshavardhana
parent
8757c963ba
commit
6571641735
+42
-4
@@ -17,6 +17,7 @@ package mqtt
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// MId is 16 bit message id as specified by the MQTT spec.
|
||||
@@ -26,7 +27,7 @@ type MId uint16
|
||||
|
||||
type messageIds struct {
|
||||
sync.RWMutex
|
||||
index map[uint16]Token
|
||||
index map[uint16]tokenCompletor
|
||||
}
|
||||
|
||||
const (
|
||||
@@ -44,11 +45,14 @@ func (mids *messageIds) cleanUp() {
|
||||
t.err = fmt.Errorf("Connection lost before Subscribe completed")
|
||||
case *UnsubscribeToken:
|
||||
t.err = fmt.Errorf("Connection lost before Unsubscribe completed")
|
||||
case nil:
|
||||
continue
|
||||
}
|
||||
token.flowComplete()
|
||||
}
|
||||
mids.index = make(map[uint16]Token)
|
||||
mids.index = make(map[uint16]tokenCompletor)
|
||||
mids.Unlock()
|
||||
DEBUG.Println(MID, "cleaned up")
|
||||
}
|
||||
|
||||
func (mids *messageIds) freeID(id uint16) {
|
||||
@@ -57,7 +61,19 @@ func (mids *messageIds) freeID(id uint16) {
|
||||
mids.Unlock()
|
||||
}
|
||||
|
||||
func (mids *messageIds) getID(t Token) uint16 {
|
||||
func (mids *messageIds) claimID(token tokenCompletor, id uint16) {
|
||||
mids.Lock()
|
||||
defer mids.Unlock()
|
||||
if _, ok := mids.index[id]; !ok {
|
||||
mids.index[id] = token
|
||||
} else {
|
||||
old := mids.index[id]
|
||||
old.flowComplete()
|
||||
mids.index[id] = token
|
||||
}
|
||||
}
|
||||
|
||||
func (mids *messageIds) getID(t tokenCompletor) uint16 {
|
||||
mids.Lock()
|
||||
defer mids.Unlock()
|
||||
for i := midMin; i < midMax; i++ {
|
||||
@@ -69,11 +85,33 @@ func (mids *messageIds) getID(t Token) uint16 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (mids *messageIds) getToken(id uint16) Token {
|
||||
func (mids *messageIds) getToken(id uint16) tokenCompletor {
|
||||
mids.RLock()
|
||||
defer mids.RUnlock()
|
||||
if token, ok := mids.index[id]; ok {
|
||||
return token
|
||||
}
|
||||
return &DummyToken{id: id}
|
||||
}
|
||||
|
||||
type DummyToken struct {
|
||||
id uint16
|
||||
}
|
||||
|
||||
func (d *DummyToken) Wait() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (d *DummyToken) WaitTimeout(t time.Duration) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (d *DummyToken) flowComplete() {
|
||||
ERROR.Printf("A lookup for token %d returned nil\n", d.id)
|
||||
}
|
||||
|
||||
func (d *DummyToken) Error() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *DummyToken) setError(e error) {}
|
||||
|
||||
Reference in New Issue
Block a user