MM-48984: Add missing timeout while creating a connection (#21847)

If a timeout is missing, this goroutine waits indefinitely trying
to get a connection. Leading to a goroutine accumulation in a scenario
where the DB is somehow not release connections.

https://mattermost.atlassian.net/browse/MM-48984

```release-note
NONE
```

Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
Agniva De Sarker
2022-12-12 14:59:47 +05:30
коммит произвёл GitHub
родитель 3b043c1f12
Коммит 9ab1d8f805
2 изменённых файлов: 26 добавлений и 1 удалений

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

@@ -8,6 +8,7 @@ import (
"database/sql"
"database/sql/driver"
"sync"
"time"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/mattermost/mattermost-server/v6/plugin"
@@ -44,7 +45,10 @@ func (d *DriverImpl) Conn(isMaster bool) (string, error) {
if !isMaster {
dbFunc = d.s.Platform().Store.GetInternalReplicaDB
}
conn, err := dbFunc().Conn(context.Background())
timeout := time.Duration(*d.s.Config().SqlSettings.QueryTimeout) * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
conn, err := dbFunc().Conn(ctx)
if err != nil {
return "", err
}

21
app/plugin_db_driver_test.go Обычный файл
Просмотреть файл

@@ -0,0 +1,21 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package app
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestConnCreateTimeout(t *testing.T) {
th := Setup(t)
defer th.TearDown()
*th.App.Config().SqlSettings.QueryTimeout = 0
d := NewDriverImpl(th.Server)
_, err := d.Conn(true)
require.Error(t, err)
}