From 6f3327ce0f33b5b2903d35df70e94647dabfc5ac Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Fri, 24 May 2024 19:35:48 +0530 Subject: [PATCH] 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 ``` --- server/channels/api4/channel.go | 2 +- server/channels/api4/channel_local.go | 2 +- server/channels/api4/post.go | 12 +++++------ server/channels/api4/post_test.go | 4 ++-- server/channels/api4/preference.go | 2 +- server/channels/app/app_iface.go | 4 ++-- server/channels/app/channel.go | 6 +++--- server/channels/app/integration_action.go | 2 +- .../channels/app/integration_action_test.go | 2 +- .../app/opentracing/opentracing_layer.go | 8 ++++---- server/channels/app/plugin_api.go | 2 +- server/channels/app/plugin_hooks_test.go | 8 ++++---- server/channels/app/post.go | 18 ++++++++--------- server/channels/app/post_acknowledgements.go | 4 ++-- .../app/post_acknowledgements_test.go | 6 +++--- server/channels/app/post_metadata.go | 2 +- server/channels/app/post_test.go | 2 +- server/channels/app/reaction.go | 4 ++-- server/channels/app/team.go | 4 ++-- server/channels/app/user.go | 6 +++--- .../opentracinglayer/opentracinglayer.go | 4 ++-- .../channels/store/retrylayer/retrylayer.go | 4 ++-- .../store/searchlayer/file_info_layer.go | 2 +- server/channels/store/sqlstore/post_store.go | 4 ++-- server/channels/store/sqlstore/team_store.go | 4 ++-- server/channels/store/store.go | 2 +- .../store/storetest/mocks/PostStore.go | 18 ++++++++--------- .../storetest/post_acknowledgements_store.go | 2 +- server/channels/store/storetest/post_store.go | 20 +++++++++---------- .../channels/store/storetest/thread_store.go | 6 +++--- .../channels/store/timerlayer/timerlayer.go | 4 ++-- .../services/sharedchannel/sync_recv.go | 7 ++++--- .../services/sharedchannel/sync_send.go | 2 +- .../sharedchannel/sync_send_remote.go | 8 ++++---- 34 files changed, 94 insertions(+), 93 deletions(-) diff --git a/server/channels/api4/channel.go b/server/channels/api4/channel.go index c690c0920d..f2ef036c68 100644 --- a/server/channels/api4/channel.go +++ b/server/channels/api4/channel.go @@ -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 diff --git a/server/channels/api4/channel_local.go b/server/channels/api4/channel_local.go index 5d0a96f389..72f6b562c5 100644 --- a/server/channels/api4/channel_local.go +++ b/server/channels/api4/channel_local.go @@ -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 diff --git a/server/channels/api4/post.go b/server/channels/api4/post.go index 49bbe1cfb4..385ac6d9b2 100644 --- a/server/channels/api4/post.go +++ b/server/channels/api4/post.go @@ -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 diff --git a/server/channels/api4/post_test.go b/server/channels/api4/post_test.go index 02a9ef5797..b972c45e40 100644 --- a/server/channels/api4/post_test.go +++ b/server/channels/api4/post_test.go @@ -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) diff --git a/server/channels/api4/preference.go b/server/channels/api4/preference.go index 5422391c10..3019330265 100644 --- a/server/channels/api4/preference.go +++ b/server/channels/api4/preference.go @@ -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 diff --git a/server/channels/app/app_iface.go b/server/channels/app/app_iface.go index ed0ff7921b..e10af6ba1f 100644 --- a/server/channels/app/app_iface.go +++ b/server/channels/app/app_iface.go @@ -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) diff --git a/server/channels/app/channel.go b/server/channels/app/channel.go index b4c17749fc..1f364f3a1c 100644 --- a/server/channels/app/channel.go +++ b/server/channels/app/channel.go @@ -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 } diff --git a/server/channels/app/integration_action.go b/server/channels/app/integration_action.go index dadfcbb08b..0db5339ccd 100644 --- a/server/channels/app/integration_action.go +++ b/server/channels/app/integration_action.go @@ -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) }() diff --git a/server/channels/app/integration_action_test.go b/server/channels/app/integration_action_test.go index ac5d66b8a6..96e53aae46 100644 --- a/server/channels/app/integration_action_test.go +++ b/server/channels/app/integration_action_test.go @@ -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) diff --git a/server/channels/app/opentracing/opentracing_layer.go b/server/channels/app/opentracing/opentracing_layer.go index 218ba4faee..2b3171a736 100644 --- a/server/channels/app/opentracing/opentracing_layer.go +++ b/server/channels/app/opentracing/opentracing_layer.go @@ -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)) diff --git a/server/channels/app/plugin_api.go b/server/channels/app/plugin_api.go index ff9d929f57..8daf00e4e7 100644 --- a/server/channels/app/plugin_api.go +++ b/server/channels/app/plugin_api.go @@ -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() } diff --git a/server/channels/app/plugin_hooks_test.go b/server/channels/app/plugin_hooks_test.go index 3a1c64d5bd..2a11254913 100644 --- a/server/channels/app/plugin_hooks_test.go +++ b/server/channels/app/plugin_hooks_test.go @@ -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) }) diff --git a/server/channels/app/post.go b/server/channels/app/post.go index ed9faa2401..9539d23f05 100644 --- a/server/channels/app/post.go +++ b/server/channels/app/post.go @@ -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 } diff --git a/server/channels/app/post_acknowledgements.go b/server/channels/app/post_acknowledgements.go index 7dab475d64..12971f76b3 100644 --- a/server/channels/app/post_acknowledgements.go +++ b/server/channels/app/post_acknowledgements.go @@ -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 } diff --git a/server/channels/app/post_acknowledgements_test.go b/server/channels/app/post_acknowledgements_test.go index 1ce4f4ed1e..d91457983e 100644 --- a/server/channels/app/post_acknowledgements_test.go +++ b/server/channels/app/post_acknowledgements_test.go @@ -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) diff --git a/server/channels/app/post_metadata.go b/server/channels/app/post_metadata.go index e388d26971..ee22d279dd 100644 --- a/server/channels/app/post_metadata.go +++ b/server/channels/app/post_metadata.go @@ -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 diff --git a/server/channels/app/post_test.go b/server/channels/app/post_test.go index d22a1dc5b8..1110efcef3 100644 --- a/server/channels/app/post_test.go +++ b/server/channels/app/post_test.go @@ -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) diff --git a/server/channels/app/reaction.go b/server/channels/app/reaction.go index 1f453cc1c5..a4c9dd51d4 100644 --- a/server/channels/app/reaction.go +++ b/server/channels/app/reaction.go @@ -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 } diff --git a/server/channels/app/team.go b/server/channels/app/team.go index 7e00f87847..415965fe6e 100644 --- a/server/channels/app/team.go +++ b/server/channels/app/team.go @@ -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 { diff --git a/server/channels/app/user.go b/server/channels/app/user.go index 4418322554..e3cbd5342b 100644 --- a/server/channels/app/user.go +++ b/server/channels/app/user.go @@ -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 } diff --git a/server/channels/store/opentracinglayer/opentracinglayer.go b/server/channels/store/opentracinglayer/opentracinglayer.go index ccb6ad2873..8f11c61013 100644 --- a/server/channels/store/opentracinglayer/opentracinglayer.go +++ b/server/channels/store/opentracinglayer/opentracinglayer.go @@ -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) diff --git a/server/channels/store/retrylayer/retrylayer.go b/server/channels/store/retrylayer/retrylayer.go index 114d9cac24..81e9cfa2d4 100644 --- a/server/channels/store/retrylayer/retrylayer.go +++ b/server/channels/store/retrylayer/retrylayer.go @@ -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 } diff --git a/server/channels/store/searchlayer/file_info_layer.go b/server/channels/store/searchlayer/file_info_layer.go index 2ac423a2cd..ce72a97f0e 100644 --- a/server/channels/store/searchlayer/file_info_layer.go +++ b/server/channels/store/searchlayer/file_info_layer.go @@ -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 diff --git a/server/channels/store/sqlstore/post_store.go b/server/channels/store/sqlstore/post_store.go index 8f7cd9ef76..d4cc9bb6a0 100644 --- a/server/channels/store/sqlstore/post_store.go +++ b/server/channels/store/sqlstore/post_store.go @@ -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) diff --git a/server/channels/store/sqlstore/team_store.go b/server/channels/store/sqlstore/team_store.go index 6f7b88a9dc..f3da855233 100644 --- a/server/channels/store/sqlstore/team_store.go +++ b/server/channels/store/sqlstore/team_store.go @@ -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)) diff --git a/server/channels/store/store.go b/server/channels/store/store.go index a726117e9d..7dbf0d3c75 100644 --- a/server/channels/store/store.go +++ b/server/channels/store/store.go @@ -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 diff --git a/server/channels/store/storetest/mocks/PostStore.go b/server/channels/store/storetest/mocks/PostStore.go index 871adc49ca..df5ab5523f 100644 --- a/server/channels/store/storetest/mocks/PostStore.go +++ b/server/channels/store/storetest/mocks/PostStore.go @@ -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) } diff --git a/server/channels/store/storetest/post_acknowledgements_store.go b/server/channels/store/storetest/post_acknowledgements_store.go index d2292dc5ce..ec02cb708c 100644 --- a/server/channels/store/storetest/post_acknowledgements_store.go +++ b/server/channels/store/storetest/post_acknowledgements_store.go @@ -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) }) diff --git a/server/channels/store/storetest/post_store.go b/server/channels/store/storetest/post_store.go index 0d62cdfdc8..94531fd666 100644 --- a/server/channels/store/storetest/post_store.go +++ b/server/channels/store/storetest/post_store.go @@ -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") } diff --git a/server/channels/store/storetest/thread_store.go b/server/channels/store/storetest/thread_store.go index 4d576f6507..a2b94b7fff 100644 --- a/server/channels/store/storetest/thread_store.go +++ b/server/channels/store/storetest/thread_store.go @@ -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 diff --git a/server/channels/store/timerlayer/timerlayer.go b/server/channels/store/timerlayer/timerlayer.go index 355095c2c9..a391b20867 100644 --- a/server/channels/store/timerlayer/timerlayer.go +++ b/server/channels/store/timerlayer/timerlayer.go @@ -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 { diff --git a/server/platform/services/sharedchannel/sync_recv.go b/server/platform/services/sharedchannel/sync_recv.go index 2600b579de..9e9538bdc2 100644 --- a/server/platform/services/sharedchannel/sync_recv.go +++ b/server/platform/services/sharedchannel/sync_recv.go @@ -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), diff --git a/server/platform/services/sharedchannel/sync_send.go b/server/platform/services/sharedchannel/sync_send.go index 3217de104f..452db3e024 100644 --- a/server/platform/services/sharedchannel/sync_send.go +++ b/server/platform/services/sharedchannel/sync_send.go @@ -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), diff --git a/server/platform/services/sharedchannel/sync_send_remote.go b/server/platform/services/sharedchannel/sync_send_remote.go index d9c8d61eed..c7999f8f5e 100644 --- a/server/platform/services/sharedchannel/sync_send_remote.go +++ b/server/platform/services/sharedchannel/sync_send_remote.go @@ -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)