Skip to content

Commit db7be0c

Browse files
committed
Revert changes for messageids back to map
Given the memory increase from using a preallocated array and yet we still have the same problem of looking up messageids that we don't have I'm reverting back to the map for messageIDs but leaving in the dummy token in the case that we do a lookup and get nothing. resolve#124
1 parent 0c8d93a commit db7be0c

5 files changed

+27
-23
lines changed

client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func NewClient(o *ClientOptions) Client {
104104
}
105105
c.persist = c.options.Store
106106
c.status = disconnected
107-
c.messageIds = messageIds{index: [65535]Token{}}
107+
c.messageIds = messageIds{index: make(map[uint16]Token)}
108108
c.msgRouter, c.stopRouter = newRouter()
109109
c.msgRouter.setDefaultHandler(c.options.DefaultPublishHandler)
110110
if !c.options.AutoReconnect {

fvt_client_test.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -1030,10 +1030,8 @@ func Test_cleanUpMids(t *testing.T) {
10301030
t.Fail()
10311031
}
10321032

1033-
for i, token := range c.(*client).messageIds.index {
1034-
if token != nil {
1035-
t.Fatalf("Should have cleaned up messageIDs, slot %d still has token", i)
1036-
}
1033+
if len(c.(*client).messageIds.index) > 0 {
1034+
t.Fatalf("Should have cleaned up messageIDs, have %d left", len(c.(*client).messageIds.index))
10371035
}
10381036
if token.Error() == nil {
10391037
t.Fatal("token should have received an error on connection loss")

messageids.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ type MId uint16
2727

2828
type messageIds struct {
2929
sync.RWMutex
30-
index [65535]Token
30+
index map[uint16]Token
3131
}
3232

33+
const (
34+
midMin uint16 = 1
35+
midMax uint16 = 65535
36+
)
37+
3338
func (mids *messageIds) cleanUp() {
3439
mids.Lock()
3540
for _, token := range mids.index {
@@ -45,23 +50,23 @@ func (mids *messageIds) cleanUp() {
4550
}
4651
token.flowComplete()
4752
}
48-
mids.index = [65535]Token{}
53+
mids.index = make(map[uint16]Token)
4954
mids.Unlock()
5055
}
5156

5257
func (mids *messageIds) freeID(id uint16) {
5358
mids.Lock()
54-
mids.index[id-1] = nil
59+
delete(mids.index, id)
5560
mids.Unlock()
5661
}
5762

5863
func (mids *messageIds) getID(t Token) uint16 {
5964
mids.Lock()
6065
defer mids.Unlock()
61-
for i, s := range mids.index {
62-
if s == nil {
66+
for i := midMin; i < midMax; i++ {
67+
if _, ok := mids.index[i]; !ok {
6368
mids.index[i] = t
64-
return uint16(i + 1)
69+
return i
6570
}
6671
}
6772
return 0
@@ -70,11 +75,10 @@ func (mids *messageIds) getID(t Token) uint16 {
7075
func (mids *messageIds) getToken(id uint16) Token {
7176
mids.RLock()
7277
defer mids.RUnlock()
73-
t := mids.index[id-1]
74-
if t == nil {
75-
t = &DummyToken{id: id}
78+
if token, ok := mids.index[id]; ok {
79+
return token
7680
}
77-
return t
81+
return &DummyToken{id: id}
7882
}
7983

8084
type DummyToken struct {

net.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,19 @@ func alllogic(c *client) {
231231
c.pingResp.Broadcast()
232232
case *packets.SubackPacket:
233233
DEBUG.Println(NET, "received suback, id:", m.MessageID)
234-
token := c.getToken(m.MessageID).(*SubscribeToken)
235-
DEBUG.Println(NET, "granted qoss", m.ReturnCodes)
236-
for i, qos := range m.ReturnCodes {
237-
token.subResult[token.subs[i]] = qos
234+
token := c.getToken(m.MessageID)
235+
switch t := token.(type) {
236+
case *SubscribeToken:
237+
DEBUG.Println(NET, "granted qoss", m.ReturnCodes)
238+
for i, qos := range m.ReturnCodes {
239+
t.subResult[t.subs[i]] = qos
240+
}
238241
}
239242
token.flowComplete()
240243
c.freeID(m.MessageID)
241244
case *packets.UnsubackPacket:
242245
DEBUG.Println(NET, "received unsuback, id:", m.MessageID)
243-
token := c.getToken(m.MessageID).(*UnsubscribeToken)
244-
token.flowComplete()
246+
c.getToken(m.MessageID).flowComplete()
245247
c.freeID(m.MessageID)
246248
case *packets.PublishPacket:
247249
DEBUG.Println(NET, "received publish, msgId:", m.MessageID)

unit_messageids_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
)
2121

2222
func Test_getID(t *testing.T) {
23-
mids := &messageIds{index: [65535]Token{}}
23+
mids := &messageIds{index: make(map[uint16]Token)}
2424

2525
i1 := mids.getID(&DummyToken{})
2626

@@ -43,7 +43,7 @@ func Test_getID(t *testing.T) {
4343
}
4444

4545
func Test_freeID(t *testing.T) {
46-
mids := &messageIds{index: [65535]Token{}}
46+
mids := &messageIds{index: make(map[uint16]Token)}
4747

4848
i1 := mids.getID(&DummyToken{})
4949
mids.freeID(i1)

0 commit comments

Comments
 (0)