Adding caching to get channel member (#5518)

Этот коммит содержится в:
Christopher Speller
2017-02-24 09:15:36 -05:00
коммит произвёл Corey Hulen
родитель 7fc5dc236a
Коммит ba028ed74b
8 изменённых файлов: 67 добавлений и 13 удалений

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

@@ -28,6 +28,9 @@ const (
ALL_CHANNEL_MEMBERS_NOTIFY_PROPS_FOR_CHANNEL_CACHE_SIZE = model.SESSION_CACHE_SIZE
ALL_CHANNEL_MEMBERS_NOTIFY_PROPS_FOR_CHANNEL_CACHE_SEC = 1800 // 30 mins
CHANNEL_MEMBER_CACHE_SIZE = model.SESSION_CACHE_SIZE
CHANNEL_MEMBER_CACHE_SEC = 900 // 15 mins
CHANNEL_MEMBERS_COUNTS_CACHE_SIZE = model.CHANNEL_CACHE_SIZE
CHANNEL_MEMBERS_COUNTS_CACHE_SEC = 1800 // 30 mins
@@ -43,6 +46,7 @@ var allChannelMembersForUserCache = utils.NewLru(ALL_CHANNEL_MEMBERS_FOR_USER_CA
var allChannelMembersNotifyPropsForChannelCache = utils.NewLru(ALL_CHANNEL_MEMBERS_NOTIFY_PROPS_FOR_CHANNEL_CACHE_SIZE)
var channelCache = utils.NewLru(model.CHANNEL_CACHE_SIZE)
var channelByNameCache = utils.NewLru(model.CHANNEL_CACHE_SIZE)
var channelMemberCache = utils.NewLru(CHANNEL_MEMBER_CACHE_SIZE)
func ClearChannelCaches() {
channelMemberCountsCache.Purge()
@@ -50,6 +54,7 @@ func ClearChannelCaches() {
allChannelMembersNotifyPropsForChannelCache.Purge()
channelCache.Purge()
channelByNameCache.Purge()
channelMemberCache.Purge()
}
func NewSqlChannelStore(sqlStore *SqlStore) ChannelStore {
@@ -776,11 +781,36 @@ func (s SqlChannelStore) GetMembers(channelId string, offset, limit int) StoreCh
return storeChannel
}
func (s SqlChannelStore) GetMember(channelId string, userId string) StoreChannel {
func (s SqlChannelStore) InvalidateMember(channelId string, userId string) {
channelMemberCache.Remove(channelId + userId)
}
func (s SqlChannelStore) GetMember(channelId string, userId string, allowFromCache bool) StoreChannel {
storeChannel := make(StoreChannel, 1)
go func() {
result := StoreResult{}
metrics := einterfaces.GetMetricsInterface()
if allowFromCache {
if cacheItem, ok := channelMemberCache.Get(channelId + userId); ok {
if metrics != nil {
metrics.IncrementMemCacheHitCounter("Channel Member")
}
result.Data = cacheItem.(*model.ChannelMember)
storeChannel <- result
close(storeChannel)
return
} else {
if metrics != nil {
metrics.IncrementMemCacheMissCounter("Channel Member")
}
}
} else {
if metrics != nil {
metrics.IncrementMemCacheMissCounter("Channel Member")
}
}
var member model.ChannelMember
@@ -792,6 +822,8 @@ func (s SqlChannelStore) GetMember(channelId string, userId string) StoreChannel
}
} else {
result.Data = &member
channelMemberCache.AddWithExpiresInSecs(channelId+userId, &member, CHANNEL_MEMBER_CACHE_SEC)
}
storeChannel <- result

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

@@ -497,7 +497,7 @@ func TestChannelMemberStore(t *testing.T) {
t.Fatal("Member update time incorrect on delete")
}
member := (<-store.Channel().GetMember(o1.ChannelId, o1.UserId)).Data.(*model.ChannelMember)
member := (<-store.Channel().GetMember(o1.ChannelId, o1.UserId, false)).Data.(*model.ChannelMember)
if member.ChannelId != o1.ChannelId {
t.Fatal("should have go member")
}
@@ -968,15 +968,15 @@ func TestGetMember(t *testing.T) {
}
Must(store.Channel().SaveMember(m2))
if result := <-store.Channel().GetMember(model.NewId(), userId); result.Err == nil {
if result := <-store.Channel().GetMember(model.NewId(), userId, false); result.Err == nil {
t.Fatal("should've failed to get member for non-existant channel")
}
if result := <-store.Channel().GetMember(c1.Id, model.NewId()); result.Err == nil {
if result := <-store.Channel().GetMember(c1.Id, model.NewId(), false); result.Err == nil {
t.Fatal("should've failed to get member for non-existant user")
}
if result := <-store.Channel().GetMember(c1.Id, userId); result.Err != nil {
if result := <-store.Channel().GetMember(c1.Id, userId, false); result.Err != nil {
t.Fatal("shouldn't have errored when getting member", result.Err)
} else if member := result.Data.(*model.ChannelMember); member.ChannelId != c1.Id {
t.Fatal("should've gotten member of channel 1")
@@ -984,7 +984,7 @@ func TestGetMember(t *testing.T) {
t.Fatal("should've gotten member for user")
}
if result := <-store.Channel().GetMember(c2.Id, userId); result.Err != nil {
if result := <-store.Channel().GetMember(c2.Id, userId, false); result.Err != nil {
t.Fatal("shouldn't have errored when getting member", result.Err)
} else if member := result.Data.(*model.ChannelMember); member.ChannelId != c2.Id {
t.Fatal("should've gotten member of channel 2")

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

@@ -106,7 +106,8 @@ type ChannelStore interface {
SaveMember(member *model.ChannelMember) StoreChannel
UpdateMember(member *model.ChannelMember) StoreChannel
GetMembers(channelId string, offset, limit int) StoreChannel
GetMember(channelId string, userId string) StoreChannel
GetMember(channelId string, userId string, allowFromCache bool) StoreChannel
InvalidateMember(channelId string, userId string)
GetAllChannelMembersForUser(userId string, allowFromCache bool) StoreChannel
InvalidateAllChannelMembersForUser(userId string)
IsUserInChannelUseCache(userId string, channelId string) bool