Optimize TeamsUnread (#19507)
The GetTeamsUnreadForUser call would be called for every team switch. In CRT mode, it would make a separate store call for every team, which would run the 3 aggregate SQL queries in GetThreadsForUser. This is suboptimal because the complexity is linearly proportional to the number of teams. We make the following optimizations: 1. Change the query to a single one which aggregates all teams. 2. The query originally used just 2 out of the 3 queries, so one query was fully redundant. We remove that query in the new one. 3. Further analysis was done whether it makes sense to run the 2 queries synchronously or not. The load-tests didn't show any degradation in running them concurrently, so we keep the same behavior. ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
9640962428
Коммит
6898b3d70f
24
app/team.go
24
app/team.go
@@ -1565,11 +1565,13 @@ func (a *App) GetTeamsUnreadForUser(excludeTeamId string, userID string, include
|
||||
return tu
|
||||
}
|
||||
|
||||
teamIDs := make([]string, 0, len(data))
|
||||
for i := range data {
|
||||
id := data[i].TeamId
|
||||
if mu, ok := membersMap[id]; ok {
|
||||
membersMap[id] = unreads(data[i], mu)
|
||||
} else {
|
||||
teamIDs = append(teamIDs, id)
|
||||
membersMap[id] = unreads(data[i], &model.TeamUnread{
|
||||
MsgCount: 0,
|
||||
MentionCount: 0,
|
||||
@@ -1584,18 +1586,22 @@ func (a *App) GetTeamsUnreadForUser(excludeTeamId string, userID string, include
|
||||
|
||||
includeCollapsedThreads = includeCollapsedThreads && *a.Config().ServiceSettings.CollapsedThreads != model.CollapsedThreadsDisabled
|
||||
|
||||
for _, member := range membersMap {
|
||||
if includeCollapsedThreads {
|
||||
data, err := a.Srv().Store.Thread().GetThreadsForUser(userID, member.TeamId, model.GetUserThreadsOpts{TotalsOnly: true, TeamOnly: true})
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("GetTeamsUnreadForUser", "app.team.get_unread.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
member.ThreadCount = data.TotalUnreadThreads
|
||||
member.ThreadMentionCount = data.TotalUnreadMentions
|
||||
if includeCollapsedThreads {
|
||||
teamUnreads, err := a.Srv().Store.Thread().GetTeamsUnreadForUser(userID, teamIDs)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("GetTeamsUnreadForUser", "app.team.get_unread.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||
}
|
||||
for teamID, member := range membersMap {
|
||||
if _, ok := teamUnreads[teamID]; ok {
|
||||
member.ThreadCount = teamUnreads[teamID].ThreadCount
|
||||
member.ThreadMentionCount = teamUnreads[teamID].ThreadMentionCount
|
||||
}
|
||||
}
|
||||
members = append(members, member)
|
||||
}
|
||||
|
||||
for _, member := range membersMap {
|
||||
members = append(members, member)
|
||||
}
|
||||
return members, nil
|
||||
}
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user