Adding caching to get channel member (#5518)
Этот коммит содержится в:
коммит произвёл
Corey Hulen
родитель
7fc5dc236a
Коммит
ba028ed74b
@@ -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
|
||||
|
||||
Ссылка в новой задаче
Block a user