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 {
|
||||
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 {
|
||||
if src.DataSource == nil {
|
||||
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 {
|
||||
mlog.Warn("Failed to setup replica lag handle. Skipping..", mlog.String("db", fmt.Sprintf(replicaLagPrefix+"-%d", i)), mlog.Err(err))
|
||||
continue
|
||||
}
|
||||
ss.replicaLagHandles = append(ss.replicaLagHandles, replicaLagHandle)
|
||||
}
|
||||
}
|
||||
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 errDriverUnsupported = errors.New("database driver not supported")
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user