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

woblerr pushed a commit to branch upgrade-go-1.25
in repository https://gitbox.apache.org/repos/asf/cloudberry-backup.git

commit 365aedf5a36a7482401c7b4441c226d3bd047acd
Author: woblerr <[email protected]>
AuthorDate: Fri Jun 26 00:08:18 2026 +0300

    Fix pgx v5 PgError handling.
    After moving to pgx v5, database errors are returned as
    pgx/v5/pgconn.PgError. The old jackc/pgconn type assertions no longer
    matched, so backup lock handling could treat unexpected errors as
    lock-not-available, and restore COPY errors could lose their CONTEXT.
    
    Use errors.As with pgx/v5 pgconn in backup and restore code, update the
    restore test, and remove the old pgconn dependency.
---
 backup/data.go       | 12 +++++++++---
 go.mod               |  6 +-----
 go.sum               | 11 -----------
 restore/data.go      |  5 +++--
 restore/data_test.go |  2 +-
 5 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/backup/data.go b/backup/data.go
index 9d937bae..e4571408 100644
--- a/backup/data.go
+++ b/backup/data.go
@@ -16,7 +16,7 @@ import (
        "github.com/apache/cloudberry-backup/utils"
        "github.com/apache/cloudberry-go-libs/dbconn"
        "github.com/apache/cloudberry-go-libs/gplog"
-       "github.com/jackc/pgconn"
+       "github.com/jackc/pgx/v5/pgconn"
        "gopkg.in/cheggaaa/pb.v1"
 )
 
@@ -214,13 +214,19 @@ func BackupDataForAllTables(tables []Table) 
[]map[uint32]int64 {
                                // tables before the metadata dumping part.
                                err := LockTableNoWait(table, whichConn)
                                if err != nil {
-                                       if pgErr, ok := err.(*pgconn.PgError); 
ok && pgErr.Code != PG_LOCK_NOT_AVAILABLE {
+                                       lockErr := err
+                                       var pgErr *pgconn.PgError
+                                       if !errors.As(lockErr, &pgErr) || 
pgErr.Code != PG_LOCK_NOT_AVAILABLE {
                                                isErroredBackup.Store(true)
                                                err = 
connectionPool.Rollback(whichConn)
                                                if err != nil {
                                                        gplog.Warn("Worker %d: 
%s", whichConn, err)
                                                }
-                                               
gplog.Fatal(fmt.Errorf("Unexpectedly unable to take lock on table %s, %s", 
table.FQN(), pgErr.Error()), "")
+                                               errMsg := lockErr.Error()
+                                               if pgErr != nil {
+                                                       errMsg = pgErr.Error()
+                                               }
+                                               
gplog.Fatal(fmt.Errorf("Unexpectedly unable to take lock on table %s, %s", 
table.FQN(), errMsg), "")
                                        }
                                        if gplog.GetVerbosity() < 
gplog.LOGVERBOSE {
                                                // Add a newline to interrupt 
the progress bar so that
diff --git a/go.mod b/go.mod
index 82aa29b8..37ab24fc 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
        github.com/blang/semver/v4 v4.0.0
        github.com/blang/vfs v1.0.0
        github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf
-       github.com/jackc/pgconn v1.14.3
+       github.com/jackc/pgx/v5 v5.9.2
        github.com/jmoiron/sqlx v1.3.5
        github.com/klauspost/compress v1.18.0
        github.com/lib/pq v1.10.7
@@ -47,12 +47,8 @@ require (
        github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
        github.com/google/uuid v1.6.0 // indirect
        github.com/inconshreveable/mousetrap v1.0.1 // indirect
-       github.com/jackc/chunkreader/v2 v2.0.1 // indirect
-       github.com/jackc/pgio v1.0.0 // indirect
        github.com/jackc/pgpassfile v1.0.0 // indirect
-       github.com/jackc/pgproto3/v2 v2.3.3 // indirect
        github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // 
indirect
-       github.com/jackc/pgx/v5 v5.9.2 // indirect
        github.com/jackc/puddle/v2 v2.2.2 // indirect
        github.com/jmespath/go-jmespath v0.4.0 // indirect
        github.com/jpillora/backoff v1.0.0 // indirect
diff --git a/go.sum b/go.sum
index 52082276..1de9bbcf 100644
--- a/go.sum
+++ b/go.sum
@@ -51,19 +51,8 @@ github.com/inconshreveable/mousetrap v1.0.1 
h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7P
 github.com/inconshreveable/mousetrap v1.0.1/go.mod 
h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf 
h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s=
 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod 
h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4=
-github.com/jackc/chunkreader/v2 v2.0.0/go.mod 
h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
-github.com/jackc/chunkreader/v2 v2.0.1 
h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
-github.com/jackc/chunkreader/v2 v2.0.1/go.mod 
h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
-github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w=
-github.com/jackc/pgconn v1.14.3/go.mod 
h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM=
-github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
-github.com/jackc/pgio v1.0.0/go.mod 
h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
-github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 
h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
-github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod 
h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
 github.com/jackc/pgpassfile v1.0.0 
h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 github.com/jackc/pgpassfile v1.0.0/go.mod 
h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
-github.com/jackc/pgproto3/v2 v2.3.3 
h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag=
-github.com/jackc/pgproto3/v2 v2.3.3/go.mod 
h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
 github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 
h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
 github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod 
h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
 github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw=
diff --git a/restore/data.go b/restore/data.go
index 44d21120..13ec4218 100644
--- a/restore/data.go
+++ b/restore/data.go
@@ -16,7 +16,7 @@ import (
        "github.com/apache/cloudberry-go-libs/cluster"
        "github.com/apache/cloudberry-go-libs/dbconn"
        "github.com/apache/cloudberry-go-libs/gplog"
-       "github.com/jackc/pgconn"
+       "github.com/jackc/pgx/v5/pgconn"
        "github.com/pkg/errors"
        "gopkg.in/cheggaaa/pb.v1"
 )
@@ -60,7 +60,8 @@ func CopyTableIn(connectionPool *dbconn.DBConn, tableName 
string, tableAttribute
                errStr := fmt.Sprintf("Error loading data into table %s", 
tableName)
 
                // The COPY ON SEGMENT error might contain useful CONTEXT output
-               if pgErr, ok := err.(*pgconn.PgError); ok && pgErr.Where != "" {
+               var pgErr *pgconn.PgError
+               if errors.As(err, &pgErr) && pgErr.Where != "" {
                        errStr = fmt.Sprintf("%s: %s", errStr, pgErr.Where)
                }
 
diff --git a/restore/data_test.go b/restore/data_test.go
index 01a03b05..2e1c9da4 100644
--- a/restore/data_test.go
+++ b/restore/data_test.go
@@ -10,7 +10,7 @@ import (
        "github.com/apache/cloudberry-backup/restore"
        "github.com/apache/cloudberry-backup/utils"
        "github.com/apache/cloudberry-go-libs/cluster"
-       "github.com/jackc/pgconn"
+       "github.com/jackc/pgx/v5/pgconn"
 
        . "github.com/onsi/ginkgo/v2"
        . "github.com/onsi/gomega"


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

Reply via email to