diff --git a/br/pkg/aws/BUILD.bazel b/br/pkg/aws/BUILD.bazel index 4fed52b134b97..eb56eb2138a15 100644 --- a/br/pkg/aws/BUILD.bazel +++ b/br/pkg/aws/BUILD.bazel @@ -8,6 +8,7 @@ go_library( deps = [ "//br/pkg/config", "//br/pkg/glue", + "//br/pkg/utils", "//pkg/util", "@com_github_aws_aws_sdk_go//aws", "@com_github_aws_aws_sdk_go//aws/awserr", diff --git a/br/pkg/aws/ebs.go b/br/pkg/aws/ebs.go index fc4169e6fb817..d95973551a4eb 100644 --- a/br/pkg/aws/ebs.go +++ b/br/pkg/aws/ebs.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/br/pkg/config" "github.com/pingcap/tidb/br/pkg/glue" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/pkg/util" "go.uber.org/atomic" "go.uber.org/zap" @@ -252,7 +253,7 @@ func (e *EC2Session) WaitSnapshotsCreated(snapIDMap map[string]string, progress log.Info("snapshot completed", zap.String("id", *s.SnapshotId)) totalVolumeSize += *s.VolumeSize } else if *s.State == ec2.SnapshotStateError { - log.Error("snapshot failed", zap.String("id", *s.SnapshotId), zap.String("error", (*s.StateMessage))) + log.Error("snapshot failed", zap.String("id", *s.SnapshotId), zap.String("error", utils.GetOrZero(s.StateMessage))) return 0, errors.Errorf("snapshot %s failed", *s.SnapshotId) } else { log.Debug("snapshot creating...", zap.Stringer("snap", s)) diff --git a/br/pkg/aws/ebs_test.go b/br/pkg/aws/ebs_test.go index 96fcf358ff952..b44ebac8e4b07 100644 --- a/br/pkg/aws/ebs_test.go +++ b/br/pkg/aws/ebs_test.go @@ -145,6 +145,25 @@ func TestWaitSnapshotsCreated(t *testing.T) { expectedSize: 0, expectErr: true, }, + { + desc: "snapshot failed w/out state message", + snapshotsOutput: ec2.DescribeSnapshotsOutput{ + Snapshots: []*ec2.Snapshot{ + { + SnapshotId: awsapi.String("snap-1"), + VolumeSize: awsapi.Int64(1), + State: awsapi.String(ec2.SnapshotStateCompleted), + }, + { + SnapshotId: awsapi.String("snap-2"), + State: awsapi.String(ec2.SnapshotStateError), + StateMessage: nil, + }, + }, + }, + expectedSize: 0, + expectErr: true, + }, { desc: "snapshots pending", snapshotsOutput: ec2.DescribeSnapshotsOutput{ diff --git a/br/pkg/utils/BUILD.bazel b/br/pkg/utils/BUILD.bazel index edbbc4dcf2bb5..d776456ca914b 100644 --- a/br/pkg/utils/BUILD.bazel +++ b/br/pkg/utils/BUILD.bazel @@ -11,6 +11,7 @@ go_library( "key.go", "misc.go", "permission.go", + "pointer.go", "pprof.go", "progress.go", "register.go", diff --git a/br/pkg/utils/pointer.go b/br/pkg/utils/pointer.go new file mode 100644 index 0000000000000..6f54653a53d7f --- /dev/null +++ b/br/pkg/utils/pointer.go @@ -0,0 +1,13 @@ +// Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. + +package utils + +// GetOrZero returns the value pointed to by p, or a zero value of +// its type if p is nil. +func GetOrZero[T any](p *T) T { + var zero T + if p == nil { + return zero + } + return *p +}