From bef997e1aa17eafd5b3ff31879c0d67963d8b06f Mon Sep 17 00:00:00 2001 From: Ergou <1578701237@qq.com> Date: Thu, 25 Sep 2025 19:13:59 +0800 Subject: [PATCH 1/2] fix oldClient object memory leak --- internal/msggateway/ws_server.go | 37 ++++++++++---------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/internal/msggateway/ws_server.go b/internal/msggateway/ws_server.go index bc7a2fa5f..f8399627e 100644 --- a/internal/msggateway/ws_server.go +++ b/internal/msggateway/ws_server.go @@ -315,10 +315,16 @@ func (ws *WsServer) KickUserConn(client *Client) error { } func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Client, newClient *Client) { - kickTokenFunc := func(kickClients []*Client) { + kickTokenFunc := func(kickClients []*Client, newClient *Client) { var kickTokens []string ws.clients.DeleteClients(newClient.UserID, kickClients) for _, c := range kickClients { + // If reconnecting: When multiple msgGateway instances are deployed, a client may disconnect from instance A and reconnect to instance B. + // During this process, instance A might still be executing, resulting in two clients with the same token existing simultaneously. + // This situation needs to be filtered to prevent duplicate clients. + if c.token == newClient.token { + continue + } kickTokens = append(kickTokens, c.token) err := c.KickOnlineMessage() if err != nil { @@ -334,27 +340,6 @@ func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Clien } } - // If reconnect: When multiple msgGateway instances are deployed, a client may disconnect from instance A and reconnect to instance B. - // During this process, instance A might still be executing, resulting in two clients with the same token existing simultaneously. - // This situation needs to be filtered to prevent duplicate clients. - checkSameTokenFunc := func(oldClients []*Client) []*Client { - var clientsNeedToKick []*Client - - for _, c := range oldClients { - if c.token == newClient.token { - log.ZDebug(newClient.ctx, "token is same, not kick", - "userID", newClient.UserID, - "platformID", newClient.PlatformID, - "token", newClient.token) - continue - } - - clientsNeedToKick = append(clientsNeedToKick, c) - } - - return clientsNeedToKick - } - switch ws.msgGatewayConfig.Share.MultiLogin.Policy { case constant.DefalutNotKick: case constant.PCAndOther: @@ -377,10 +362,11 @@ func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Clien return } - oldClients = checkSameTokenFunc(oldClients) - ws.clients.DeleteClients(newClient.UserID, oldClients) for _, c := range oldClients { + if c.token == newClient.token { + continue + } err := c.KickOnlineMessage() if err != nil { log.ZWarn(c.ctx, "KickOnlineMessage", err) @@ -414,9 +400,8 @@ func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Clien } } } - kickClients = checkSameTokenFunc(kickClients) - kickTokenFunc(kickClients) + kickTokenFunc(kickClients, newClient) } } From 797cc84be7a33abf85f0eaba808a1ece16c63796 Mon Sep 17 00:00:00 2001 From: Ergou <1578701237@qq.com> Date: Fri, 10 Oct 2025 15:57:25 +0800 Subject: [PATCH 2/2] add log when oldclient token is same to newClient token is ture. --- internal/msggateway/ws_server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/msggateway/ws_server.go b/internal/msggateway/ws_server.go index f8399627e..08a4193dd 100644 --- a/internal/msggateway/ws_server.go +++ b/internal/msggateway/ws_server.go @@ -323,6 +323,7 @@ func (ws *WsServer) multiTerminalLoginChecker(clientOK bool, oldClients []*Clien // During this process, instance A might still be executing, resulting in two clients with the same token existing simultaneously. // This situation needs to be filtered to prevent duplicate clients. if c.token == newClient.token { + log.ZDebug(newClient.ctx, "token is same, not kick", "userID", newClient.UserID, "platformID", newClient.PlatformID, "token", newClient.token) continue } kickTokens = append(kickTokens, c.token)