From 9ab1d8f805c6a7e9b560f3f71d051dc0fb51137e Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Mon, 12 Dec 2022 14:59:47 +0530 Subject: [PATCH] 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 --- app/plugin_db_driver.go | 6 +++++- app/plugin_db_driver_test.go | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/plugin_db_driver_test.go diff --git a/app/plugin_db_driver.go b/app/plugin_db_driver.go index 753bd0671c..a29fa7467f 100644 --- a/app/plugin_db_driver.go +++ b/app/plugin_db_driver.go @@ -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 } diff --git a/app/plugin_db_driver_test.go b/app/plugin_db_driver_test.go new file mode 100644 index 0000000000..a2c428fb6f --- /dev/null +++ b/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) +}