Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MM-45993: Return errors during sending websocket messages #20760

Merged
merged 1 commit into from
Aug 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 7 additions & 7 deletions app/app_iface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 13 additions & 10 deletions app/channel.go
Expand Up @@ -661,7 +661,7 @@ func (a *App) UpdateChannel(c request.CTX, channel *model.Channel) (*model.Chann
messageWs := model.NewWebSocketEvent(model.WebsocketEventChannelUpdated, "", channel.Id, "", nil)
channelJSON, jsonErr := json.Marshal(channel)
if jsonErr != nil {
c.Logger().Warn("Failed to encode channel to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("UpdateChannel", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
messageWs.Add("channel", string(channelJSON))
a.Publish(messageWs)
Expand Down Expand Up @@ -1019,7 +1019,9 @@ func (a *App) PatchChannelModerationsForChannel(c request.CTX, channel *model.Ch
if err != nil {
return nil, err
}
a.sendUpdatedRoleEvent(adminRole)
if appErr := a.sendUpdatedRoleEvent(adminRole); appErr != nil {
return nil, appErr
}

message := model.NewWebSocketEvent(model.WebsocketEventChannelSchemeUpdated, "", channel.Id, "", nil)
a.Publish(message)
Expand Down Expand Up @@ -1285,7 +1287,7 @@ func (a *App) UpdateChannelMemberNotifyProps(c request.CTX, data map[string]stri
evt := model.NewWebSocketEvent(model.WebsocketEventChannelMemberUpdated, "", "", member.UserId, nil)
memberJSON, jsonErr := json.Marshal(member)
if jsonErr != nil {
c.Logger().Warn("Failed to encode channel member to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("UpdateChannelMemberNotifyProps", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
evt.Add("channelMember", string(memberJSON))
a.Publish(evt)
Expand Down Expand Up @@ -1314,7 +1316,7 @@ func (a *App) updateChannelMember(c request.CTX, member *model.ChannelMember) (*
evt := model.NewWebSocketEvent(model.WebsocketEventChannelMemberUpdated, "", "", member.UserId, nil)
memberJSON, jsonErr := json.Marshal(member)
if jsonErr != nil {
c.Logger().Warn("Failed to encode channel member to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("updateChannelMember", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
evt.Add("channelMember", string(memberJSON))
a.Publish(evt)
Expand Down Expand Up @@ -1587,7 +1589,7 @@ func (a *App) AddChannelMember(c request.CTX, userID string, channel *model.Chan

if opts.UserRequestorID == "" || userID == opts.UserRequestorID {
if err := a.postJoinChannelMessage(c, user, channel); err != nil {
mlog.Error("Failed to post join channel message", mlog.Err(err))
return nil, err
}
} else {
a.Srv().Go(func() {
Expand Down Expand Up @@ -2701,7 +2703,7 @@ func (a *App) markChannelAsUnreadFromPostCRTUnsupported(c request.CTX, postID st
if a.IsCRTEnabledForUser(c, userID) {
payload, jsonErr := json.Marshal(thread)
if jsonErr != nil {
c.Logger().Warn("Failed to encode thread to JSON")
return nil, model.NewAppError("MarkChannelAsUnreadFromPost", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
message := model.NewWebSocketEvent(model.WebsocketEventThreadUpdated, channel.TeamId, "", userID, nil)
message.Add("thread", string(payload))
Expand Down Expand Up @@ -3268,7 +3270,7 @@ func (a *App) setChannelsMuted(c request.CTX, channelIDs []string, userID string

memberJSON, jsonErr := json.Marshal(member)
if jsonErr != nil {
c.Logger().Warn("Failed to encode channel member to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("setChannelsMuted", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}

evt.Add("channelMember", string(memberJSON))
Expand Down Expand Up @@ -3369,21 +3371,22 @@ func (a *App) forEachChannelMember(c request.CTX, channelID string, f func(model
return nil
}

func (a *App) ClearChannelMembersCache(c request.CTX, channelID string) {
func (a *App) ClearChannelMembersCache(c request.CTX, channelID string) error {
clearSessionCache := func(channelMember model.ChannelMember) error {
a.ClearSessionCacheForUser(channelMember.UserId)
message := model.NewWebSocketEvent(model.WebsocketEventChannelMemberUpdated, "", "", channelMember.UserId, nil)
memberJSON, jsonErr := json.Marshal(channelMember)
if jsonErr != nil {
c.Logger().Warn("Failed to encode channel member to JSON", mlog.Err(jsonErr))
return jsonErr
}
message.Add("channelMember", string(memberJSON))
a.Publish(message)
return nil
}
if err := a.forEachChannelMember(c, channelID, clearSessionCache); err != nil {
c.Logger().Warn("error clearing cache for channel members", mlog.String("channel_id", channelID))
return fmt.Errorf("error clearing cache for channel members: channel_id: %s, error: %v", channelID, err)
}
return nil
}

func (a *App) GetMemberCountsByGroup(ctx context.Context, channelID string, includeTimezones bool) ([]*model.ChannelMemberCountByGroup, *model.AppError) {
Expand Down
2 changes: 1 addition & 1 deletion app/channel_category.go
Expand Up @@ -151,7 +151,7 @@ func (a *App) UpdateSidebarCategories(c request.CTX, userID, teamID string, cate

updatedCategoriesJSON, jsonErr := json.Marshal(updatedCategories)
if jsonErr != nil {
c.Logger().Warn("Failed to encode original categories to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("UpdateSidebarCategories", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}

message.Add("updatedCategories", string(updatedCategoriesJSON))
Expand Down
2 changes: 1 addition & 1 deletion app/channel_test.go
Expand Up @@ -2065,7 +2065,7 @@ func TestClearChannelMembersCache(t *testing.T) {
mockStore.On("Channel").Return(&mockChannelStore)
mockStore.On("GetDBSchemaVersion").Return(1, nil)

th.App.ClearChannelMembersCache(th.Context, "channelID")
require.NoError(t, th.App.ClearChannelMembersCache(th.Context, "channelID"))
}

func TestGetMemberCountsByGroup(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion app/emoji.go
Expand Up @@ -82,7 +82,7 @@ func (a *App) CreateEmoji(sessionUserId string, emoji *model.Emoji, multiPartIma
message := model.NewWebSocketEvent(model.WebsocketEventEmojiAdded, "", "", "", nil)
emojiJSON, jsonErr := json.Marshal(emoji)
if jsonErr != nil {
mlog.Warn("Failed to encode emoji to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("CreateEmoji", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
message.Add("emoji", string(emojiJSON))
a.Publish(message)
Expand Down
30 changes: 19 additions & 11 deletions app/group.go
Expand Up @@ -9,7 +9,6 @@ import (
"net/http"

"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/shared/mlog"
"github.com/mattermost/mattermost-server/v6/store"
)

Expand Down Expand Up @@ -139,7 +138,7 @@ func (a *App) CreateGroupWithUserIds(group *model.GroupWithUserIds) (*model.Grou
case errors.As(err, &invErr):
return nil, model.NewAppError("CreateGroupWithUserIds", "app.group.id.app_error", nil, invErr.Error(), http.StatusBadRequest)
case errors.As(err, &dupKey):
return nil, model.NewAppError("CreateGroup", "app.custom_group.unique_name", nil, dupKey.Error(), http.StatusBadRequest)
return nil, model.NewAppError("CreateGroupWithUserIds", "app.custom_group.unique_name", nil, dupKey.Error(), http.StatusBadRequest)
default:
return nil, model.NewAppError("CreateGroupWithUserIds", "app.insert_error", nil, err.Error(), http.StatusInternalServerError)
}
Expand All @@ -153,7 +152,7 @@ func (a *App) CreateGroupWithUserIds(group *model.GroupWithUserIds) (*model.Grou
group.MemberCount = model.NewInt(int(count))
groupJSON, jsonErr := json.Marshal(newGroup)
if jsonErr != nil {
mlog.Warn("Failed to encode group to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("CreateGroupWithUserIds", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
messageWs.Add("group", string(groupJSON))
a.Publish(messageWs)
Expand All @@ -172,13 +171,13 @@ func (a *App) UpdateGroup(group *model.Group) (*model.Group, *model.AppError) {
if err == nil {
count, countErr := a.Srv().Store.Group().GetMemberCount(updatedGroup.Id)
if countErr != nil {
return nil, model.NewAppError("CreateGroupWithUserIds", "app.group.id.app_error", nil, countErr.Error(), http.StatusBadRequest)
return nil, model.NewAppError("UpdateGroup", "app.group.id.app_error", nil, countErr.Error(), http.StatusBadRequest)
}
updatedGroup.MemberCount = model.NewInt(int(count))
messageWs := model.NewWebSocketEvent(model.WebsocketEventReceivedGroup, "", "", "", nil)
groupJSON, jsonErr := json.Marshal(updatedGroup)
if jsonErr != nil {
mlog.Warn("Failed to encode group to JSON", mlog.Err(jsonErr))
return nil, model.NewAppError("UpdateGroup", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
messageWs.Add("group", string(groupJSON))
a.Publish(messageWs)
Expand Down Expand Up @@ -272,7 +271,9 @@ func (a *App) UpsertGroupMember(groupID string, userID string) (*model.GroupMemb
}
}

a.publishGroupMemberEvent(model.WebsocketEventGroupMemberAdd, groupMember)
if appErr := a.publishGroupMemberEvent(model.WebsocketEventGroupMemberAdd, groupMember); appErr != nil {
return nil, appErr
}

return groupMember, nil
}
Expand All @@ -289,7 +290,9 @@ func (a *App) DeleteGroupMember(groupID string, userID string) (*model.GroupMemb
}
}

a.publishGroupMemberEvent(model.WebsocketEventGroupMemberDelete, groupMember)
if appErr := a.publishGroupMemberEvent(model.WebsocketEventGroupMemberDelete, groupMember); appErr != nil {
return nil, appErr
}

return groupMember, nil
}
Expand Down Expand Up @@ -743,7 +746,9 @@ func (a *App) UpsertGroupMembers(groupID string, userIDs []string) ([]*model.Gro
}

for _, groupMember := range members {
a.publishGroupMemberEvent(model.WebsocketEventGroupMemberAdd, groupMember)
if appErr := a.publishGroupMemberEvent(model.WebsocketEventGroupMemberAdd, groupMember); appErr != nil {
return nil, appErr
}
}

return members, nil
Expand All @@ -765,18 +770,21 @@ func (a *App) DeleteGroupMembers(groupID string, userIDs []string) ([]*model.Gro
}

for _, groupMember := range members {
a.publishGroupMemberEvent(model.WebsocketEventGroupMemberDelete, groupMember)
if appErr := a.publishGroupMemberEvent(model.WebsocketEventGroupMemberDelete, groupMember); appErr != nil {
return nil, appErr
}
}

return members, nil
}

func (a *App) publishGroupMemberEvent(eventName string, groupMember *model.GroupMember) {
func (a *App) publishGroupMemberEvent(eventName string, groupMember *model.GroupMember) *model.AppError {
messageWs := model.NewWebSocketEvent(eventName, "", "", groupMember.UserId, nil)
groupMemberJSON, jsonErr := json.Marshal(groupMember)
if jsonErr != nil {
mlog.Warn("failed to encode group member to JSON", mlog.Err(jsonErr))
return model.NewAppError("publishGroupMemberEvent", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}
messageWs.Add("group_member", string(groupMemberJSON))
a.Publish(messageWs)
return nil
}
32 changes: 23 additions & 9 deletions app/opentracing/opentracing_layer.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion app/post.go
Expand Up @@ -1251,7 +1251,7 @@ func (a *App) DeletePost(c request.CTX, postID, deleteByID string) (*model.Post,

postJSON, jsonErr := json.Marshal(post)
if jsonErr != nil {
mlog.Warn("Failed to encode post to JSON")
return nil, model.NewAppError("DeletePost", "api.marshal_error", nil, "", http.StatusInternalServerError).Wrap(jsonErr)
}

userMessage := model.NewWebSocketEvent(model.WebsocketEventPostDeleted, "", post.ChannelId, "", nil)
Expand Down