From 33a88aac3e435449980943cda149055ad0b35715 Mon Sep 17 00:00:00 2001 From: James Lu Date: Thu, 19 Dec 2024 09:18:33 +0800 Subject: [PATCH] fix(backup): return backupVolume object if not found ref: longhorn/longhorn 5411, 9987 Signed-off-by: James Lu --- csi/controller_server.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/csi/controller_server.go b/csi/controller_server.go index 735a7195e5..87e9e06c58 100644 --- a/csi/controller_server.go +++ b/csi/controller_server.go @@ -128,7 +128,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol } backupVolume, backupName := sourceVolumeName, id bv, err := cs.getBackupVolume(backupVolume) - if err != nil { + if bv == nil || err != nil { return nil, status.Errorf(codes.NotFound, "failed to restore CSI snapshot %s backup volume %s unavailable", snapshot.SnapshotId, backupVolume) } @@ -266,6 +266,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol } func (cs *ControllerServer) getBackupVolume(volumeName string) (*longhornclient.BackupVolume, error) { + log := cs.log.WithFields(logrus.Fields{"function": "getBackupVolume"}) vol, err := cs.apiClient.Volume.ById(volumeName) if err != nil { return nil, errors.Wrapf(err, "getBackupVolume: fail to get source volume %v", volumeName) @@ -280,11 +281,12 @@ func (cs *ControllerServer) getBackupVolume(volumeName string) (*longhornclient. return nil, errors.Wrap(err, "failed to list backup volumes") } - if len(list.Data) >= 2 { + if len(list.Data) > 1 { return nil, fmt.Errorf("found multiple backup volumes for backup target %s and volume %s", vol.BackupTargetName, volumeName) } if len(list.Data) == 0 { - return nil, fmt.Errorf("failed to find backup volume for backup target %s and volume %s", vol.BackupTargetName, volumeName) + log.Debugf("cannot find backup volume with backup target %s and volume %s", vol.BackupTargetName, volumeName) + return nil, nil } return &list.Data[0], nil @@ -1245,7 +1247,7 @@ func (cs *ControllerServer) waitForBackupControllerSync(volumeName, snapshotName if err != nil { return nil, err } - if backup.SnapshotCreated != "" { + if backup != nil && backup.SnapshotCreated != "" { // The backup controller sets the snapshot creation time at first sync. If we do not wait to return until // this is done, we may see timestamp related errors in csi-snapshotter logs. return backup, nil @@ -1270,7 +1272,7 @@ func (cs *ControllerServer) waitForBackupControllerSync(volumeName, snapshotName if err != nil { return nil, err } - if backup.SnapshotCreated != "" { + if backup != nil && backup.SnapshotCreated != "" { return backup, nil } } @@ -1287,6 +1289,10 @@ func (cs *ControllerServer) getBackup(volumeName, snapshotName string) (*longhor if err != nil { return nil, status.Error(codes.Internal, err.Error()) } + if backupVolume == nil { + return nil, nil + } + backupListOutput, err := cs.apiClient.BackupVolume.ActionBackupList(backupVolume) if err != nil { return nil, status.Error(codes.Internal, err.Error())