MM-15846 migrating get posts to sync by default (#10994)
* migrating get posts to sync by default * flow control and style changes * style changes, error checking * pulling master down * counting missed cache, not hit * fixing bad conflict resolution * forcing rebuild
Этот коммит содержится в:
коммит произвёл
Gabe Jackson
родитель
427effcd5c
Коммит
cee1e36859
@@ -452,7 +452,9 @@ func TestAddChannelMemberNoUserRequestor(t *testing.T) {
|
|||||||
}
|
}
|
||||||
assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
|
assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
|
||||||
|
|
||||||
postList := store.Must(th.App.Srv.Store.Post().GetPosts(channel.Id, 0, 1, false)).(*model.PostList)
|
postList, err := th.App.Srv.Store.Post().GetPosts(channel.Id, 0, 1, false)
|
||||||
|
require.Nil(t,err)
|
||||||
|
|
||||||
if assert.Len(t, postList.Order, 1) {
|
if assert.Len(t, postList.Order, 1) {
|
||||||
post := postList.Posts[postList.Order[0]]
|
post := postList.Posts[postList.Order[0]]
|
||||||
|
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ func (a *App) MigrateFilenamesToFileInfos(post *model.Post) []*model.FileInfo {
|
|||||||
// Find the team that was used to make this post since its part of the file path that isn't saved in the Filename
|
// Find the team that was used to make this post since its part of the file path that isn't saved in the Filename
|
||||||
var teamId string
|
var teamId string
|
||||||
if channel.TeamId == "" {
|
if channel.TeamId == "" {
|
||||||
// This post was made in a cross-team DM channel so we need to find where its files were saved
|
// This post was made in a cross-team DM channel, so we need to find where its files were saved
|
||||||
teamId = a.FindTeamIdForFilename(post, filenames[0])
|
teamId = a.FindTeamIdForFilename(post, filenames[0])
|
||||||
} else {
|
} else {
|
||||||
teamId = channel.TeamId
|
teamId = channel.TeamId
|
||||||
|
|||||||
12
app/post.go
12
app/post.go
@@ -599,19 +599,11 @@ func (a *App) PatchPost(postId string, patch *model.PostPatch) (*model.Post, *mo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) GetPostsPage(channelId string, page int, perPage int) (*model.PostList, *model.AppError) {
|
func (a *App) GetPostsPage(channelId string, page int, perPage int) (*model.PostList, *model.AppError) {
|
||||||
result := <-a.Srv.Store.Post().GetPosts(channelId, page*perPage, perPage, true)
|
return a.Srv.Store.Post().GetPosts(channelId, page*perPage, perPage, true)
|
||||||
if result.Err != nil {
|
|
||||||
return nil, result.Err
|
|
||||||
}
|
|
||||||
return result.Data.(*model.PostList), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) GetPosts(channelId string, offset int, limit int) (*model.PostList, *model.AppError) {
|
func (a *App) GetPosts(channelId string, offset int, limit int) (*model.PostList, *model.AppError) {
|
||||||
result := <-a.Srv.Store.Post().GetPosts(channelId, offset, limit, true)
|
return a.Srv.Store.Post().GetPosts(channelId, offset, limit, true)
|
||||||
if result.Err != nil {
|
|
||||||
return nil, result.Err
|
|
||||||
}
|
|
||||||
return result.Data.(*model.PostList), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) GetPostsEtag(channelId string) string {
|
func (a *App) GetPostsEtag(channelId string) string {
|
||||||
|
|||||||
@@ -450,65 +450,61 @@ func (s *SqlPostStore) PermanentDeleteByChannel(channelId string) *model.AppErro
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) GetPosts(channelId string, offset int, limit int, allowFromCache bool) store.StoreChannel {
|
func (s *SqlPostStore) GetPosts(channelId string, offset int, limit int, allowFromCache bool) (*model.PostList, *model.AppError) {
|
||||||
return store.Do(func(result *store.StoreResult) {
|
if limit > 1000 {
|
||||||
if limit > 1000 {
|
return nil, model.NewAppError("SqlPostStore.GetLinearPosts", "store.sql_post.get_posts.app_error", nil, "channelId="+channelId, http.StatusBadRequest)
|
||||||
result.Err = model.NewAppError("SqlPostStore.GetLinearPosts", "store.sql_post.get_posts.app_error", nil, "channelId="+channelId, http.StatusBadRequest)
|
}
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Caching only occurs on limits of 30 and 60, the common limits requested by MM clients
|
// Caching only occurs on limits of 30 and 60, the common limits requested by MM clients
|
||||||
if allowFromCache && offset == 0 && (limit == 60 || limit == 30) {
|
if allowFromCache && offset == 0 && (limit == 60 || limit == 30) {
|
||||||
if cacheItem, ok := s.lastPostsCache.Get(fmt.Sprintf("%s%v", channelId, limit)); ok {
|
if cacheItem, ok := s.lastPostsCache.Get(fmt.Sprintf("%s%v", channelId, limit)); ok {
|
||||||
if s.metrics != nil {
|
|
||||||
s.metrics.IncrementMemCacheHitCounter("Last Posts Cache")
|
|
||||||
}
|
|
||||||
|
|
||||||
result.Data = cacheItem.(*model.PostList)
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
if s.metrics != nil {
|
|
||||||
s.metrics.IncrementMemCacheMissCounter("Last Posts Cache")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if s.metrics != nil {
|
if s.metrics != nil {
|
||||||
s.metrics.IncrementMemCacheMissCounter("Last Posts Cache")
|
s.metrics.IncrementMemCacheHitCounter("Last Posts Cache")
|
||||||
}
|
}
|
||||||
|
return cacheItem.(*model.PostList), nil
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rpc := s.getRootPosts(channelId, offset, limit)
|
if s.metrics != nil {
|
||||||
cpc := s.getParentsPosts(channelId, offset, limit)
|
s.metrics.IncrementMemCacheMissCounter("Last Posts Cache")
|
||||||
|
}
|
||||||
|
|
||||||
if rpr := <-rpc; rpr.Err != nil {
|
rpc := s.getRootPosts(channelId, offset, limit)
|
||||||
result.Err = rpr.Err
|
cpc := s.getParentsPosts(channelId, offset, limit)
|
||||||
} else if cpr := <-cpc; cpr.Err != nil {
|
|
||||||
result.Err = cpr.Err
|
|
||||||
} else {
|
|
||||||
posts := rpr.Data.([]*model.Post)
|
|
||||||
parents := cpr.Data.([]*model.Post)
|
|
||||||
|
|
||||||
list := model.NewPostList()
|
var err *model.AppError
|
||||||
|
list := model.NewPostList()
|
||||||
|
|
||||||
for _, p := range posts {
|
rpr := <-rpc
|
||||||
list.AddPost(p)
|
if rpr.Err != nil {
|
||||||
list.AddOrder(p.Id)
|
return nil, rpr.Err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range parents {
|
cpr := <-cpc
|
||||||
list.AddPost(p)
|
if cpr.Err != nil {
|
||||||
}
|
return nil, cpr.Err
|
||||||
|
}
|
||||||
|
|
||||||
list.MakeNonNil()
|
posts := rpr.Data.([]*model.Post)
|
||||||
|
parents := cpr.Data.([]*model.Post)
|
||||||
|
|
||||||
// Caching only occurs on limits of 30 and 60, the common limits requested by MM clients
|
for _, p := range posts {
|
||||||
if offset == 0 && (limit == 60 || limit == 30) {
|
list.AddPost(p)
|
||||||
s.lastPostsCache.AddWithExpiresInSecs(fmt.Sprintf("%s%v", channelId, limit), list, LAST_POSTS_CACHE_SEC)
|
list.AddOrder(p.Id)
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Data = list
|
for _, p := range parents {
|
||||||
}
|
list.AddPost(p)
|
||||||
})
|
}
|
||||||
|
|
||||||
|
list.MakeNonNil()
|
||||||
|
|
||||||
|
// Caching only occurs on limits of 30 and 60, the common limits requested by MM clients
|
||||||
|
if offset == 0 && (limit == 60 || limit == 30) {
|
||||||
|
s.lastPostsCache.AddWithExpiresInSecs(fmt.Sprintf("%s%v", channelId, limit), list, LAST_POSTS_CACHE_SEC)
|
||||||
|
}
|
||||||
|
|
||||||
|
return list, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) GetPostsSince(channelId string, time int64, allowFromCache bool) store.StoreChannel {
|
func (s *SqlPostStore) GetPostsSince(channelId string, time int64, allowFromCache bool) store.StoreChannel {
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ type PostStore interface {
|
|||||||
Delete(postId string, time int64, deleteByID string) *model.AppError
|
Delete(postId string, time int64, deleteByID string) *model.AppError
|
||||||
PermanentDeleteByUser(userId string) StoreChannel
|
PermanentDeleteByUser(userId string) StoreChannel
|
||||||
PermanentDeleteByChannel(channelId string) *model.AppError
|
PermanentDeleteByChannel(channelId string) *model.AppError
|
||||||
GetPosts(channelId string, offset int, limit int, allowFromCache bool) StoreChannel
|
GetPosts(channelId string, offset int, limit int, allowFromCache bool) (*model.PostList, *model.AppError)
|
||||||
GetFlaggedPosts(userId string, offset int, limit int) (*model.PostList, *model.AppError)
|
GetFlaggedPosts(userId string, offset int, limit int) (*model.PostList, *model.AppError)
|
||||||
GetFlaggedPostsForTeam(userId, teamId string, offset int, limit int) (*model.PostList, *model.AppError)
|
GetFlaggedPostsForTeam(userId, teamId string, offset int, limit int) (*model.PostList, *model.AppError)
|
||||||
GetFlaggedPostsForChannel(userId, channelId string, offset int, limit int) StoreChannel
|
GetFlaggedPostsForChannel(userId, channelId string, offset int, limit int) StoreChannel
|
||||||
|
|||||||
@@ -252,19 +252,28 @@ func (_m *PostStore) GetParentsForExportAfter(limit int, afterId string) store.S
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetPosts provides a mock function with given fields: channelId, offset, limit, allowFromCache
|
// GetPosts provides a mock function with given fields: channelId, offset, limit, allowFromCache
|
||||||
func (_m *PostStore) GetPosts(channelId string, offset int, limit int, allowFromCache bool) store.StoreChannel {
|
func (_m *PostStore) GetPosts(channelId string, offset int, limit int, allowFromCache bool) (*model.PostList, *model.AppError) {
|
||||||
ret := _m.Called(channelId, offset, limit, allowFromCache)
|
ret := _m.Called(channelId, offset, limit, allowFromCache)
|
||||||
|
|
||||||
var r0 store.StoreChannel
|
var r0 *model.PostList
|
||||||
if rf, ok := ret.Get(0).(func(string, int, int, bool) store.StoreChannel); ok {
|
if rf, ok := ret.Get(0).(func(string, int, int, bool) *model.PostList); ok {
|
||||||
r0 = rf(channelId, offset, limit, allowFromCache)
|
r0 = rf(channelId, offset, limit, allowFromCache)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(store.StoreChannel)
|
r0 = ret.Get(0).(*model.PostList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r0
|
var r1 *model.AppError
|
||||||
|
if rf, ok := ret.Get(1).(func(string, int, int, bool) *model.AppError); ok {
|
||||||
|
r1 = rf(channelId, offset, limit, allowFromCache)
|
||||||
|
} else {
|
||||||
|
if ret.Get(1) != nil {
|
||||||
|
r1 = ret.Get(1).(*model.AppError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return r0, r1
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPostsAfter provides a mock function with given fields: channelId, postId, numPosts, offset
|
// GetPostsAfter provides a mock function with given fields: channelId, postId, numPosts, offset
|
||||||
|
|||||||
@@ -636,7 +636,8 @@ func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) {
|
|||||||
o5.RootId = o4.Id
|
o5.RootId = o4.Id
|
||||||
o5 = (<-ss.Post().Save(o5)).Data.(*model.Post)
|
o5 = (<-ss.Post().Save(o5)).Data.(*model.Post)
|
||||||
|
|
||||||
r1 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 4, false)).Data.(*model.PostList)
|
r1, err := ss.Post().GetPosts(o1.ChannelId, 0, 4, false)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
if r1.Order[0] != o5.Id {
|
if r1.Order[0] != o5.Id {
|
||||||
t.Fatal("invalid order")
|
t.Fatal("invalid order")
|
||||||
@@ -662,7 +663,8 @@ func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) {
|
|||||||
t.Fatal("Missing parent")
|
t.Fatal("Missing parent")
|
||||||
}
|
}
|
||||||
|
|
||||||
r2 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 4, true)).Data.(*model.PostList)
|
r2, err := ss.Post().GetPosts(o1.ChannelId, 0, 4, true)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
if r2.Order[0] != o5.Id {
|
if r2.Order[0] != o5.Id {
|
||||||
t.Fatal("invalid order")
|
t.Fatal("invalid order")
|
||||||
@@ -689,7 +691,7 @@ func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run once to fill cache
|
// Run once to fill cache
|
||||||
<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)
|
ss.Post().GetPosts(o1.ChannelId, 0, 30, true)
|
||||||
|
|
||||||
o6 := &model.Post{}
|
o6 := &model.Post{}
|
||||||
o6.ChannelId = o1.ChannelId
|
o6.ChannelId = o1.ChannelId
|
||||||
@@ -698,13 +700,15 @@ func testPostStoreGetPostsWithDetails(t *testing.T, ss store.Store) {
|
|||||||
_ = (<-ss.Post().Save(o6)).Data.(*model.Post)
|
_ = (<-ss.Post().Save(o6)).Data.(*model.Post)
|
||||||
|
|
||||||
// Should only be 6 since we hit the cache
|
// Should only be 6 since we hit the cache
|
||||||
r3 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList)
|
r3, err := ss.Post().GetPosts(o1.ChannelId, 0, 30, true)
|
||||||
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 6, len(r3.Order))
|
assert.Equal(t, 6, len(r3.Order))
|
||||||
|
|
||||||
ss.Post().InvalidateLastPostTimeCache(o1.ChannelId)
|
ss.Post().InvalidateLastPostTimeCache(o1.ChannelId)
|
||||||
|
|
||||||
// Cache was invalidated, we should get all the posts
|
// Cache was invalidated, we should get all the posts
|
||||||
r4 := (<-ss.Post().GetPosts(o1.ChannelId, 0, 30, true)).Data.(*model.PostList)
|
r4, err := ss.Post().GetPosts(o1.ChannelId, 0, 30, true)
|
||||||
|
require.Nil(t, err)
|
||||||
assert.Equal(t, 7, len(r4.Order))
|
assert.Equal(t, 7, len(r4.Order))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user