mirror of
https://github.com/mochi-mqtt/server.git
synced 2025-09-26 20:21:12 +08:00
Handle expired clients in server.loadClients(). (#341)
* Handle expired clients in server.loadClients(). * No need to call s.Clients.Delete(). --------- Co-authored-by: JB <28275108+mochi-co@users.noreply.github.com>
This commit is contained in:
10
server.go
10
server.go
@@ -1553,7 +1553,15 @@ func (s *Server) loadClients(v []storage.Client) {
|
||||
MaximumPacketSize: c.Properties.MaximumPacketSize,
|
||||
}
|
||||
cl.Properties.Will = Will(c.Will)
|
||||
s.Clients.Add(cl)
|
||||
|
||||
expire := (cl.Properties.ProtocolVersion == 5 && cl.Properties.Props.SessionExpiryInterval == 0) || (cl.Properties.ProtocolVersion < 5 && cl.Properties.Clean)
|
||||
s.hooks.OnDisconnect(cl, packets.ErrServerShuttingDown, expire)
|
||||
if expire {
|
||||
cl.ClearInflights()
|
||||
s.UnsubscribeClient(cl)
|
||||
} else {
|
||||
s.Clients.Add(cl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -3128,15 +3128,50 @@ func TestServerLoadClients(t *testing.T) {
|
||||
{ID: "mochi"},
|
||||
{ID: "zen"},
|
||||
{ID: "mochi-co"},
|
||||
{ID: "v3-clean", ProtocolVersion: 4, Clean: true},
|
||||
{ID: "v3-not-clean", ProtocolVersion: 4, Clean: false},
|
||||
{
|
||||
ID: "v5-clean",
|
||||
ProtocolVersion: 5,
|
||||
Clean: true,
|
||||
Properties: storage.ClientProperties{
|
||||
SessionExpiryInterval: 10,
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "v5-expire-interval-0",
|
||||
ProtocolVersion: 5,
|
||||
Properties: storage.ClientProperties{
|
||||
SessionExpiryInterval: 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "v5-expire-interval-not-0",
|
||||
ProtocolVersion: 5,
|
||||
Properties: storage.ClientProperties{
|
||||
SessionExpiryInterval: 10,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
s := newServer()
|
||||
require.Equal(t, 0, s.Clients.Len())
|
||||
s.loadClients(v)
|
||||
require.Equal(t, 3, s.Clients.Len())
|
||||
require.Equal(t, 6, s.Clients.Len())
|
||||
cl, ok := s.Clients.Get("mochi")
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "mochi", cl.ID)
|
||||
|
||||
_, ok = s.Clients.Get("v3-clean")
|
||||
require.False(t, ok)
|
||||
_, ok = s.Clients.Get("v3-not-clean")
|
||||
require.True(t, ok)
|
||||
_, ok = s.Clients.Get("v5-clean")
|
||||
require.True(t, ok)
|
||||
_, ok = s.Clients.Get("v5-expire-interval-0")
|
||||
require.False(t, ok)
|
||||
_, ok = s.Clients.Get("v5-expire-interval-not-0")
|
||||
require.True(t, ok)
|
||||
}
|
||||
|
||||
func TestServerLoadSubscriptions(t *testing.T) {
|
||||
|
Reference in New Issue
Block a user