summaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-05-01 05:19:58 +0100
committerChristopher Speller <crspeller@gmail.com>2017-05-01 00:19:58 -0400
commit597641545d1be04a1ba6c0b2d35c75fc2cfc8737 (patch)
tree4a5789acdeaf3924bd279672f8308572b91a9062 /store
parent5ab7726c1ec72678e505b87335eb011f97a09b3c (diff)
downloadchat-597641545d1be04a1ba6c0b2d35c75fc2cfc8737.tar.gz
chat-597641545d1be04a1ba6c0b2d35c75fc2cfc8737.tar.bz2
chat-597641545d1be04a1ba6c0b2d35c75fc2cfc8737.zip
PLT-6355: Use separate Read Replicas for Search. (#6216)
Diffstat (limited to 'store')
-rw-r--r--store/sql_post_store.go2
-rw-r--r--store/sql_store.go76
-rw-r--r--store/store.go1
3 files changed, 56 insertions, 23 deletions
diff --git a/store/sql_post_store.go b/store/sql_post_store.go
index 9d852abff..b2211a180 100644
--- a/store/sql_post_store.go
+++ b/store/sql_post_store.go
@@ -1065,7 +1065,7 @@ func (s SqlPostStore) Search(teamId string, userId string, params *model.SearchP
list := model.NewPostList()
- _, err := s.GetReplica().Select(&posts, searchQuery, queryParams)
+ _, err := s.GetSearchReplica().Select(&posts, searchQuery, queryParams)
if err != nil {
l4g.Warn(utils.T("store.sql_post.search.warn"), err.Error())
// Don't return the error to the caller as it is of no use to the user. Instead return an empty set of search results.
diff --git a/store/sql_store.go b/store/sql_store.go
index 0d921d07d..f13fe2ec0 100644
--- a/store/sql_store.go
+++ b/store/sql_store.go
@@ -66,33 +66,36 @@ const (
)
type SqlStore struct {
- master *gorp.DbMap
- replicas []*gorp.DbMap
- team TeamStore
- channel ChannelStore
- post PostStore
- user UserStore
- audit AuditStore
- compliance ComplianceStore
- session SessionStore
- oauth OAuthStore
- system SystemStore
- webhook WebhookStore
- command CommandStore
- preference PreferenceStore
- license LicenseStore
- token TokenStore
- emoji EmojiStore
- status StatusStore
- fileInfo FileInfoStore
- reaction ReactionStore
- SchemaVersion string
- rrCounter int64
+ master *gorp.DbMap
+ replicas []*gorp.DbMap
+ searchReplicas []*gorp.DbMap
+ team TeamStore
+ channel ChannelStore
+ post PostStore
+ user UserStore
+ audit AuditStore
+ compliance ComplianceStore
+ session SessionStore
+ oauth OAuthStore
+ system SystemStore
+ webhook WebhookStore
+ command CommandStore
+ preference PreferenceStore
+ license LicenseStore
+ token TokenStore
+ emoji EmojiStore
+ status StatusStore
+ fileInfo FileInfoStore
+ reaction ReactionStore
+ SchemaVersion string
+ rrCounter int64
+ srCounter int64
}
func initConnection() *SqlStore {
sqlStore := &SqlStore{
rrCounter: 0,
+ srCounter: 0,
}
sqlStore.master = setupConnection("master", utils.Cfg.SqlSettings.DriverName,
@@ -111,6 +114,17 @@ func initConnection() *SqlStore {
}
}
+ if len(utils.Cfg.SqlSettings.DataSourceSearchReplicas) == 0 {
+ sqlStore.searchReplicas = sqlStore.replicas
+ } else {
+ sqlStore.searchReplicas = make([]*gorp.DbMap, len(utils.Cfg.SqlSettings.DataSourceSearchReplicas))
+ for i, replica := range utils.Cfg.SqlSettings.DataSourceSearchReplicas {
+ sqlStore.searchReplicas[i] = setupConnection(fmt.Sprintf("search-replica-%v", i), utils.Cfg.SqlSettings.DriverName, replica,
+ utils.Cfg.SqlSettings.MaxIdleConns, utils.Cfg.SqlSettings.MaxOpenConns,
+ utils.Cfg.SqlSettings.Trace)
+ }
+ }
+
sqlStore.SchemaVersion = sqlStore.GetCurrentSchemaVersion()
return sqlStore
}
@@ -231,6 +245,19 @@ func (ss *SqlStore) TotalReadDbConnections() int {
return count
}
+func (ss *SqlStore) TotalSearchDbConnections() int {
+ if len(utils.Cfg.SqlSettings.DataSourceSearchReplicas) == 0 {
+ return 0
+ }
+
+ count := 0
+ for _, db := range ss.searchReplicas {
+ count = count + db.Db.Stats().OpenConnections
+ }
+
+ return count
+}
+
func (ss *SqlStore) GetCurrentSchemaVersion() string {
version, _ := ss.GetMaster().SelectStr("SELECT Value FROM Systems WHERE Name='Version'")
return version
@@ -611,6 +638,11 @@ func (ss *SqlStore) GetMaster() *gorp.DbMap {
return ss.master
}
+func (ss *SqlStore) GetSearchReplica() *gorp.DbMap {
+ rrNum := atomic.AddInt64(&ss.srCounter, 1) % int64(len(ss.searchReplicas))
+ return ss.searchReplicas[rrNum]
+}
+
func (ss *SqlStore) GetReplica() *gorp.DbMap {
rrNum := atomic.AddInt64(&ss.rrCounter, 1) % int64(len(ss.replicas))
return ss.replicas[rrNum]
diff --git a/store/store.go b/store/store.go
index 570695bfe..78dc4308b 100644
--- a/store/store.go
+++ b/store/store.go
@@ -52,6 +52,7 @@ type Store interface {
DropAllTables()
TotalMasterDbConnections() int
TotalReadDbConnections() int
+ TotalSearchDbConnections() int
}
type TeamStore interface {