MM-58038: Use context to call master for DeletePost (#27098)

Calling app.DeletePost immediately after creating a post
is susceptible to replica lag because we were calling the
replica to check for the post.

We fix this by passing a context to always query master.

https://mattermost.atlassian.net/browse/MM-58038

```release-note
NONE
```
Этот коммит содержится в:
Agniva De Sarker
2024-05-24 19:35:48 +05:30
коммит произвёл GitHub
родитель 09c0eb7e7a
Коммит 6f3327ce0f
34 изменённых файлов: 94 добавлений и 93 удалений

Просмотреть файл

@@ -1750,7 +1750,7 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
audit.AddEventParameter(auditRec, "post_root_id", postRootId)
if ok && len(postRootId) == 26 {
rootPost, err := c.App.GetSinglePost(postRootId, false)
rootPost, err := c.App.GetSinglePost(c.AppContext, postRootId, false)
if err != nil {
c.Err = err
return

Просмотреть файл

@@ -176,7 +176,7 @@ func localAddChannelMember(c *Context, w http.ResponseWriter, r *http.Request) {
audit.AddEventParameter(auditRec, "post_root_id", postRootId)
if ok && len(postRootId) == 26 {
rootPost, err := c.App.GetSinglePost(postRootId, false)
rootPost, err := c.App.GetSinglePost(c.AppContext, postRootId, false)
if err != nil {
c.Err = err
return

Просмотреть файл

@@ -563,7 +563,7 @@ func getEditHistoryForPost(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.SetPermissionError(model.PermissionEditPost)
return
@@ -600,7 +600,7 @@ func deletePost(c *Context, w http.ResponseWriter, _ *http.Request) {
defer c.LogAuditRecWithLevel(auditRec, app.LevelContent)
audit.AddEventParameter(auditRec, "post_id", c.Params.PostId)
post, err := c.App.GetSinglePost(c.Params.PostId, false)
post, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.SetPermissionError(model.PermissionDeletePost)
return
@@ -844,7 +844,7 @@ func updatePost(c *Context, w http.ResponseWriter, r *http.Request) {
}
}
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.SetPermissionError(model.PermissionEditPost)
return
@@ -916,7 +916,7 @@ func patchPost(c *Context, w http.ResponseWriter, r *http.Request) {
// Updating the file_ids of a post is not a supported operation and will be ignored
post.FileIds = nil
originalPost, err := c.App.GetSinglePost(c.Params.PostId, false)
originalPost, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.SetPermissionError(model.PermissionEditPost)
return
@@ -1023,7 +1023,7 @@ func saveIsPinnedPost(c *Context, w http.ResponseWriter, isPinned bool) {
audit.AddEventParameter(auditRec, "post_id", c.Params.PostId)
defer c.LogAuditRecWithLevel(auditRec, app.LevelContent)
post, err := c.App.GetSinglePost(c.Params.PostId, false)
post, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.SetPermissionError(model.PermissionReadChannelContent)
return
@@ -1117,7 +1117,7 @@ func unacknowledgePost(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
_, err := c.App.GetSinglePost(c.Params.PostId, false)
_, err := c.App.GetSinglePost(c.AppContext, c.Params.PostId, false)
if err != nil {
c.Err = err
return

Просмотреть файл

@@ -1645,7 +1645,7 @@ func TestPinPost(t *testing.T) {
_, err := client.PinPost(context.Background(), post.Id)
require.NoError(t, err)
rpost, appErr := th.App.GetSinglePost(post.Id, false)
rpost, appErr := th.App.GetSinglePost(th.Context, post.Id, false)
require.Nil(t, appErr)
require.True(t, rpost.IsPinned, "failed to pin post")
@@ -1675,7 +1675,7 @@ func TestUnpinPost(t *testing.T) {
_, err := client.UnpinPost(context.Background(), pinnedPost.Id)
require.NoError(t, err)
rpost, appErr := th.App.GetSinglePost(pinnedPost.Id, false)
rpost, appErr := th.App.GetSinglePost(th.Context, pinnedPost.Id, false)
require.Nil(t, appErr)
require.False(t, rpost.IsPinned)

Просмотреть файл

@@ -116,7 +116,7 @@ func updatePreferences(c *Context, w http.ResponseWriter, r *http.Request) {
for _, pref := range preferences {
if pref.Category == model.PreferenceCategoryFlaggedPost {
post, err := c.App.GetSinglePost(pref.Name, false)
post, err := c.App.GetSinglePost(c.AppContext, pref.Name, false)
if err != nil {
c.SetInvalidParam("preference.name")
return

Просмотреть файл

@@ -820,7 +820,7 @@ type AppIface interface {
GetSidebarCategoriesForTeamForUser(c request.CTX, userID, teamID string) (*model.OrderedSidebarCategories, *model.AppError)
GetSidebarCategory(c request.CTX, categoryId string) (*model.SidebarCategoryWithChannels, *model.AppError)
GetSidebarCategoryOrder(c request.CTX, userID, teamID string) ([]string, *model.AppError)
GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError)
GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError)
GetSiteURL() string
GetStatus(userID string) (*model.Status, *model.AppError)
GetStatusFromCache(userID string) *model.Status
@@ -830,7 +830,7 @@ type AppIface interface {
GetTeamByName(name string) (*model.Team, *model.AppError)
GetTeamIcon(team *model.Team) ([]byte, *model.AppError)
GetTeamIdFromQuery(rctx request.CTX, query url.Values) (string, *model.AppError)
GetTeamMember(c request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError)
GetTeamMember(rctx request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError)
GetTeamMembers(teamID string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, *model.AppError)
GetTeamMembersByIds(teamID string, userIDs []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError)
GetTeamMembersForUser(c request.CTX, userID string, excludeTeamID string, includeDeleted bool) ([]*model.TeamMember, *model.AppError)

Просмотреть файл

@@ -2700,7 +2700,7 @@ func (a *App) MarkChannelAsUnreadFromPost(c request.CTX, postID string, userID s
if !collapsedThreadsSupported || !a.IsCRTEnabledForUser(c, userID) {
return a.markChannelAsUnreadFromPostCRTUnsupported(c, postID, userID)
}
post, err := a.GetSinglePost(postID, false)
post, err := a.GetSinglePost(c, postID, false)
if err != nil {
return nil, err
}
@@ -2727,7 +2727,7 @@ func (a *App) MarkChannelAsUnreadFromPost(c request.CTX, postID string, userID s
}
func (a *App) markChannelAsUnreadFromPostCRTUnsupported(c request.CTX, postID string, userID string) (*model.ChannelUnreadAt, *model.AppError) {
post, appErr := a.GetSinglePost(postID, false)
post, appErr := a.GetSinglePost(c, postID, false)
if appErr != nil {
return nil, appErr
}
@@ -2766,7 +2766,7 @@ func (a *App) markChannelAsUnreadFromPostCRTUnsupported(c request.CTX, postID st
// If there are replies with mentions below the marked reply in the thread, then sum the mentions for the threads mention badge.
// In CRT Unsupported Client: Channel is marked as unread and new messages line inserted above the marked post.
// Badge on channel sums mentions in all posts (root & replies) including and below the post that was marked unread.
rootPost, appErr := a.GetSinglePost(post.RootId, false)
rootPost, appErr := a.GetSinglePost(c, post.RootId, false)
if appErr != nil {
return nil, appErr
}

Просмотреть файл

@@ -67,7 +67,7 @@ func (a *App) DoPostActionWithCookie(c request.CTX, postID, actionId, userID, se
// Start all queries here for parallel execution
pchan := make(chan store.StoreResult[*model.Post], 1)
go func() {
post, err := a.Srv().Store().Post().GetSingle(postID, false)
post, err := a.Srv().Store().Post().GetSingle(c, postID, false)
pchan <- store.StoreResult[*model.Post]{Data: post, NErr: err}
close(pchan)
}()

Просмотреть файл

@@ -530,7 +530,7 @@ func TestPostActionProps(t *testing.T) {
require.Nil(t, err)
assert.True(t, len(clientTriggerId) == 26)
newPost, nErr := th.App.Srv().Store().Post().GetSingle(post.Id, false)
newPost, nErr := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
require.NoError(t, nErr)
assert.True(t, newPost.IsPinned)

Просмотреть файл

@@ -9818,7 +9818,7 @@ func (a *OpenTracingAppLayer) GetSidebarCategoryOrder(c request.CTX, userID stri
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError) {
func (a *OpenTracingAppLayer) GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetSinglePost")
@@ -9830,7 +9830,7 @@ func (a *OpenTracingAppLayer) GetSinglePost(postID string, includeDeleted bool)
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetSinglePost(postID, includeDeleted)
resultVar0, resultVar1 := a.app.GetSinglePost(rctx, postID, includeDeleted)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
@@ -10089,7 +10089,7 @@ func (a *OpenTracingAppLayer) GetTeamIdFromQuery(rctx request.CTX, query url.Val
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetTeamMember(c request.CTX, teamID string, userID string) (*model.TeamMember, *model.AppError) {
func (a *OpenTracingAppLayer) GetTeamMember(rctx request.CTX, teamID string, userID string) (*model.TeamMember, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetTeamMember")
@@ -10101,7 +10101,7 @@ func (a *OpenTracingAppLayer) GetTeamMember(c request.CTX, teamID string, userID
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetTeamMember(c, teamID, userID)
resultVar0, resultVar1 := a.app.GetTeamMember(rctx, teamID, userID)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))

Просмотреть файл

@@ -704,7 +704,7 @@ func (api *PluginAPI) GetPostThread(postID string) (*model.PostList, *model.AppE
}
func (api *PluginAPI) GetPost(postID string) (*model.Post, *model.AppError) {
post, appErr := api.app.GetSinglePost(postID, false)
post, appErr := api.app.GetSinglePost(api.ctx, postID, false)
if post != nil {
post = post.ForPlugin()
}

Просмотреть файл

@@ -185,7 +185,7 @@ func TestHookMessageWillBePosted(t *testing.T) {
require.Nil(t, err)
assert.Equal(t, "message", post.Message)
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(post.Id, false)
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
require.NoError(t, errSingle)
assert.Equal(t, "message", retrievedPost.Message)
})
@@ -229,7 +229,7 @@ func TestHookMessageWillBePosted(t *testing.T) {
require.Nil(t, err)
assert.Equal(t, "message_fromplugin", post.Message)
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(post.Id, false)
retrievedPost, errSingle := th.App.Srv().Store().Post().GetSingle(th.Context, post.Id, false)
require.NoError(t, errSingle)
assert.Equal(t, "message_fromplugin", retrievedPost.Message)
})
@@ -1606,7 +1606,7 @@ func TestHookMessagesWillBeConsumed(t *testing.T) {
_, err := th.App.CreatePost(th.Context, newPost, th.BasicChannel, false, true)
require.Nil(t, err)
post, err := th.App.GetSinglePost(newPost.Id, true)
post, err := th.App.GetSinglePost(th.Context, newPost.Id, true)
require.Nil(t, err)
assert.Equal(t, "message", post.Message)
})
@@ -1629,7 +1629,7 @@ func TestHookMessagesWillBeConsumed(t *testing.T) {
_, err := th.App.CreatePost(th.Context, newPost, th.BasicChannel, false, true)
require.Nil(t, err)
post, err := th.App.GetSinglePost(newPost.Id, true)
post, err := th.App.GetSinglePost(th.Context, newPost.Id, true)
require.Nil(t, err)
assert.Equal(t, "mwbc_plugin:message", post.Message)
})

Просмотреть файл

@@ -130,7 +130,7 @@ func (a *App) deduplicateCreatePost(rctx request.CTX, post *model.Post) (foundPo
// If the other thread finished creating the post, return the created post back to the
// client, making the API call feel idempotent.
actualPost, err := a.GetSinglePost(postID, false)
actualPost, err := a.GetSinglePost(rctx, postID, false)
if err != nil {
return nil, model.NewAppError("deduplicateCreatePost", "api.post.deduplicate_create_post.failed_to_get", nil, "", http.StatusInternalServerError).Wrap(err)
}
@@ -795,7 +795,7 @@ func (a *App) publishWebsocketEventForPermalinkPost(c request.CTX, post *model.P
return false, nil
}
previewedPost, err := a.GetSinglePost(previewedPostID, false)
previewedPost, err := a.GetSinglePost(c, previewedPostID, false)
if err != nil {
if err.StatusCode == http.StatusNotFound {
a.CountNotificationReason(model.NotificationStatusError, model.NotificationTypeAll, model.NotificationReasonFetchError)
@@ -880,7 +880,7 @@ func (a *App) publishWebsocketEventForPermalinkPost(c request.CTX, post *model.P
}
func (a *App) PatchPost(c request.CTX, postID string, patch *model.PostPatch) (*model.Post, *model.AppError) {
post, err := a.GetSinglePost(postID, false)
post, err := a.GetSinglePost(c, postID, false)
if err != nil {
return nil, err
}
@@ -971,8 +971,8 @@ func (a *App) GetPostsSince(options model.GetPostsSinceOptions) (*model.PostList
return postList, nil
}
func (a *App) GetSinglePost(postID string, includeDeleted bool) (*model.Post, *model.AppError) {
post, err := a.Srv().Store().Post().GetSingle(postID, includeDeleted)
func (a *App) GetSinglePost(rctx request.CTX, postID string, includeDeleted bool) (*model.Post, *model.AppError) {
post, err := a.Srv().Store().Post().GetSingle(rctx, postID, includeDeleted)
if err != nil {
var nfErr *store.ErrNotFound
switch {
@@ -1362,7 +1362,7 @@ func (a *App) GetPostsForChannelAroundLastUnread(c request.CTX, channelID, userI
}
func (a *App) DeletePost(c request.CTX, postID, deleteByID string) (*model.Post, *model.AppError) {
post, err := a.Srv().Store().Post().GetSingle(postID, false)
post, err := a.Srv().Store().Post().GetSingle(sqlstore.RequestContextWithMaster(c), postID, false)
if err != nil {
return nil, model.NewAppError("DeletePost", "app.post.get.app_error", nil, "", http.StatusBadRequest).Wrap(err)
}
@@ -1730,7 +1730,7 @@ func (a *App) SearchPostsForUser(c request.CTX, terms string, userID string, tea
func (a *App) GetFileInfosForPostWithMigration(rctx request.CTX, postID string, includeDeleted bool) ([]*model.FileInfo, *model.AppError) {
pchan := make(chan store.StoreResult[*model.Post], 1)
go func() {
post, err := a.Srv().Store().Post().GetSingle(postID, includeDeleted)
post, err := a.Srv().Store().Post().GetSingle(rctx, postID, includeDeleted)
pchan <- store.StoreResult[*model.Post]{Data: post, NErr: err}
close(pchan)
}()
@@ -2077,7 +2077,7 @@ func (a *App) GetThreadMembershipsForUser(userID, teamID string) ([]*model.Threa
}
func (a *App) GetPostIfAuthorized(c request.CTX, postID string, session *model.Session, includeDeleted bool) (*model.Post, *model.AppError) {
post, err := a.GetSinglePost(postID, includeDeleted)
post, err := a.GetSinglePost(c, postID, includeDeleted)
if err != nil {
return nil, err
}
@@ -2269,7 +2269,7 @@ func (a *App) CheckPostReminders(rctx request.CTX) {
func (a *App) GetPostInfo(c request.CTX, postID string) (*model.PostInfo, *model.AppError) {
userID := c.Session().UserId
post, appErr := a.GetSinglePost(postID, false)
post, appErr := a.GetSinglePost(c, postID, false)
if appErr != nil {
return nil, appErr
}

Просмотреть файл

@@ -15,7 +15,7 @@ import (
)
func (a *App) SaveAcknowledgementForPost(c request.CTX, postID, userID string) (*model.PostAcknowledgement, *model.AppError) {
post, err := a.GetSinglePost(postID, false)
post, err := a.GetSinglePost(c, postID, false)
if err != nil {
return nil, err
}
@@ -62,7 +62,7 @@ func (a *App) SaveAcknowledgementForPost(c request.CTX, postID, userID string) (
}
func (a *App) DeleteAcknowledgementForPost(c request.CTX, postID, userID string) *model.AppError {
post, err := a.GetSinglePost(postID, false)
post, err := a.GetSinglePost(c, postID, false)
if err != nil {
return err
}

Просмотреть файл

@@ -52,7 +52,7 @@ func testSaveAcknowledgementForPost(t *testing.T) {
_, err = th.App.SaveAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
require.Nil(t, err)
post, err = th.App.GetSinglePost(post.Id, false)
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
require.Nil(t, err)
require.Greater(t, post.UpdateAt, oldUpdateAt)
@@ -91,7 +91,7 @@ func testDeleteAcknowledgementForPost(t *testing.T) {
_, err := th.App.SaveAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
require.Nil(t, err)
post, err = th.App.GetSinglePost(post.Id, false)
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
require.Nil(t, err)
oldUpdateAt := post.UpdateAt
@@ -99,7 +99,7 @@ func testDeleteAcknowledgementForPost(t *testing.T) {
err = th.App.DeleteAcknowledgementForPost(th.Context, post.Id, th.BasicUser.Id)
require.Nil(t, err)
post, err = th.App.GetSinglePost(post.Id, false)
post, err = th.App.GetSinglePost(th.Context, post.Id, false)
require.Nil(t, err)
require.Greater(t, post.UpdateAt, oldUpdateAt)

Просмотреть файл

@@ -645,7 +645,7 @@ func (a *App) getLinkMetadata(c request.CTX, requestURL string, timestamp int64,
if looksLikeAPermalink(requestURL, a.GetSiteURL()) && *a.Config().ServiceSettings.EnablePermalinkPreviews {
referencedPostID := requestURL[len(requestURL)-26:]
referencedPost, appErr := a.GetSinglePost(referencedPostID, false)
referencedPost, appErr := a.GetSinglePost(c, referencedPostID, false)
// TODO: Look into saving a value in the LinkMetadata.Data field to prevent perpetually re-querying for the deleted post.
if appErr != nil {
return nil, nil, nil, appErr

Просмотреть файл

@@ -257,7 +257,7 @@ func TestAttachFilesToPost(t *testing.T) {
assert.Len(t, infos, 1)
assert.Equal(t, info2.Id, infos[0].Id)
updated, appErr := th.App.GetSinglePost(post.Id, false)
updated, appErr := th.App.GetSinglePost(th.Context, post.Id, false)
require.Nil(t, appErr)
assert.Len(t, updated.FileIds, 1)
assert.Contains(t, updated.FileIds, info2.Id)

Просмотреть файл

@@ -15,7 +15,7 @@ import (
)
func (a *App) SaveReactionForPost(c request.CTX, reaction *model.Reaction) (*model.Reaction, *model.AppError) {
post, err := a.GetSinglePost(reaction.PostId, false)
post, err := a.GetSinglePost(c, reaction.PostId, false)
if err != nil {
return nil, err
}
@@ -132,7 +132,7 @@ func populateEmptyReactions(postIDs []string, reactions map[string][]*model.Reac
}
func (a *App) DeleteReactionForPost(c request.CTX, reaction *model.Reaction) *model.AppError {
post, err := a.GetSinglePost(reaction.PostId, false)
post, err := a.GetSinglePost(c, reaction.PostId, false)
if err != nil {
return err
}

Просмотреть файл

@@ -969,8 +969,8 @@ func (a *App) GetTeamsForUser(userID string) ([]*model.Team, *model.AppError) {
return teams, nil
}
func (a *App) GetTeamMember(c request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError) {
teamMember, err := a.Srv().Store().Team().GetMember(sqlstore.RequestContextWithMaster(c), teamID, userID)
func (a *App) GetTeamMember(rctx request.CTX, teamID, userID string) (*model.TeamMember, *model.AppError) {
teamMember, err := a.Srv().Store().Team().GetMember(sqlstore.RequestContextWithMaster(rctx), teamID, userID)
if err != nil {
var nfErr *store.ErrNotFound
switch {

Просмотреть файл

@@ -2723,7 +2723,7 @@ func (a *App) UpdateThreadFollowForUserFromChannelAdd(c request.CTX, userID, tea
return model.NewAppError("UpdateThreadFollowForUserFromChannelAdd", "app.user.update_thread_follow_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
post, appErr := a.GetSinglePost(threadID, false)
post, appErr := a.GetSinglePost(c, threadID, false)
if appErr != nil {
return appErr
}
@@ -2772,7 +2772,7 @@ func (a *App) UpdateThreadFollowForUserFromChannelAdd(c request.CTX, userID, tea
}
func (a *App) UpdateThreadReadForUserByPost(c request.CTX, currentSessionId, userID, teamID, threadID, postID string) (*model.ThreadResponse, *model.AppError) {
post, err := a.GetSinglePost(postID, false)
post, err := a.GetSinglePost(c, postID, false)
if err != nil {
return nil, err
}
@@ -2805,7 +2805,7 @@ func (a *App) UpdateThreadReadForUser(c request.CTX, currentSessionId, userID, t
return nil, model.NewAppError("UpdateThreadReadForUser", "app.user.update_thread_read_for_user.app_error", nil, "", http.StatusInternalServerError).Wrap(nErr)
}
post, err := a.GetSinglePost(threadID, false)
post, err := a.GetSinglePost(c, threadID, false)
if err != nil {
return nil, err
}

Просмотреть файл

@@ -6771,7 +6771,7 @@ func (s *OpenTracingLayerPostStore) GetRepliesForExport(parentID string) ([]*mod
return result, err
}
func (s *OpenTracingLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
func (s *OpenTracingLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
origCtx := s.Root.Store.Context()
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.GetSingle")
s.Root.Store.SetContext(newCtx)
@@ -6780,7 +6780,7 @@ func (s *OpenTracingLayerPostStore) GetSingle(id string, inclDeleted bool) (*mod
}()
defer span.Finish()
result, err := s.PostStore.GetSingle(id, inclDeleted)
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
if err != nil {
span.LogFields(spanlog.Error(err))
ext.Error.Set(span, true)

Просмотреть файл

@@ -7685,11 +7685,11 @@ func (s *RetryLayerPostStore) GetRepliesForExport(parentID string) ([]*model.Rep
}
func (s *RetryLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
func (s *RetryLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
tries := 0
for {
result, err := s.PostStore.GetSingle(id, inclDeleted)
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
if err == nil {
return result, nil
}

Просмотреть файл

@@ -23,7 +23,7 @@ func (s SearchFileInfoStore) indexFile(rctx request.CTX, file *model.FileInfo) {
if file.PostId == "" {
return
}
post, postErr := s.rootStore.Post().GetSingle(file.PostId, false)
post, postErr := s.rootStore.Post().GetSingle(rctx, file.PostId, false)
if postErr != nil {
rctx.Logger().Error("Couldn't get post for file for SearchEngine indexing.", mlog.String("post_id", file.PostId), mlog.String("search_engine", engineCopy.GetName()), mlog.String("file_info_id", file.Id), mlog.Err(postErr))
return

Просмотреть файл

@@ -833,7 +833,7 @@ func (s *SqlPostStore) Get(ctx context.Context, id string, opts model.GetPostsOp
return pl, nil
}
func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
func (s *SqlPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
query := s.getQueryBuilder().
Select("p.*").
From("Posts p").
@@ -855,7 +855,7 @@ func (s *SqlPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, erro
}
var post model.Post
err = s.GetReplicaX().Get(&post, queryString, args...)
err = s.DBXFromContext(rctx.Context()).Get(&post, queryString, args...)
if err != nil {
if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("Post", id)

Просмотреть файл

@@ -945,7 +945,7 @@ func (s SqlTeamStore) UpdateMember(rctx request.CTX, member *model.TeamMember) (
}
// GetMember returns a single member of the team that matches the teamId and userId provided as parameters.
func (s SqlTeamStore) GetMember(ctx request.CTX, teamId string, userId string) (*model.TeamMember, error) {
func (s SqlTeamStore) GetMember(rctx request.CTX, teamId string, userId string) (*model.TeamMember, error) {
query := s.getTeamMembersWithSchemeSelectQuery().
Where(sq.Eq{"TeamMembers.TeamId": teamId}).
Where(sq.Eq{"TeamMembers.UserId": userId})
@@ -956,7 +956,7 @@ func (s SqlTeamStore) GetMember(ctx request.CTX, teamId string, userId string) (
}
var dbMember teamMemberWithSchemeRoles
err = s.DBXFromContext(ctx.Context()).Get(&dbMember, queryString, args...)
err = s.DBXFromContext(rctx.Context()).Get(&dbMember, queryString, args...)
if err != nil {
if err == sql.ErrNoRows {
return nil, store.NewErrNotFound("TeamMember", fmt.Sprintf("teamId=%s, userId=%s", teamId, userId))

Просмотреть файл

@@ -353,7 +353,7 @@ type PostStore interface {
Save(rctx request.CTX, post *model.Post) (*model.Post, error)
Update(rctx request.CTX, newPost *model.Post, oldPost *model.Post) (*model.Post, error)
Get(ctx context.Context, id string, opts model.GetPostsOptions, userID string, sanitizeOptions map[string]bool) (*model.PostList, error)
GetSingle(id string, inclDeleted bool) (*model.Post, error)
GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error)
Delete(rctx request.CTX, postID string, timestamp int64, deleteByID string) error
PermanentDeleteByUser(rctx request.CTX, userID string) error
PermanentDeleteByChannel(rctx request.CTX, channelID string) error

Просмотреть файл

@@ -916,9 +916,9 @@ func (_m *PostStore) GetRepliesForExport(parentID string) ([]*model.ReplyForExpo
return r0, r1
}
// GetSingle provides a mock function with given fields: id, inclDeleted
func (_m *PostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
ret := _m.Called(id, inclDeleted)
// GetSingle provides a mock function with given fields: rctx, id, inclDeleted
func (_m *PostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
ret := _m.Called(rctx, id, inclDeleted)
if len(ret) == 0 {
panic("no return value specified for GetSingle")
@@ -926,19 +926,19 @@ func (_m *PostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error)
var r0 *model.Post
var r1 error
if rf, ok := ret.Get(0).(func(string, bool) (*model.Post, error)); ok {
return rf(id, inclDeleted)
if rf, ok := ret.Get(0).(func(request.CTX, string, bool) (*model.Post, error)); ok {
return rf(rctx, id, inclDeleted)
}
if rf, ok := ret.Get(0).(func(string, bool) *model.Post); ok {
r0 = rf(id, inclDeleted)
if rf, ok := ret.Get(0).(func(request.CTX, string, bool) *model.Post); ok {
r0 = rf(rctx, id, inclDeleted)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.Post)
}
}
if rf, ok := ret.Get(1).(func(string, bool) error); ok {
r1 = rf(id, inclDeleted)
if rf, ok := ret.Get(1).(func(request.CTX, string, bool) error); ok {
r1 = rf(rctx, id, inclDeleted)
} else {
r1 = ret.Error(1)
}

Просмотреть файл

@@ -56,7 +56,7 @@ func testPostAcknowledgementsStoreSave(t *testing.T, rctx request.CTX, ss store.
_, err := ss.PostAcknowledgement().Save(post.Id, userId1, 0)
require.NoError(t, err)
post, err = ss.Post().GetSingle(post.Id, false)
post, err = ss.Post().GetSingle(rctx, post.Id, false)
require.NoError(t, err)
require.Greater(t, post.UpdateAt, oldUpdateAt)
})

Просмотреть файл

@@ -180,7 +180,7 @@ func testPostStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
_, err = ss.Post().Save(rctx, &replyPost)
require.NoError(t, err)
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
require.NoError(t, err)
assert.Greater(t, rrootPost.UpdateAt, rootPost.UpdateAt)
})
@@ -293,7 +293,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
require.NoError(t, err)
require.Equal(t, -1, errIdx)
for _, post := range newPosts {
storedPost, err := ss.Post().GetSingle(post.Id, false)
storedPost, err := ss.Post().GetSingle(rctx, post.Id, false)
assert.NoError(t, err)
assert.Equal(t, post.ChannelId, storedPost.ChannelId)
assert.Equal(t, post.Message, storedPost.Message)
@@ -372,13 +372,13 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
require.Error(t, err)
require.Equal(t, 1, errIdx)
require.Nil(t, newPosts)
storedPost, err := ss.Post().GetSingle(p3.Id, false)
storedPost, err := ss.Post().GetSingle(rctx, p3.Id, false)
assert.NoError(t, err)
assert.Equal(t, p3.ChannelId, storedPost.ChannelId)
assert.Equal(t, p3.Message, storedPost.Message)
assert.Equal(t, p3.UserId, storedPost.UserId)
storedPost, err = ss.Post().GetSingle(p4.Id, false)
storedPost, err = ss.Post().GetSingle(rctx, p4.Id, false)
assert.Error(t, err)
assert.Nil(t, storedPost)
})
@@ -407,7 +407,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
_, _, err = ss.Post().SaveMultiple([]*model.Post{&rootPost, &replyPost})
require.NoError(t, err)
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
require.NoError(t, err)
assert.Equal(t, rrootPost.UpdateAt, rootPost.UpdateAt)
@@ -429,7 +429,7 @@ func testPostStoreSaveMultiple(t *testing.T, rctx request.CTX, ss store.Store) {
_, _, err = ss.Post().SaveMultiple([]*model.Post{&replyPost2, &replyPost3})
require.NoError(t, err)
rrootPost2, err := ss.Post().GetSingle(rootPost.Id, false)
rrootPost2, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
require.NoError(t, err)
assert.Greater(t, rrootPost2.UpdateAt, rrootPost.UpdateAt)
})
@@ -947,21 +947,21 @@ func testPostStoreGetSingle(t *testing.T, rctx request.CTX, ss store.Store) {
err = ss.Post().Delete(rctx, o4.Id, model.GetMillis(), o4.UserId)
require.NoError(t, err)
post, err := ss.Post().GetSingle(o1.Id, false)
post, err := ss.Post().GetSingle(rctx, o1.Id, false)
require.NoError(t, err)
require.Equal(t, post.CreateAt, o1.CreateAt, "invalid returned post")
require.Equal(t, int64(1), post.ReplyCount, "wrong replyCount computed")
_, err = ss.Post().GetSingle(o2.Id, false)
_, err = ss.Post().GetSingle(rctx, o2.Id, false)
require.Error(t, err, "should not return deleted post")
post, err = ss.Post().GetSingle(o2.Id, true)
post, err = ss.Post().GetSingle(rctx, o2.Id, true)
require.NoError(t, err)
require.Equal(t, post.CreateAt, o2.CreateAt, "invalid returned post")
require.NotZero(t, post.DeleteAt, "DeleteAt should be non-zero")
require.Zero(t, post.ReplyCount, "Post without replies should return zero ReplyCount")
_, err = ss.Post().GetSingle("123", false)
_, err = ss.Post().GetSingle(rctx, "123", false)
require.Error(t, err, "Missing id should have failed")
}

Просмотреть файл

@@ -188,7 +188,7 @@ func testThreadStorePopulation(t *testing.T, rctx request.CTX, ss store.Store) {
thread1, err := ss.Thread().Get(newPosts[0].RootId)
require.NoError(t, err)
rrootPost, err := ss.Post().GetSingle(rootPost.Id, false)
rrootPost, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
require.NoError(t, err)
require.Equal(t, rrootPost.UpdateAt, rootPost.UpdateAt)
@@ -207,7 +207,7 @@ func testThreadStorePopulation(t *testing.T, rctx request.CTX, ss store.Store) {
_, _, err = ss.Post().SaveMultiple([]*model.Post{&replyPost2, &replyPost3})
require.NoError(t, err)
rrootPost2, err := ss.Post().GetSingle(rootPost.Id, false)
rrootPost2, err := ss.Post().GetSingle(rctx, rootPost.Id, false)
require.NoError(t, err)
require.Greater(t, rrootPost2.UpdateAt, rrootPost.UpdateAt)
@@ -969,7 +969,7 @@ func testVarious(t *testing.T, rctx request.CTX, ss store.Store) {
gm1post1,
}
for i := range allPosts {
updatedPost, err := ss.Post().GetSingle(allPosts[i].Id, true)
updatedPost, err := ss.Post().GetSingle(rctx, allPosts[i].Id, true)
require.NoError(t, err)
// Fix some inconsistencies with how the post store returns posts vs. how the

Просмотреть файл

@@ -6122,10 +6122,10 @@ func (s *TimerLayerPostStore) GetRepliesForExport(parentID string) ([]*model.Rep
return result, err
}
func (s *TimerLayerPostStore) GetSingle(id string, inclDeleted bool) (*model.Post, error) {
func (s *TimerLayerPostStore) GetSingle(rctx request.CTX, id string, inclDeleted bool) (*model.Post, error) {
start := time.Now()
result, err := s.PostStore.GetSingle(id, inclDeleted)
result, err := s.PostStore.GetSingle(rctx, id, inclDeleted)
elapsed := float64(time.Since(start)) / float64(time.Second)
if s.Root.Metrics != nil {

Просмотреть файл

@@ -329,8 +329,9 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
var appErr *model.AppError
post.RemoteId = model.NewString(rc.RemoteId)
rctx := request.EmptyContext(scs.server.Log())
rpost, err := scs.server.GetStore().Post().GetSingle(post.Id, true)
rpost, err := scs.server.GetStore().Post().GetSingle(rctx, post.Id, true)
if err != nil {
if _, ok := err.(errNotFound); !ok {
return nil, fmt.Errorf("error checking sync post: %w", err)
@@ -339,7 +340,7 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
if rpost == nil {
// post doesn't exist; create new one
rpost, appErr = scs.app.CreatePost(request.EmptyContext(scs.server.Log()), post, channel, true, true)
rpost, appErr = scs.app.CreatePost(rctx, post, channel, true, true)
if appErr == nil {
scs.server.Log().Log(mlog.LvlSharedChannelServiceDebug, "Created sync post",
mlog.String("post_id", post.Id),
@@ -348,7 +349,7 @@ func (scs *Service) upsertSyncPost(post *model.Post, channel *model.Channel, rc
}
} else if post.DeleteAt > 0 {
// delete post
rpost, appErr = scs.app.DeletePost(request.EmptyContext(scs.server.Log()), post.Id, post.UserId)
rpost, appErr = scs.app.DeletePost(rctx, post.Id, post.UserId)
if appErr == nil {
scs.server.Log().Log(mlog.LvlSharedChannelServiceDebug, "Deleted sync post",
mlog.String("post_id", post.Id),

Просмотреть файл

@@ -322,7 +322,7 @@ func (scs *Service) handlePostError(postId string, task syncTask, rc *model.Remo
}
// this post failed as part of a group of posts. Retry as an individual post.
post, err := scs.server.GetStore().Post().GetSingle(postId, true)
post, err := scs.server.GetStore().Post().GetSingle(request.EmptyContext(scs.server.Log()), postId, true)
if err != nil {
scs.server.Log().Log(mlog.LvlSharedChannelServiceError, "error fetching post for sync retry",
mlog.String("remote", rc.DisplayName),

Просмотреть файл

@@ -270,7 +270,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
return fmt.Errorf("could not fetch new posts for sync: %w", err)
}
count := len(posts)
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostCreateAt)
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostCreateAt, scs.server.Log())
cache := postsSliceToMap(posts)
@@ -284,7 +284,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
}
posts = reducePostsSliceInCache(posts, cache)
count += len(posts)
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostUpdateAt)
sd.posts = appendPosts(sd.posts, posts, scs.server.GetStore().Post(), cursor.LastPostUpdateAt, scs.server.Log())
}
sd.resultNextCursor = nextCursor
@@ -293,7 +293,7 @@ func (scs *Service) fetchPostsForSync(sd *syncData) error {
return nil
}
func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostStore, timestamp int64) []*model.Post {
func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostStore, timestamp int64, logger mlog.LoggerIFace) []*model.Post {
// Append the posts individually, checking for root posts that might appear later in the list.
// This is due to the UpdateAt collision handling algorithm where the order of posts is not based
// on UpdateAt or CreateAt when the posts have the same UpdateAt value. Here we are guarding
@@ -302,7 +302,7 @@ func appendPosts(dest []*model.Post, posts []*model.Post, postStore store.PostSt
// happens during load testing or bulk imports.
for _, p := range posts {
if p.RootId != "" {
root, err := postStore.GetSingle(p.RootId, true)
root, err := postStore.GetSingle(request.EmptyContext(logger), p.RootId, true)
if err == nil {
if (root.CreateAt >= timestamp || root.UpdateAt >= timestamp) && !containsPost(dest, root) {
dest = append(dest, root)