MM-11886: materialize channel search (#9349)

* materialize PublicChannels table

Introduce triggers for each supported database that automatically maintain a subset of the Channels table corresponding to only public channels. This improves corresponding queries that no longer need to filter out 99% DM channels.

This initial commit modifies the channel store directly for easier code reviewing, but the next wraps an experimental version around it to enable a kill switch in case there are unforeseen performance regressions.

This addresses [MM-11886](https://mattermost.atlassian.net/browse/MM-11886) and [MM-11945](https://mattermost.atlassian.net/browse/MM-11945).

* extract the experimental public channels materialization

Wrap the original channel store with an experimental version that
leverages the materialized public channels, but can be disabled to
fallback to the original implementation.

This addresses MM-11947.

* s/ExperimentalPublicChannelsMaterialization/EnablePublicChannelsMaterialization/

* simplify error handling

* move experimental config listener until after store is initialized
Этот коммит содержится в:
Jesse Hallam
2018-09-13 13:47:17 -04:00
коммит произвёл GitHub
родитель 0a5f792d2d
Коммит 8b17bf9e42
15 изменённых файлов: 1794 добавлений и 628 удалений

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@@ -130,6 +130,30 @@ func (_m *ChannelStore) Delete(channelId string, time int64) store.StoreChannel
return r0
}
// DisableExperimentalPublicChannelsMaterialization provides a mock function with given fields:
func (_m *ChannelStore) DisableExperimentalPublicChannelsMaterialization() {
_m.Called()
}
// DropPublicChannels provides a mock function with given fields:
func (_m *ChannelStore) DropPublicChannels() error {
ret := _m.Called()
var r0 error
if rf, ok := ret.Get(0).(func() error); ok {
r0 = rf()
} else {
r0 = ret.Error(0)
}
return r0
}
// EnableExperimentalPublicChannelsMaterialization provides a mock function with given fields:
func (_m *ChannelStore) EnableExperimentalPublicChannelsMaterialization() {
_m.Called()
}
// Get provides a mock function with given fields: id, allowFromCache
func (_m *ChannelStore) Get(id string, allowFromCache bool) store.StoreChannel {
ret := _m.Called(id, allowFromCache)
@@ -601,6 +625,20 @@ func (_m *ChannelStore) InvalidateMemberCount(channelId string) {
_m.Called(channelId)
}
// IsExperimentalPublicChannelsMaterializationEnabled provides a mock function with given fields:
func (_m *ChannelStore) IsExperimentalPublicChannelsMaterializationEnabled() bool {
ret := _m.Called()
var r0 bool
if rf, ok := ret.Get(0).(func() bool); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(bool)
}
return r0
}
// IsUserInChannelUseCache provides a mock function with given fields: userId, channelId
func (_m *ChannelStore) IsUserInChannelUseCache(userId string, channelId string) bool {
ret := _m.Called(userId, channelId)
@@ -631,6 +669,20 @@ func (_m *ChannelStore) MigrateChannelMembers(fromChannelId string, fromUserId s
return r0
}
// MigratePublicChannels provides a mock function with given fields:
func (_m *ChannelStore) MigratePublicChannels() error {
ret := _m.Called()
var r0 error
if rf, ok := ret.Get(0).(func() error); ok {
r0 = rf()
} else {
r0 = ret.Error(0)
}
return r0
}
// PermanentDelete provides a mock function with given fields: channelId
func (_m *ChannelStore) PermanentDelete(channelId string) store.StoreChannel {
ret := _m.Called(channelId)

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

@@ -241,6 +241,20 @@ func (_m *SqlStore) DoesTableExist(tablename string) bool {
return r0
}
// DoesTriggerExist provides a mock function with given fields: triggerName
func (_m *SqlStore) DoesTriggerExist(triggerName string) bool {
ret := _m.Called(triggerName)
var r0 bool
if rf, ok := ret.Get(0).(func(string) bool); ok {
r0 = rf(triggerName)
} else {
r0 = ret.Get(0).(bool)
}
return r0
}
// DriverName provides a mock function with given fields:
func (_m *SqlStore) DriverName() string {
ret := _m.Called()

29
store/storetest/mocks/SqlSupplier.go Обычный файл
Просмотреть файл

@@ -0,0 +1,29 @@
// Code generated by mockery v1.0.0. DO NOT EDIT.
// Regenerate this file using `make store-mocks`.
package mocks
import gorp "github.com/mattermost/gorp"
import mock "github.com/stretchr/testify/mock"
// SqlSupplier is an autogenerated mock type for the SqlSupplier type
type SqlSupplier struct {
mock.Mock
}
// GetMaster provides a mock function with given fields:
func (_m *SqlSupplier) GetMaster() *gorp.DbMap {
ret := _m.Called()
var r0 *gorp.DbMap
if rf, ok := ret.Get(0).(func() *gorp.DbMap); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*gorp.DbMap)
}
}
return r0
}