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>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3b043c1f12
Коммит
9ab1d8f805
@@ -8,6 +8,7 @@ import (
|
|||||||
"database/sql"
|
"database/sql"
|
||||||
"database/sql/driver"
|
"database/sql/driver"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/mattermost/mattermost-server/v6/model"
|
"github.com/mattermost/mattermost-server/v6/model"
|
||||||
"github.com/mattermost/mattermost-server/v6/plugin"
|
"github.com/mattermost/mattermost-server/v6/plugin"
|
||||||
@@ -44,7 +45,10 @@ func (d *DriverImpl) Conn(isMaster bool) (string, error) {
|
|||||||
if !isMaster {
|
if !isMaster {
|
||||||
dbFunc = d.s.Platform().Store.GetInternalReplicaDB
|
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 {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
21
app/plugin_db_driver_test.go
Обычный файл
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)
|
||||||
|
}
|
||||||
Ссылка в новой задаче
Block a user