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>
Этот коммит содержится в:
Agniva De Sarker
2025-03-20 11:38:29 +05:30
коммит произвёл GitHub
родитель 3b9f9b209a
Коммит a51a8e9b60
2 изменённых файлов: 47 добавлений и 2 удалений

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

@@ -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")