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
Этот коммит содержится в:
Evan do Carmo
2019-05-30 10:44:33 -04:00
коммит произвёл Gabe Jackson
родитель 427effcd5c
Коммит cee1e36859
7 изменённых файлов: 73 добавлений и 70 удалений

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

@@ -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

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

@@ -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))
} }