Migrate System store to Sync by default (#10838)

Этот коммит содержится в:
Jesús Espino
2019-05-21 18:22:27 +02:00
коммит произвёл GitHub
родитель 3e6fed8df4
Коммит f8a89a52fc
22 изменённых файлов: 310 добавлений и 295 удалений

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

@@ -346,13 +346,15 @@ func (ss *SqlSupplier) TotalSearchDbConnections() int {
}
func (ss *SqlSupplier) MarkSystemRanUnitTests() {
if result := <-ss.System().Get(); result.Err == nil {
props := result.Data.(model.StringMap)
unitTests := props[model.SYSTEM_RAN_UNIT_TESTS]
if len(unitTests) == 0 {
systemTests := &model.System{Name: model.SYSTEM_RAN_UNIT_TESTS, Value: "1"}
<-ss.System().Save(systemTests)
}
props, err := ss.System().Get()
if err != nil {
return
}
unitTests := props[model.SYSTEM_RAN_UNIT_TESTS]
if len(unitTests) == 0 {
systemTests := &model.System{Name: model.SYSTEM_RAN_UNIT_TESTS, Value: "1"}
ss.System().Save(systemTests)
}
}

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

@@ -29,70 +29,60 @@ func NewSqlSystemStore(sqlStore SqlStore) store.SystemStore {
func (s SqlSystemStore) CreateIndexesIfNotExists() {
}
func (s SqlSystemStore) Save(system *model.System) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
if err := s.GetMaster().Insert(system); err != nil {
result.Err = model.NewAppError("SqlSystemStore.Save", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
}
})
func (s SqlSystemStore) Save(system *model.System) *model.AppError {
if err := s.GetMaster().Insert(system); err != nil {
return model.NewAppError("SqlSystemStore.Save", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
}
return nil
}
func (s SqlSystemStore) SaveOrUpdate(system *model.System) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
if err := s.GetReplica().SelectOne(&model.System{}, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": system.Name}); err == nil {
if _, err := s.GetMaster().Update(system); err != nil {
result.Err = model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
}
} else {
if err := s.GetMaster().Insert(system); err != nil {
result.Err = model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
}
}
})
}
func (s SqlSystemStore) Update(system *model.System) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
func (s SqlSystemStore) SaveOrUpdate(system *model.System) *model.AppError {
if err := s.GetReplica().SelectOne(&model.System{}, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": system.Name}); err == nil {
if _, err := s.GetMaster().Update(system); err != nil {
result.Err = model.NewAppError("SqlSystemStore.Update", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
return model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
}
})
} else {
if err := s.GetMaster().Insert(system); err != nil {
return model.NewAppError("SqlSystemStore.SaveOrUpdate", "store.sql_system.save.app_error", nil, err.Error(), http.StatusInternalServerError)
}
}
return nil
}
func (s SqlSystemStore) Get() store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
var systems []model.System
props := make(model.StringMap)
if _, err := s.GetReplica().Select(&systems, "SELECT * FROM Systems"); err != nil {
result.Err = model.NewAppError("SqlSystemStore.Get", "store.sql_system.get.app_error", nil, err.Error(), http.StatusInternalServerError)
} else {
for _, prop := range systems {
props[prop.Name] = prop.Value
}
result.Data = props
}
})
func (s SqlSystemStore) Update(system *model.System) *model.AppError {
if _, err := s.GetMaster().Update(system); err != nil {
return model.NewAppError("SqlSystemStore.Update", "store.sql_system.update.app_error", nil, err.Error(), http.StatusInternalServerError)
}
return nil
}
func (s SqlSystemStore) GetByName(name string) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
var system model.System
if err := s.GetReplica().SelectOne(&system, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
result.Err = model.NewAppError("SqlSystemStore.GetByName", "store.sql_system.get_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
}
func (s SqlSystemStore) Get() (model.StringMap, *model.AppError) {
var systems []model.System
props := make(model.StringMap)
if _, err := s.GetReplica().Select(&systems, "SELECT * FROM Systems"); err != nil {
return nil, model.NewAppError("SqlSystemStore.Get", "store.sql_system.get.app_error", nil, err.Error(), http.StatusInternalServerError)
}
for _, prop := range systems {
props[prop.Name] = prop.Value
}
result.Data = &system
})
return props, nil
}
func (s SqlSystemStore) PermanentDeleteByName(name string) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
var system model.System
if _, err := s.GetMaster().Exec("DELETE FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
result.Err = model.NewAppError("SqlSystemStore.PermanentDeleteByName", "store.sql_system.permanent_delete_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
}
func (s SqlSystemStore) GetByName(name string) (*model.System, *model.AppError) {
var system model.System
if err := s.GetReplica().SelectOne(&system, "SELECT * FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
return nil, model.NewAppError("SqlSystemStore.GetByName", "store.sql_system.get_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
}
result.Data = &system
})
return &system, nil
}
func (s SqlSystemStore) PermanentDeleteByName(name string) (*model.System, *model.AppError) {
var system model.System
if _, err := s.GetMaster().Exec("DELETE FROM Systems WHERE Name = :Name", map[string]interface{}{"Name": name}); err != nil {
return nil, model.NewAppError("SqlSystemStore.PermanentDeleteByName", "store.sql_system.permanent_delete_by_name.app_error", nil, err.Error(), http.StatusInternalServerError)
}
return &system, nil
}

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

@@ -95,7 +95,7 @@ func UpgradeDatabase(sqlStore SqlStore, currentModelVersionString string) error
// Assume a fresh database if no schema version has been recorded.
if currentSchemaVersion == nil {
if result := <-sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); result.Err != nil {
if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); err != nil {
return errors.Wrap(err, "failed to initialize schema version for fresh database")
}
@@ -160,8 +160,8 @@ func UpgradeDatabase(sqlStore SqlStore, currentModelVersionString string) error
}
func saveSchemaVersion(sqlStore SqlStore, version string) {
if result := <-sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); result.Err != nil {
mlog.Critical(result.Err.Error())
if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); err != nil {
mlog.Critical(err.Error())
time.Sleep(time.Second)
os.Exit(EXIT_VERSION_SAVE)
}

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

@@ -86,20 +86,18 @@ func TestSaveSchemaVersion(t *testing.T) {
t.Run("set earliest version", func(t *testing.T) {
saveSchemaVersion(sqlStore, VERSION_3_0_0)
result := <-ss.System().Get()
require.Nil(t, result.Err)
props, err := ss.System().Get()
require.Nil(t, err)
props := result.Data.(model.StringMap)
require.Equal(t, VERSION_3_0_0, props["Version"])
require.Equal(t, VERSION_3_0_0, sqlStore.GetCurrentSchemaVersion())
})
t.Run("set current version", func(t *testing.T) {
saveSchemaVersion(sqlStore, model.CurrentVersion)
result := <-ss.System().Get()
require.Nil(t, result.Err)
props, err := ss.System().Get()
require.Nil(t, err)
props := result.Data.(model.StringMap)
require.Equal(t, model.CurrentVersion, props["Version"])
require.Equal(t, model.CurrentVersion, sqlStore.GetCurrentSchemaVersion())
})

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

@@ -373,12 +373,12 @@ type OAuthStore interface {
}
type SystemStore interface {
Save(system *model.System) StoreChannel
SaveOrUpdate(system *model.System) StoreChannel
Update(system *model.System) StoreChannel
Get() StoreChannel
GetByName(name string) StoreChannel
PermanentDeleteByName(name string) StoreChannel
Save(system *model.System) *model.AppError
SaveOrUpdate(system *model.System) *model.AppError
Update(system *model.System) *model.AppError
Get() (model.StringMap, *model.AppError)
GetByName(name string) (*model.System, *model.AppError)
PermanentDeleteByName(name string) (*model.System, *model.AppError)
}
type WebhookStore interface {

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

@@ -6,7 +6,6 @@ package mocks
import mock "github.com/stretchr/testify/mock"
import model "github.com/mattermost/mattermost-server/model"
import store "github.com/mattermost/mattermost-server/store"
// SystemStore is an autogenerated mock type for the SystemStore type
type SystemStore struct {
@@ -14,63 +13,90 @@ type SystemStore struct {
}
// Get provides a mock function with given fields:
func (_m *SystemStore) Get() store.StoreChannel {
func (_m *SystemStore) Get() (model.StringMap, *model.AppError) {
ret := _m.Called()
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func() store.StoreChannel); ok {
var r0 model.StringMap
if rf, ok := ret.Get(0).(func() model.StringMap); ok {
r0 = rf()
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(model.StringMap)
}
}
return r0
var r1 *model.AppError
if rf, ok := ret.Get(1).(func() *model.AppError); ok {
r1 = rf()
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// GetByName provides a mock function with given fields: name
func (_m *SystemStore) GetByName(name string) store.StoreChannel {
func (_m *SystemStore) GetByName(name string) (*model.System, *model.AppError) {
ret := _m.Called(name)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok {
var r0 *model.System
if rf, ok := ret.Get(0).(func(string) *model.System); ok {
r0 = rf(name)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(*model.System)
}
}
return r0
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(name)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// PermanentDeleteByName provides a mock function with given fields: name
func (_m *SystemStore) PermanentDeleteByName(name string) store.StoreChannel {
func (_m *SystemStore) PermanentDeleteByName(name string) (*model.System, *model.AppError) {
ret := _m.Called(name)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(string) store.StoreChannel); ok {
var r0 *model.System
if rf, ok := ret.Get(0).(func(string) *model.System); ok {
r0 = rf(name)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(*model.System)
}
}
return r0
var r1 *model.AppError
if rf, ok := ret.Get(1).(func(string) *model.AppError); ok {
r1 = rf(name)
} else {
if ret.Get(1) != nil {
r1 = ret.Get(1).(*model.AppError)
}
}
return r0, r1
}
// Save provides a mock function with given fields: system
func (_m *SystemStore) Save(system *model.System) store.StoreChannel {
func (_m *SystemStore) Save(system *model.System) *model.AppError {
ret := _m.Called(system)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(*model.System) store.StoreChannel); ok {
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(*model.System) *model.AppError); ok {
r0 = rf(system)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(*model.AppError)
}
}
@@ -78,15 +104,15 @@ func (_m *SystemStore) Save(system *model.System) store.StoreChannel {
}
// SaveOrUpdate provides a mock function with given fields: system
func (_m *SystemStore) SaveOrUpdate(system *model.System) store.StoreChannel {
func (_m *SystemStore) SaveOrUpdate(system *model.System) *model.AppError {
ret := _m.Called(system)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(*model.System) store.StoreChannel); ok {
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(*model.System) *model.AppError); ok {
r0 = rf(system)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(*model.AppError)
}
}
@@ -94,15 +120,15 @@ func (_m *SystemStore) SaveOrUpdate(system *model.System) store.StoreChannel {
}
// Update provides a mock function with given fields: system
func (_m *SystemStore) Update(system *model.System) store.StoreChannel {
func (_m *SystemStore) Update(system *model.System) *model.AppError {
ret := _m.Called(system)
var r0 store.StoreChannel
if rf, ok := ret.Get(0).(func(*model.System) store.StoreChannel); ok {
var r0 *model.AppError
if rf, ok := ret.Get(0).(func(*model.System) *model.AppError); ok {
r0 = rf(system)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)
r0 = ret.Get(0).(*model.AppError)
}
}

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

@@ -21,37 +21,35 @@ func TestSystemStore(t *testing.T, ss store.Store) {
func testSystemStore(t *testing.T, ss store.Store) {
system := &model.System{Name: model.NewId(), Value: "value"}
store.Must(ss.System().Save(system))
err := ss.System().Save(system)
require.Nil(t, err)
result := <-ss.System().Get()
systems := result.Data.(model.StringMap)
systems, _ := ss.System().Get()
require.Equal(t, system.Value, systems[system.Name])
system.Value = "value2"
store.Must(ss.System().Update(system))
result2 := <-ss.System().Get()
systems2 := result2.Data.(model.StringMap)
err = ss.System().Update(system)
require.Nil(t, err)
systems2, _ := ss.System().Get()
require.Equal(t, system.Value, systems2[system.Name])
result3 := <-ss.System().GetByName(system.Name)
rsystem := result3.Data.(*model.System)
rsystem, _ := ss.System().GetByName(system.Name)
require.Equal(t, system.Value, rsystem.Value)
}
func testSystemStoreSaveOrUpdate(t *testing.T, ss store.Store) {
system := &model.System{Name: model.NewId(), Value: "value"}
if err := (<-ss.System().SaveOrUpdate(system)).Err; err != nil {
if err := ss.System().SaveOrUpdate(system); err != nil {
t.Fatal(err)
}
system.Value = "value2"
if r := <-ss.System().SaveOrUpdate(system); r.Err != nil {
t.Fatal(r.Err)
if err := ss.System().SaveOrUpdate(system); err != nil {
t.Fatal(err)
}
}
@@ -59,31 +57,32 @@ func testSystemStorePermanentDeleteByName(t *testing.T, ss store.Store) {
s1 := &model.System{Name: model.NewId(), Value: "value"}
s2 := &model.System{Name: model.NewId(), Value: "value"}
store.Must(ss.System().Save(s1))
store.Must(ss.System().Save(s2))
err := ss.System().Save(s1)
require.Nil(t, err)
err = ss.System().Save(s2)
require.Nil(t, err)
res1 := <-ss.System().GetByName(s1.Name)
assert.Nil(t, res1.Err)
_, err = ss.System().GetByName(s1.Name)
assert.Nil(t, err)
res2 := <-ss.System().GetByName(s2.Name)
assert.Nil(t, res2.Err)
_, err = ss.System().GetByName(s2.Name)
assert.Nil(t, err)
res3 := <-ss.System().PermanentDeleteByName(s1.Name)
assert.Nil(t, res3.Err)
_, err = ss.System().PermanentDeleteByName(s1.Name)
assert.Nil(t, err)
res4 := <-ss.System().GetByName(s1.Name)
assert.NotNil(t, res4.Err)
_, err = ss.System().GetByName(s1.Name)
assert.NotNil(t, err)
res5 := <-ss.System().GetByName(s2.Name)
assert.Nil(t, res5.Err)
_, err = ss.System().GetByName(s2.Name)
assert.Nil(t, err)
res6 := <-ss.System().PermanentDeleteByName(s2.Name)
assert.Nil(t, res6.Err)
_, err = ss.System().PermanentDeleteByName(s2.Name)
assert.Nil(t, err)
res7 := <-ss.System().GetByName(s1.Name)
assert.NotNil(t, res7.Err)
res8 := <-ss.System().GetByName(s2.Name)
assert.NotNil(t, res8.Err)
_, err = ss.System().GetByName(s1.Name)
assert.NotNil(t, err)
_, err = ss.System().GetByName(s2.Name)
assert.NotNil(t, err)
}