Skip to content

Commit 735d7f9

Browse files
authored
Merge pull request #1601 from k8s-infra-cherrypick-robot/cherry-pick-1558-to-release-1.11
[release-1.11] change GetDisk error reporting to temporary in CreateVolume codepath
2 parents 08d314d + eb48ff3 commit 735d7f9

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

pkg/gce-cloud-provider/compute/gce-compute.go

+17-7
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,9 @@ func (cloud *CloudProvider) insertRegionalDisk(
515515
if IsGCEError(err, "alreadyExists") {
516516
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
517517
if err != nil {
518-
return err
518+
// failed to GetDisk, however the Disk may already exist
519+
// the error code should be non-Final
520+
return status.Error(codes.Unavailable, err.Error())
519521
}
520522
err = cloud.ValidateExistingDisk(ctx, disk, params,
521523
int64(capacityRange.GetRequiredBytes()),
@@ -527,16 +529,19 @@ func (cloud *CloudProvider) insertRegionalDisk(
527529
klog.Warningf("GCE PD %s already exists, reusing", volKey.Name)
528530
return nil
529531
}
530-
return status.Error(codes.Internal, fmt.Sprintf("unknown Insert disk error: %v", err.Error()))
532+
// if the error code is considered "final", RegionDisks.Insert might not be retried
533+
return fmt.Errorf("unknown Insert Regional disk error: %w", err)
531534
}
532535
klog.V(5).Infof("InsertDisk operation %s for disk %s", opName, diskToCreate.Name)
533536

534537
err = cloud.waitForRegionalOp(ctx, project, opName, volKey.Region)
538+
// failed to wait for Op to finish, however, the Op possibly is still running as expected
539+
// the error code returned should be non-final
535540
if err != nil {
536541
if IsGCEError(err, "alreadyExists") {
537542
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
538543
if err != nil {
539-
return err
544+
return status.Errorf(codes.Unavailable, "error when getting disk: %v", err.Error())
540545
}
541546
err = cloud.ValidateExistingDisk(ctx, disk, params,
542547
int64(capacityRange.GetRequiredBytes()),
@@ -548,7 +553,7 @@ func (cloud *CloudProvider) insertRegionalDisk(
548553
klog.Warningf("GCE PD %s already exists after wait, reusing", volKey.Name)
549554
return nil
550555
}
551-
return fmt.Errorf("unknown Insert disk operation error: %w", err)
556+
return status.Errorf(codes.Unavailable, "unknown error when polling the operation: %v", err.Error())
552557
}
553558
return nil
554559
}
@@ -627,7 +632,9 @@ func (cloud *CloudProvider) insertZonalDisk(
627632
if IsGCEError(err, "alreadyExists") {
628633
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
629634
if err != nil {
630-
return err
635+
// failed to GetDisk, however the Disk may already exist
636+
// the error code should be non-Final
637+
return status.Error(codes.Unavailable, err.Error())
631638
}
632639
err = cloud.ValidateExistingDisk(ctx, disk, params,
633640
int64(capacityRange.GetRequiredBytes()),
@@ -639,17 +646,20 @@ func (cloud *CloudProvider) insertZonalDisk(
639646
klog.Warningf("GCE PD %s already exists, reusing", volKey.Name)
640647
return nil
641648
}
649+
// if the error code is considered "final", Disks.Insert might not be retried
642650
return fmt.Errorf("unknown Insert disk error: %w", err)
643651
}
644652
klog.V(5).Infof("InsertDisk operation %s for disk %s", opName, diskToCreate.Name)
645653

646654
err = cloud.waitForZonalOp(ctx, project, opName, volKey.Zone)
647655

648656
if err != nil {
657+
// failed to wait for Op to finish, however, the Op possibly is still running as expected
658+
// the error code returned should be non-final
649659
if IsGCEError(err, "alreadyExists") {
650660
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
651661
if err != nil {
652-
return err
662+
return status.Errorf(codes.Unavailable, "error when getting disk: %v", err.Error())
653663
}
654664
err = cloud.ValidateExistingDisk(ctx, disk, params,
655665
int64(capacityRange.GetRequiredBytes()),
@@ -661,7 +671,7 @@ func (cloud *CloudProvider) insertZonalDisk(
661671
klog.Warningf("GCE PD %s already exists after wait, reusing", volKey.Name)
662672
return nil
663673
}
664-
return fmt.Errorf("unknown Insert disk operation error: %w", err)
674+
return status.Errorf(codes.Unavailable, "unknown error when polling the operation: %v", err.Error())
665675
}
666676
return nil
667677
}

pkg/gce-pd-csi-driver/controller.go

+10-7
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,8 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
308308
existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion)
309309
if err != nil {
310310
if !gce.IsGCEError(err, "notFound") {
311-
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err)
311+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
312+
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", status.Error(codes.Unavailable, err.Error()))
312313
}
313314
}
314315
if err == nil {
@@ -323,10 +324,10 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
323324

324325
ready, err := isDiskReady(existingDisk)
325326
if err != nil {
326-
return nil, common.LoggedError("CreateVolume disk "+volKey.String()+" had error checking ready status: ", err)
327+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk %q had error checking ready status: %v", volKey.String(), err.Error())
327328
}
328329
if !ready {
329-
return nil, status.Errorf(codes.Internal, "CreateVolume existing disk %v is not ready", volKey)
330+
return nil, status.Errorf(codes.Aborted, "CreateVolume existing disk %v is not ready", volKey)
330331
}
331332

332333
// If there is no validation error, immediately return success
@@ -401,10 +402,10 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
401402
// Verify the source disk is ready.
402403
ready, err := isDiskReady(diskFromSourceVolume)
403404
if err != nil {
404-
return nil, common.LoggedError("CreateVolume disk from source volume "+sourceVolKey.String()+" had error checking ready status: ", err)
405+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk from source volume %q had error checking ready status: %v", sourceVolKey.String(), err.Error())
405406
}
406407
if !ready {
407-
return nil, status.Errorf(codes.Internal, "CreateVolume disk from source volume %v is not ready", sourceVolKey)
408+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk from source volume %v is not ready", sourceVolKey)
408409
}
409410
}
410411
} else { // if VolumeContentSource is nil, validate access mode is not read only
@@ -1840,9 +1841,10 @@ func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name
18401841
if multiWriter {
18411842
gceAPIVersion = gce.GCEAPIVersionBeta
18421843
}
1844+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
18431845
disk, err := cloudProvider.GetDisk(ctx, project, meta.RegionalKey(name, region), gceAPIVersion)
18441846
if err != nil {
1845-
return nil, fmt.Errorf("failed to get disk after creating regional disk: %w", err)
1847+
return nil, status.Errorf(codes.Unavailable, "failed to get disk after creating regional disk: %v", err.Error())
18461848
}
18471849
return disk, nil
18481850
}
@@ -1862,9 +1864,10 @@ func createSingleZoneDisk(ctx context.Context, cloudProvider gce.GCECompute, nam
18621864
if multiWriter {
18631865
gceAPIVersion = gce.GCEAPIVersionBeta
18641866
}
1867+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
18651868
disk, err := cloudProvider.GetDisk(ctx, project, meta.ZonalKey(name, diskZone), gceAPIVersion)
18661869
if err != nil {
1867-
return nil, err
1870+
return nil, status.Errorf(codes.Unavailable, "failed to get disk after creating zonal disk: %v", err.Error())
18681871
}
18691872
return disk, nil
18701873
}

0 commit comments

Comments
 (0)