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 <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
d9e47522a0
Коммит
b9debc75a0
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
Ссылка в новой задаче
Block a user