Skip to content

Commit e7e7077

Browse files
committed
fix(yugabyte): panic on err retry check
1 parent 31791ad commit e7e7077

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

Diff for: database/yugabytedb/yugabytedb.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"github.com/golang-migrate/migrate/v4"
1515
"github.com/golang-migrate/migrate/v4/database"
1616
"github.com/hashicorp/go-multierror"
17+
"github.com/jackc/pgconn"
18+
"github.com/jackc/pgerrcode"
1719
"github.com/lib/pq"
1820
"go.uber.org/atomic"
1921
)
@@ -462,18 +464,16 @@ func (c *YugabyteDB) newBackoff(ctx context.Context) backoff.BackOff {
462464
}
463465

464466
func errIsRetryable(err error) bool {
465-
pqErr := pq.Error{}
466-
if !errors.As(err, &pqErr) {
467+
var pgErr *pgconn.PgError
468+
if !errors.As(err, &pgErr) {
467469
return false
468470
}
469471

470-
code := string(pqErr.Code)
471-
472472
// Assume that it's safe to retry 08006 and XX000 because we check for lock existence
473473
// before creating and lock ID is primary key. Version field in migrations table is primary key too
474-
// and delete all versions is an idempotend operation.
475-
return code == "40001" || // Serialization error (optimistic locking conflict)
476-
code == "40P01" || // Deadlock
477-
code == "08006" || // Connection failure (node down, need to reconnect)
478-
code == "XX000" // Internal error (may happen during HA)
474+
// and delete all versions is an idempotent operation.
475+
return pgErr.Code == pgerrcode.SerializationFailure || // optimistic locking conflict
476+
pgErr.Code == pgerrcode.DeadlockDetected ||
477+
pgErr.Code == pgerrcode.ConnectionFailure || // node down, need to reconnect
478+
pgErr.Code == pgerrcode.InternalError // may happen during HA
479479
}

0 commit comments

Comments
 (0)