summaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2017-02-24 09:15:36 -0500
committerCorey Hulen <corey@hulen.com>2017-02-24 09:15:36 -0500
commitba028ed74b69bd1dd902344663fbf8ba4f1dfb87 (patch)
tree773fb0cf301208023a50803f21ebbecf64466a4f /store
parent7fc5dc236aa2437e81b238f65d39c2f795eac493 (diff)
downloadchat-ba028ed74b69bd1dd902344663fbf8ba4f1dfb87.tar.gz
chat-ba028ed74b69bd1dd902344663fbf8ba4f1dfb87.tar.bz2
chat-ba028ed74b69bd1dd902344663fbf8ba4f1dfb87.zip
Adding caching to get channel member (#5518)
Diffstat (limited to 'store')
-rw-r--r--store/sql_channel_store.go34
-rw-r--r--store/sql_channel_store_test.go10
-rw-r--r--store/store.go3
3 files changed, 40 insertions, 7 deletions
diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go
index aac5bfed3..e7501ae69 100644
--- a/store/sql_channel_store.go
+++ b/store/sql_channel_store.go
@@ -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
diff --git a/store/sql_channel_store_test.go b/store/sql_channel_store_test.go
index 002f9cb66..3075498f7 100644
--- a/store/sql_channel_store_test.go
+++ b/store/sql_channel_store_test.go
@@ -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")
diff --git a/store/store.go b/store/store.go
index 3da331209..752b6cc28 100644
--- a/store/store.go
+++ b/store/store.go
@@ -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