This is an automated email from the ASF dual-hosted git repository.

tew pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-seata-go.git


The following commit(s) were added to refs/heads/master by this push:
     new 623c02ef bugfix: fix connection leaks and potential nil pointer 
panic(#991) (#997)
623c02ef is described below

commit 623c02ef5aebf1d86fcc6aa26e65faecf9337e64
Author: 花国栋 <[email protected]>
AuthorDate: Sat Dec 20 15:53:31 2025 +0800

    bugfix: fix connection leaks and potential nil pointer panic(#991) (#997)
    
    * bugfix: fix connection leaks and potential nil pointer panic(#991)
    
    * bugfix: fix connection leaks and potential nil pointer panic(#991)
    
    ---------
    
    Co-authored-by: jimin <[email protected]>
    Co-authored-by: Tew <[email protected]>
    Co-authored-by: TewGuo <[email protected]>
---
 changes/dev.md                                        |  1 +
 pkg/datasource/sql/async_worker.go                    |  1 +
 pkg/datasource/sql/datasource/base/meta_cache.go      |  1 +
 pkg/datasource/sql/datasource/base/meta_cache_test.go | 17 +++++++----------
 pkg/datasource/sql/db.go                              |  2 ++
 5 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/changes/dev.md b/changes/dev.md
index 0c8e5acc..cfec2483 100755
--- a/changes/dev.md
+++ b/changes/dev.md
@@ -30,6 +30,7 @@
 ### bugfix:
 
   - [[#130](https://github.com/apache/incubator-seata-go/pull/130)] getty 
session auto close bug
+  - [[#991](https://github.com/apache/incubator-seata-go/issues/991)] fix 
connection leaks and prevent nil pointer panic in async worker
 
 ### optimize:
 
diff --git a/pkg/datasource/sql/async_worker.go 
b/pkg/datasource/sql/async_worker.go
index 44be4e86..aab6ddeb 100644
--- a/pkg/datasource/sql/async_worker.go
+++ b/pkg/datasource/sql/async_worker.go
@@ -190,6 +190,7 @@ func (aw *AsyncWorker) dealWithGroupedContexts(resID 
string, phaseCtxs []phaseTw
                for i := range phaseCtxs {
                        aw.commitQueue <- phaseCtxs[i]
                }
+               return
        }
 
        defer conn.Close()
diff --git a/pkg/datasource/sql/datasource/base/meta_cache.go 
b/pkg/datasource/sql/datasource/base/meta_cache.go
index 80652c4a..9eaea492 100644
--- a/pkg/datasource/sql/datasource/base/meta_cache.go
+++ b/pkg/datasource/sql/datasource/base/meta_cache.go
@@ -106,6 +106,7 @@ func (c *BaseTableMetaCache) refresh(ctx context.Context) {
                if err != nil {
                        return
                }
+               defer conn.Close()
                v, err := c.trigger.LoadAll(ctx, c.cfg.DBName, conn, tables...)
                if err != nil {
                        return
diff --git a/pkg/datasource/sql/datasource/base/meta_cache_test.go 
b/pkg/datasource/sql/datasource/base/meta_cache_test.go
index e0a5ed61..dff26f0e 100644
--- a/pkg/datasource/sql/datasource/base/meta_cache_test.go
+++ b/pkg/datasource/sql/datasource/base/meta_cache_test.go
@@ -108,7 +108,6 @@ func TestBaseTableMetaCache_refresh(t *testing.T) {
                                cancel:  cancel,
                                trigger: &mockTrigger{},
                                cfg:     &mysql.Config{},
-                               db:      &sql.DB{},
                        },
                        args: args{ctx: ctx},
                        want: testdata.MockWantTypesMeta("test"),
@@ -128,7 +127,6 @@ func TestBaseTableMetaCache_refresh(t *testing.T) {
                                cancel:  cancel,
                                trigger: &mockTrigger{},
                                cfg:     &mysql.Config{},
-                               db:      &sql.DB{},
                        },
                        args: args{ctx: ctx},
                        want: testdata.MockWantTypesMeta("TEST"),
@@ -136,13 +134,12 @@ func TestBaseTableMetaCache_refresh(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-
-                       connStub := gomonkey.ApplyMethodFunc(tt.fields.db, 
"Conn",
-                               func(_ context.Context) (*sql.Conn, error) {
-                                       return &sql.Conn{}, nil
-                               })
-
-                       defer connStub.Reset()
+                       //  Use sqlmock to simulate a database connection
+                       db, _, err := sqlmock.New()
+                       if err != nil {
+                               t.Fatalf("Failed to create sqlmock: %v", err)
+                       }
+                       defer db.Close()
 
                        loadAllStub := 
gomonkey.ApplyMethodFunc(tt.fields.trigger, "LoadAll",
                                func(_ context.Context, _ string, _ *sql.Conn, 
_ ...string) ([]types.TableMeta, error) {
@@ -158,7 +155,7 @@ func TestBaseTableMetaCache_refresh(t *testing.T) {
                                cache:          tt.fields.cache,
                                cancel:         tt.fields.cancel,
                                trigger:        tt.fields.trigger,
-                               db:             tt.fields.db,
+                               db:             db,
                                cfg:            tt.fields.cfg,
                        }
                        go c.refresh(tt.args.ctx)
diff --git a/pkg/datasource/sql/db.go b/pkg/datasource/sql/db.go
index d347b15b..9f260717 100644
--- a/pkg/datasource/sql/db.go
+++ b/pkg/datasource/sql/db.go
@@ -129,7 +129,9 @@ func (db *DBResource) init() {
        conn, err := db.connector.Connect(ctx)
        if err != nil {
                log.Errorf("connect: %v", err)
+               return
        }
+       defer conn.Close()
        version, err := selectDBVersion(ctx, conn)
        if err != nil {
                log.Errorf("select db version: %v", err)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to