MM-62964: Skip setting replica lag handle in case of an error (#30498)
Previously, we would set it to nil pointer which would eventually cause a panic when ReplicaLagAbs/ReplicaLagTime would get called. https://mattermost.atlassian.net/browse/MM-62964 ```release-note NONE ``` Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3b9f9b209a
Коммит
a51a8e9b60
@@ -341,16 +341,17 @@ func (ss *SqlStore) initConnection() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(ss.settings.ReplicaLagSettings) > 0 {
|
if len(ss.settings.ReplicaLagSettings) > 0 {
|
||||||
ss.replicaLagHandles = make([]*dbsql.DB, len(ss.settings.ReplicaLagSettings))
|
ss.replicaLagHandles = make([]*dbsql.DB, 0, len(ss.settings.ReplicaLagSettings))
|
||||||
for i, src := range ss.settings.ReplicaLagSettings {
|
for i, src := range ss.settings.ReplicaLagSettings {
|
||||||
if src.DataSource == nil {
|
if src.DataSource == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ss.replicaLagHandles[i], err = sqlUtils.SetupConnection(ss.Logger(), fmt.Sprintf(replicaLagPrefix+"-%d", i), *src.DataSource, ss.settings, DBReplicaPingAttempts)
|
replicaLagHandle, err := sqlUtils.SetupConnection(ss.Logger(), fmt.Sprintf(replicaLagPrefix+"-%d", i), *src.DataSource, ss.settings, DBReplicaPingAttempts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
mlog.Warn("Failed to setup replica lag handle. Skipping..", mlog.String("db", fmt.Sprintf(replicaLagPrefix+"-%d", i)), mlog.Err(err))
|
mlog.Warn("Failed to setup replica lag handle. Skipping..", mlog.String("db", fmt.Sprintf(replicaLagPrefix+"-%d", i)), mlog.Err(err))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
ss.replicaLagHandles = append(ss.replicaLagHandles, replicaLagHandle)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -795,6 +795,50 @@ func TestReplicaLagQuery(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInvalidReplicaLagDataSource(t *testing.T) {
|
||||||
|
logger := mlog.CreateConsoleTestLogger(t)
|
||||||
|
|
||||||
|
testDrivers := []string{
|
||||||
|
model.DatabaseDriverPostgres,
|
||||||
|
model.DatabaseDriverMysql,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, driver := range testDrivers {
|
||||||
|
t.Run(driver, func(t *testing.T) {
|
||||||
|
settings, err := makeSqlSettings(driver)
|
||||||
|
if err != nil {
|
||||||
|
t.Skip(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set an invalid DataSource that will fail to connect
|
||||||
|
settings.ReplicaLagSettings = []*model.ReplicaLagSettings{{
|
||||||
|
DataSource: model.NewPointer("invalid://connection/string"),
|
||||||
|
QueryAbsoluteLag: model.NewPointer("SELECT 1"),
|
||||||
|
QueryTimeLag: model.NewPointer("SELECT 1"),
|
||||||
|
}}
|
||||||
|
|
||||||
|
mockMetrics := &mocks.MetricsInterface{}
|
||||||
|
mockMetrics.On("RegisterDBCollector", mock.AnythingOfType("*sql.DB"), "master")
|
||||||
|
|
||||||
|
store := &SqlStore{
|
||||||
|
rrCounter: 0,
|
||||||
|
srCounter: 0,
|
||||||
|
settings: settings,
|
||||||
|
metrics: mockMetrics,
|
||||||
|
logger: logger,
|
||||||
|
quitMonitor: make(chan struct{}),
|
||||||
|
wgMonitor: &sync.WaitGroup{},
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, store.initConnection())
|
||||||
|
defer store.Close()
|
||||||
|
|
||||||
|
// Verify no replica lag handles were added despite having ReplicaLagSettings
|
||||||
|
assert.Equal(t, 0, len(store.replicaLagHandles))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var errDriverMismatch = errors.New("database drivers mismatch")
|
var errDriverMismatch = errors.New("database drivers mismatch")
|
||||||
var errDriverUnsupported = errors.New("database driver not supported")
|
var errDriverUnsupported = errors.New("database driver not supported")
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user