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 af90c2783a9..afe23d6622c 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 4797fe8e6d3..83965feed2b 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 aac0046999e..4fd9c862762 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 7d41c0a0fdc..7e58b1c72dc 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"