diff --git a/store/sqlstore/store.go b/store/sqlstore/store.go index e28c780891..d44ec6922e 100644 --- a/store/sqlstore/store.go +++ b/store/sqlstore/store.go @@ -351,7 +351,20 @@ func (ss *SqlStore) Context() context.Context { } func (ss *SqlStore) initConnection() { - ss.master = setupConnection("master", *ss.settings.DataSource, ss.settings) + dataSource := *ss.settings.DataSource + if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + // TODO: We ignore the readTimeout datasource parameter for MySQL since QueryTimeout + // covers that already. Ideally we'd like to do this only for the upgrade + // step. To be reviewed in MM-35789. + var err error + dataSource, err = resetReadTimeout(dataSource) + if err != nil { + mlog.Critical("Failed to reset read timeout from datasource.", mlog.Err(err)) + os.Exit(ExitGenericFailure) + } + } + + ss.master = setupConnection("master", dataSource, ss.settings) if len(ss.settings.DataSourceReplicas) > 0 { ss.Replicas = make([]*gorp.DbMap, len(ss.settings.DataSourceReplicas)) @@ -1489,6 +1502,15 @@ func (ss *SqlStore) appendMultipleStatementsFlag(dataSource string) (string, err return dataSource, nil } +func resetReadTimeout(dataSource string) (string, error) { + config, err := mysql.ParseDSN(dataSource) + if err != nil { + return "", err + } + config.ReadTimeout = 0 + return config.FormatDSN(), nil +} + type mattermConverter struct{} func (me mattermConverter) ToDb(val interface{}) (interface{}, error) { diff --git a/store/sqlstore/store_test.go b/store/sqlstore/store_test.go index 61ea2d6173..b31f3d550c 100644 --- a/store/sqlstore/store_test.go +++ b/store/sqlstore/store_test.go @@ -9,6 +9,7 @@ import ( "regexp" "sync" "testing" + "time" "github.com/go-sql-driver/mysql" "github.com/lib/pq" @@ -674,3 +675,23 @@ func TestExecNoTimeout(t *testing.T) { require.NoError(t, err) }) } + +func TestMySQLReadTimeout(t *testing.T) { + settings := makeSqlSettings(model.DATABASE_DRIVER_MYSQL) + dataSource := *settings.DataSource + config, err := mysql.ParseDSN(dataSource) + require.NoError(t, err) + + config.ReadTimeout = 1 * time.Second + dataSource = config.FormatDSN() + settings.DataSource = &dataSource + + store := &SqlStore{ + settings: settings, + } + store.initConnection() + defer store.Close() + + _, err = store.GetMaster().ExecNoTimeout(`SELECT SLEEP(3)`) + require.NoError(t, err) +}