Skip to content

Commit 2500c20

Browse files
authored
fix: #658 (#659)
* fix: Fix the issue of the program getting stuck when starting. Add a MySQL connection timeout configuration * refactoring the DSN query string construction to use net/url.Values~ * fix : Add unit support for mysql database connection timeout configuration items
1 parent a68342b commit 2500c20

4 files changed

Lines changed: 52 additions & 19 deletions

File tree

.env.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ DB_CHARSET=
139139
# "info" level displays SQL statements
140140
# Refer to gorm.io/gorm/logger#LogLevel for detailed information.
141141
DB_GORM_LOG_LEVEL=
142+
# database connection timeout, default 5s
143+
DB_CONNECT_TIMEOUT=5s
144+
# database read timeout, default 30s
145+
DB_READ_TIMEOUT=30s
146+
# database write timeout, default 30s
147+
DB_WRITE_TIMEOUT=30s
142148

143149
DIFY_INVOCATION_CONNECTION_IDLE_TIMEOUT=120
144150

internal/db/init.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ func Init(config *app.Config) {
9898
Charset: config.DBCharset,
9999
Extras: config.DBExtras,
100100
LogLevel: config.DBGormLogLevel,
101+
ConnectTimeout: config.DBConnectTimeout,
102+
ReadTimeout: config.DBReadTimeout,
103+
WriteTimeout: config.DBWriteTimeout,
101104
})
102105
default:
103106
log.Panic("unsupported database type", "type", config.DBType)

internal/db/mysql/mysql.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"time"
66

7+
"net/url"
8+
79
gormConfig "github.com/langgenius/dify-plugin-daemon/internal/db/config"
810
"gorm.io/driver/mysql"
911
"gorm.io/gorm"
@@ -24,17 +26,23 @@ type MySQLConfig struct {
2426
Charset string
2527
Extras string
2628
LogLevel string
29+
ConnectTimeout time.Duration
30+
ReadTimeout time.Duration
31+
WriteTimeout time.Duration
2732
}
2833

2934
func InitPluginDB(config *MySQLConfig) (*gorm.DB, error) {
3035
// TODO: MySQL dose not support DB_EXTRAS now
3136
initializer := mysqlDbInitializer{
32-
host: config.Host,
33-
port: config.Port,
34-
user: config.User,
35-
password: config.Pass,
36-
sslMode: config.SSLMode,
37-
logLevel: config.LogLevel,
37+
host: config.Host,
38+
port: config.Port,
39+
user: config.User,
40+
password: config.Pass,
41+
sslMode: config.SSLMode,
42+
logLevel: config.LogLevel,
43+
connectTimeout: config.ConnectTimeout,
44+
readTimeout: config.ReadTimeout,
45+
writeTimeout: config.WriteTimeout,
3846
}
3947

4048
// first try to connect to target database
@@ -73,16 +81,27 @@ func InitPluginDB(config *MySQLConfig) (*gorm.DB, error) {
7381

7482
// mysqlDbInitializer initializes database for MySQL.
7583
type mysqlDbInitializer struct {
76-
host string
77-
port int
78-
user string
79-
password string
80-
sslMode string
81-
logLevel string
84+
host string
85+
port int
86+
user string
87+
password string
88+
sslMode string
89+
logLevel string
90+
connectTimeout time.Duration
91+
readTimeout time.Duration
92+
writeTimeout time.Duration
8293
}
8394

8495
func (m *mysqlDbInitializer) connect(dbName string) (*gorm.DB, error) {
85-
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=true&tls=%v", m.user, m.password, m.host, m.port, dbName, m.sslMode == "require")
96+
query := url.Values{}
97+
query.Set("charset", "utf8mb4")
98+
query.Set("parseTime", "true")
99+
query.Set("tls", fmt.Sprintf("%v", m.sslMode == "require"))
100+
query.Set("timeout", fmt.Sprintf("%s", m.connectTimeout))
101+
query.Set("readTimeout", fmt.Sprintf("%s", m.readTimeout))
102+
query.Set("writeTimeout", fmt.Sprintf("%s", m.writeTimeout))
103+
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s",
104+
m.user, m.password, m.host, m.port, dbName, query.Encode())
86105

87106
config := &gorm.Config{}
88107
if m.logLevel != "" {

internal/types/app/config.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"os"
88
"strings"
99

10+
"time"
11+
1012
"github.com/go-playground/validator/v10"
1113
gormConfig "github.com/langgenius/dify-plugin-daemon/internal/db/config"
1214
"github.com/langgenius/dify-plugin-daemon/pkg/entities/plugin_entities"
@@ -147,12 +149,15 @@ type Config struct {
147149
DBSslMode string `envconfig:"DB_SSL_MODE" validate:"required,oneof=disable require"`
148150

149151
// database connection pool settings
150-
DBMaxIdleConns int `envconfig:"DB_MAX_IDLE_CONNS" default:"10"`
151-
DBMaxOpenConns int `envconfig:"DB_MAX_OPEN_CONNS" default:"30"`
152-
DBConnMaxLifetime int `envconfig:"DB_CONN_MAX_LIFETIME" default:"3600"`
153-
DBExtras string `envconfig:"DB_EXTRAS"`
154-
DBCharset string `envconfig:"DB_CHARSET"`
155-
DBGormLogLevel string `envconfig:"DB_GORM_LOG_LEVEL"`
152+
DBMaxIdleConns int `envconfig:"DB_MAX_IDLE_CONNS" default:"10"`
153+
DBMaxOpenConns int `envconfig:"DB_MAX_OPEN_CONNS" default:"30"`
154+
DBConnMaxLifetime int `envconfig:"DB_CONN_MAX_LIFETIME" default:"3600"`
155+
DBExtras string `envconfig:"DB_EXTRAS"`
156+
DBCharset string `envconfig:"DB_CHARSET"`
157+
DBGormLogLevel string `envconfig:"DB_GORM_LOG_LEVEL"`
158+
DBConnectTimeout time.Duration `envconfig:"DB_CONNECT_TIMEOUT" default:"5s"`
159+
DBReadTimeout time.Duration `envconfig:"DB_READ_TIMEOUT" default:"30s"`
160+
DBWriteTimeout time.Duration `envconfig:"DB_WRITE_TIMEOUT" default:"30s"`
156161

157162
// persistence storage
158163
PersistenceStoragePath string `envconfig:"PERSISTENCE_STORAGE_PATH"`

0 commit comments

Comments
 (0)