MM-16921 Fix getPostsSince caching invalid data (#11618)

* MM-16921 Fix getPostsSince caching invalid data

* Remove workaround for invalid caching
Этот коммит содержится в:
Harrison Healey
2019-07-15 11:26:21 -04:00
коммит произвёл GitHub
родитель 8f4e03a52b
Коммит 767a506889
2 изменённых файлов: 107 добавлений и 81 удалений

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

@@ -335,7 +335,7 @@ func (s *SqlPostStore) InvalidateLastPostTimeCache(channelId string) {
func (s *SqlPostStore) GetEtag(channelId string, allowFromCache bool) string { func (s *SqlPostStore) GetEtag(channelId string, allowFromCache bool) string {
if allowFromCache { if allowFromCache {
if cacheItem, ok := s.lastPostTimeCache.Get(channelId); ok && cacheItem.(int64) > 0 { if cacheItem, ok := s.lastPostTimeCache.Get(channelId); ok {
if s.metrics != nil { if s.metrics != nil {
s.metrics.IncrementMemCacheHitCounter("Last Post Time") s.metrics.IncrementMemCacheHitCounter("Last Post Time")
} }
@@ -554,7 +554,7 @@ func (s *SqlPostStore) GetPostsSince(channelId string, time int64, allowFromCach
list := model.NewPostList() list := model.NewPostList()
var latestUpdate int64 = 0 latestUpdate := time
for _, p := range posts { for _, p := range posts {
list.AddPost(p) list.AddPost(p)

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

@@ -932,100 +932,126 @@ func testPostStoreGetPostsBeforeAfter(t *testing.T, ss store.Store) {
} }
func testPostStoreGetPostsSince(t *testing.T, ss store.Store) { func testPostStoreGetPostsSince(t *testing.T, ss store.Store) {
o0 := &model.Post{} t.Run("should return posts created after the given time", func(t *testing.T) {
o0.ChannelId = model.NewId() channelId := model.NewId()
o0.UserId = model.NewId() userId := model.NewId()
o0.Message = "zz" + model.NewId() + "b"
_, err := ss.Post().Save(o0) post1, err := ss.Post().Save(&model.Post{
ChannelId: channelId,
UserId: userId,
Message: "message",
})
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o1 := &model.Post{} _, err = ss.Post().Save(&model.Post{
o1.ChannelId = model.NewId() ChannelId: channelId,
o1.UserId = model.NewId() UserId: userId,
o1.Message = "zz" + model.NewId() + "b" Message: "message",
o1, err = ss.Post().Save(o1) })
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o2 := &model.Post{} post3, err := ss.Post().Save(&model.Post{
o2.ChannelId = o1.ChannelId ChannelId: channelId,
o2.UserId = model.NewId() UserId: userId,
o2.Message = "zz" + model.NewId() + "b" Message: "message",
o2.ParentId = o1.Id })
o2.RootId = o1.Id
_, err = ss.Post().Save(o2)
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o2a := &model.Post{} post4, err := ss.Post().Save(&model.Post{
o2a.ChannelId = o1.ChannelId ChannelId: channelId,
o2a.UserId = model.NewId() UserId: userId,
o2a.Message = "zz" + model.NewId() + "b" Message: "message",
o2a.ParentId = o1.Id })
o2a.RootId = o1.Id
o2a, err = ss.Post().Save(o2a)
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o3 := &model.Post{} post5, err := ss.Post().Save(&model.Post{
o3.ChannelId = o1.ChannelId ChannelId: channelId,
o3.UserId = model.NewId() UserId: userId,
o3.Message = "zz" + model.NewId() + "b" Message: "message",
o3.ParentId = o1.Id RootId: post3.Id,
o3.RootId = o1.Id })
o3, err = ss.Post().Save(o3)
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o4 := &model.Post{} post6, err := ss.Post().Save(&model.Post{
o4.ChannelId = o1.ChannelId ChannelId: channelId,
o4.UserId = model.NewId() UserId: userId,
o4.Message = "zz" + model.NewId() + "b" Message: "message",
o4, err = ss.Post().Save(o4) RootId: post1.Id,
})
require.Nil(t, err) require.Nil(t, err)
time.Sleep(2 * time.Millisecond) time.Sleep(time.Millisecond)
o5 := &model.Post{} postList, err := ss.Post().GetPostsSince(channelId, post3.CreateAt, false)
o5.ChannelId = o1.ChannelId assert.Nil(t, err)
o5.UserId = model.NewId()
o5.Message = "zz" + model.NewId() + "b" assert.Equal(t, []string{
o5.ParentId = o4.Id post6.Id,
o5.RootId = o4.Id post5.Id,
o5, err = ss.Post().Save(o5) post4.Id,
post3.Id,
post1.Id,
}, postList.Order)
assert.Len(t, postList.Posts, 5)
assert.NotNil(t, postList.Posts[post1.Id], "should return the parent post")
assert.NotNil(t, postList.Posts[post3.Id])
assert.NotNil(t, postList.Posts[post4.Id])
assert.NotNil(t, postList.Posts[post5.Id])
assert.NotNil(t, postList.Posts[post6.Id])
})
t.Run("should return empty list when nothing has changed", func(t *testing.T) {
channelId := model.NewId()
userId := model.NewId()
post1, err := ss.Post().Save(&model.Post{
ChannelId: channelId,
UserId: userId,
Message: "message",
})
require.Nil(t, err) require.Nil(t, err)
time.Sleep(time.Millisecond)
r1, _ := ss.Post().GetPostsSince(o1.ChannelId, o1.CreateAt, false) postList, err := ss.Post().GetPostsSince(channelId, post1.CreateAt, false)
assert.Nil(t, err)
if r1.Order[0] != o5.Id { assert.Equal(t, []string{}, postList.Order)
t.Fatal("invalid order") assert.Len(t, postList.Posts, 0)
} })
if r1.Order[1] != o4.Id { t.Run("should not cache a timestamp of 0 when nothing has changed", func(t *testing.T) {
t.Fatal("invalid order") ss.Post().ClearCaches()
}
if r1.Order[2] != o3.Id { channelId := model.NewId()
t.Fatal("invalid order") userId := model.NewId()
}
if r1.Order[3] != o2a.Id { post1, err := ss.Post().Save(&model.Post{
t.Fatal("invalid order") ChannelId: channelId,
} UserId: userId,
Message: "message",
})
require.Nil(t, err)
time.Sleep(time.Millisecond)
if len(r1.Posts) != 6 { // Make a request that returns no results
t.Fatal("wrong size") postList, err := ss.Post().GetPostsSince(channelId, post1.CreateAt, true)
} require.Nil(t, err)
require.Equal(t, model.NewPostList(), postList)
if r1.Posts[o1.Id].Message != o1.Message { // And then ensure that it doesn't cause future requests to also return no results
t.Fatal("Missing parent") postList, err = ss.Post().GetPostsSince(channelId, post1.CreateAt-1, true)
} assert.Nil(t, err)
r2, _ := ss.Post().GetPostsSince(o1.ChannelId, o5.UpdateAt, true) assert.Equal(t, []string{post1.Id}, postList.Order)
if len(r2.Order) != 0 { assert.Len(t, postList.Posts, 1)
t.Fatal("wrong size ", len(r2.Posts)) assert.NotNil(t, postList.Posts[post1.Id])
} })
} }
func testPostStoreGetPostBeforeAfter(t *testing.T, ss store.Store) { func testPostStoreGetPostBeforeAfter(t *testing.T, ss store.Store) {