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:
werben
2023-12-13 07:45:56 +08:00
committed by GitHub
parent dc4eecdfb7
commit 624dde0986
2 changed files with 45 additions and 2 deletions

View File

@@ -1553,7 +1553,15 @@ func (s *Server) loadClients(v []storage.Client) {
MaximumPacketSize: c.Properties.MaximumPacketSize, MaximumPacketSize: c.Properties.MaximumPacketSize,
} }
cl.Properties.Will = Will(c.Will) 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)
}
} }
} }

View File

@@ -3128,15 +3128,50 @@ func TestServerLoadClients(t *testing.T) {
{ID: "mochi"}, {ID: "mochi"},
{ID: "zen"}, {ID: "zen"},
{ID: "mochi-co"}, {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() s := newServer()
require.Equal(t, 0, s.Clients.Len()) require.Equal(t, 0, s.Clients.Len())
s.loadClients(v) s.loadClients(v)
require.Equal(t, 3, s.Clients.Len()) require.Equal(t, 6, s.Clients.Len())
cl, ok := s.Clients.Get("mochi") cl, ok := s.Clients.Get("mochi")
require.True(t, ok) require.True(t, ok)
require.Equal(t, "mochi", cl.ID) 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) { func TestServerLoadSubscriptions(t *testing.T) {