From b9debc75a069ab0dc8cff2ddecc700ab41c417d2 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Wed, 11 Sep 2024 20:42:49 +0530 Subject: [PATCH] MM-60478: Do not invalidate session cache on user added to channel (#28142) PR: https://github.com/mattermost/mattermost/pull/27204 fixed the issue where `invalidateWebConnSessionCacheForUser` was not broadcasted across the cluster. However, we became too conservative and started to invalidate the session cache as well. But the session cache only contains the session details for the user and the team membership. There is no channel membership related info. Therefore, we avoid that and improve performance as well. https://mattermost.atlassian.net/browse/MM-60478 ```release-note NONE ``` Co-authored-by: Mattermost Build --- .../channels/app/platform/cluster_handlers.go | 10 +++---- server/channels/app/platform/web_hub.go | 27 ++++++++++--------- server/enterprise/metrics/metrics.go | 2 +- server/public/model/cluster_message.go | 2 +- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/server/channels/app/platform/cluster_handlers.go b/server/channels/app/platform/cluster_handlers.go index af90c2783a..afe23d6622 100644 --- a/server/channels/app/platform/cluster_handlers.go +++ b/server/channels/app/platform/cluster_handlers.go @@ -17,7 +17,7 @@ func (ps *PlatformService) RegisterClusterHandlers() { ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventPublish, ps.ClusterPublishHandler) ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventUpdateStatus, ps.ClusterUpdateStatusHandler) ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventInvalidateAllCaches, ps.ClusterInvalidateAllCachesHandler) - ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventInvalidateCacheForUserTeams, ps.clusterInvalidateCacheForUserTeamsHandler) + ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventInvalidateWebConnCacheForUser, ps.clusterInvalidateWebConnSessionCacheForUserHandler) ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventBusyStateChanged, ps.clusterBusyStateChgHandler) ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventClearSessionCacheForUser, ps.clusterClearSessionCacheForUserHandler) ps.clusterIFace.RegisterClusterMessageHandler(model.ClusterEventClearSessionCacheForAllUsers, ps.clusterClearSessionCacheForAllUsersHandler) @@ -67,13 +67,13 @@ func (ps *PlatformService) ClusterInvalidateAllCachesHandler(msg *model.ClusterM ps.InvalidateAllCachesSkipSend() } -func (ps *PlatformService) clusterInvalidateCacheForUserTeamsHandler(msg *model.ClusterMessage) { - ps.invalidateWebConnSessionCacheForUser(string(msg.Data)) +func (ps *PlatformService) clusterInvalidateWebConnSessionCacheForUserHandler(msg *model.ClusterMessage) { + ps.invalidateWebConnSessionCacheForUserSkipClusterSend(string(msg.Data)) } func (ps *PlatformService) ClearSessionCacheForUserSkipClusterSend(userID string) { ps.ClearUserSessionCacheLocal(userID) - ps.invalidateWebConnSessionCacheForUser(userID) + ps.invalidateWebConnSessionCacheForUserSkipClusterSend(userID) } func (ps *PlatformService) ClearSessionCacheForAllUsersSkipClusterSend() { @@ -103,7 +103,7 @@ func (ps *PlatformService) clusterBusyStateChgHandler(msg *model.ClusterMessage) } } -func (ps *PlatformService) invalidateWebConnSessionCacheForUser(userID string) { +func (ps *PlatformService) invalidateWebConnSessionCacheForUserSkipClusterSend(userID string) { hub := ps.GetHubForUserId(userID) if hub != nil { hub.InvalidateUser(userID) diff --git a/server/channels/app/platform/web_hub.go b/server/channels/app/platform/web_hub.go index 4797fe8e6d..83965feed2 100644 --- a/server/channels/app/platform/web_hub.go +++ b/server/channels/app/platform/web_hub.go @@ -200,20 +200,11 @@ func (ps *PlatformService) InvalidateCacheForUser(userID string) { ps.Store.User().InvalidateProfileCacheForUser(userID) } -func (ps *PlatformService) InvalidateChannelCacheForUser(userID string) { - ps.Store.Channel().InvalidateAllChannelMembersForUser(userID) - ps.ClearUserSessionCache(userID) - - ps.Store.User().InvalidateProfilesInChannelCacheByUser(userID) -} - -func (ps *PlatformService) InvalidateCacheForUserTeams(userID string) { - ps.invalidateWebConnSessionCacheForUser(userID) - ps.Store.Team().InvalidateAllTeamIdsForUser(userID) - +func (ps *PlatformService) invalidateWebConnSessionCacheForUser(userID string) { + ps.invalidateWebConnSessionCacheForUserSkipClusterSend(userID) if ps.clusterIFace != nil { msg := &model.ClusterMessage{ - Event: model.ClusterEventInvalidateCacheForUserTeams, + Event: model.ClusterEventInvalidateWebConnCacheForUser, SendType: model.ClusterSendBestEffort, Data: []byte(userID), } @@ -221,6 +212,18 @@ func (ps *PlatformService) InvalidateCacheForUserTeams(userID string) { } } +func (ps *PlatformService) InvalidateChannelCacheForUser(userID string) { + ps.Store.Channel().InvalidateAllChannelMembersForUser(userID) + ps.invalidateWebConnSessionCacheForUser(userID) + ps.Store.User().InvalidateProfilesInChannelCacheByUser(userID) +} + +func (ps *PlatformService) InvalidateCacheForUserTeams(userID string) { + ps.invalidateWebConnSessionCacheForUser(userID) + // This method has its own cluster broadcast hidden inside localcachelayer. + ps.Store.Team().InvalidateAllTeamIdsForUser(userID) +} + // UpdateWebConnUserActivity sets the LastUserActivityAt of the hub for the given session. func (ps *PlatformService) UpdateWebConnUserActivity(session model.Session, activityAt int64) { hub := ps.GetHubForUserId(session.UserId) diff --git a/server/enterprise/metrics/metrics.go b/server/enterprise/metrics/metrics.go index aac0046999..4fd9c86276 100644 --- a/server/enterprise/metrics/metrics.go +++ b/server/enterprise/metrics/metrics.go @@ -467,7 +467,7 @@ func New(ps *platform.PlatformService, driver, dataSource string) *MetricsInterf model.ClusterEventInvalidateCacheForChannel, model.ClusterEventInvalidateCacheForChannelGuestCount, model.ClusterEventInvalidateCacheForUser, - model.ClusterEventInvalidateCacheForUserTeams, + model.ClusterEventInvalidateWebConnCacheForUser, model.ClusterEventClearSessionCacheForUser, model.ClusterEventInvalidateCacheForRoles, model.ClusterEventInvalidateCacheForRolePermissions, diff --git a/server/public/model/cluster_message.go b/server/public/model/cluster_message.go index 7d41c0a0fd..7e58b1c72d 100644 --- a/server/public/model/cluster_message.go +++ b/server/public/model/cluster_message.go @@ -16,7 +16,7 @@ const ( ClusterEventInvalidateCacheForChannel ClusterEvent = "inv_channel" ClusterEventInvalidateCacheForChannelGuestCount ClusterEvent = "inv_channel_guest_count" ClusterEventInvalidateCacheForUser ClusterEvent = "inv_user" - ClusterEventInvalidateCacheForUserTeams ClusterEvent = "inv_user_teams" + ClusterEventInvalidateWebConnCacheForUser ClusterEvent = "inv_user_teams" ClusterEventClearSessionCacheForUser ClusterEvent = "clear_session_user" ClusterEventInvalidateCacheForRoles ClusterEvent = "inv_roles" ClusterEventInvalidateCacheForRolePermissions ClusterEvent = "inv_role_permissions"