Skip to content

Commit d67a539

Browse files
authored
Merge pull request #1604 from mattcary/orphan-18
Cherry-pick #1558 to release-1.8
2 parents 274ddc8 + ee27d3b commit d67a539

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
@@ -504,7 +504,9 @@ func (cloud *CloudProvider) insertRegionalDisk(
504504
if IsGCEError(err, "alreadyExists") {
505505
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
506506
if err != nil {
507-
return err
507+
// failed to GetDisk, however the Disk may already exist
508+
// the error code should be non-Final
509+
return status.Error(codes.Unavailable, err.Error())
508510
}
509511
err = cloud.ValidateExistingDisk(ctx, disk, params,
510512
int64(capacityRange.GetRequiredBytes()),
@@ -516,16 +518,19 @@ func (cloud *CloudProvider) insertRegionalDisk(
516518
klog.Warningf("GCE PD %s already exists, reusing", volKey.Name)
517519
return nil
518520
}
519-
return status.Error(codes.Internal, fmt.Sprintf("unknown Insert disk error: %v", err.Error()))
521+
// if the error code is considered "final", RegionDisks.Insert might not be retried
522+
return fmt.Errorf("unknown Insert Regional disk error: %w", err)
520523
}
521524
klog.V(5).Infof("InsertDisk operation %s for disk %s", opName, diskToCreate.Name)
522525

523526
err = cloud.waitForRegionalOp(ctx, project, opName, volKey.Region)
527+
// failed to wait for Op to finish, however, the Op possibly is still running as expected
528+
// the error code returned should be non-final
524529
if err != nil {
525530
if IsGCEError(err, "alreadyExists") {
526531
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
527532
if err != nil {
528-
return err
533+
return status.Errorf(codes.Unavailable, "error when getting disk: %v", err.Error())
529534
}
530535
err = cloud.ValidateExistingDisk(ctx, disk, params,
531536
int64(capacityRange.GetRequiredBytes()),
@@ -537,7 +542,7 @@ func (cloud *CloudProvider) insertRegionalDisk(
537542
klog.Warningf("GCE PD %s already exists after wait, reusing", volKey.Name)
538543
return nil
539544
}
540-
return fmt.Errorf("unknown Insert disk operation error: %w", err)
545+
return status.Errorf(codes.Unavailable, "unknown error when polling the operation: %v", err.Error())
541546
}
542547
return nil
543548
}
@@ -616,7 +621,9 @@ func (cloud *CloudProvider) insertZonalDisk(
616621
if IsGCEError(err, "alreadyExists") {
617622
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
618623
if err != nil {
619-
return err
624+
// failed to GetDisk, however the Disk may already exist
625+
// the error code should be non-Final
626+
return status.Error(codes.Unavailable, err.Error())
620627
}
621628
err = cloud.ValidateExistingDisk(ctx, disk, params,
622629
int64(capacityRange.GetRequiredBytes()),
@@ -628,17 +635,20 @@ func (cloud *CloudProvider) insertZonalDisk(
628635
klog.Warningf("GCE PD %s already exists, reusing", volKey.Name)
629636
return nil
630637
}
638+
// if the error code is considered "final", Disks.Insert might not be retried
631639
return fmt.Errorf("unknown Insert disk error: %w", err)
632640
}
633641
klog.V(5).Infof("InsertDisk operation %s for disk %s", opName, diskToCreate.Name)
634642

635643
err = cloud.waitForZonalOp(ctx, project, opName, volKey.Zone)
636644

637645
if err != nil {
646+
// failed to wait for Op to finish, however, the Op possibly is still running as expected
647+
// the error code returned should be non-final
638648
if IsGCEError(err, "alreadyExists") {
639649
disk, err := cloud.GetDisk(ctx, project, volKey, gceAPIVersion)
640650
if err != nil {
641-
return err
651+
return status.Errorf(codes.Unavailable, "error when getting disk: %v", err.Error())
642652
}
643653
err = cloud.ValidateExistingDisk(ctx, disk, params,
644654
int64(capacityRange.GetRequiredBytes()),
@@ -650,7 +660,7 @@ func (cloud *CloudProvider) insertZonalDisk(
650660
klog.Warningf("GCE PD %s already exists after wait, reusing", volKey.Name)
651661
return nil
652662
}
653-
return fmt.Errorf("unknown Insert disk operation error: %w", err)
663+
return status.Errorf(codes.Unavailable, "unknown error when polling the operation: %v", err.Error())
654664
}
655665
return nil
656666
}

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

+10-7
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,8 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
284284
existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion)
285285
if err != nil {
286286
if !gce.IsGCEError(err, "notFound") {
287-
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err)
287+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
288+
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", status.Error(codes.Unavailable, err.Error()))
288289
}
289290
}
290291
if err == nil {
@@ -299,10 +300,10 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
299300

300301
ready, err := isDiskReady(existingDisk)
301302
if err != nil {
302-
return nil, common.LoggedError("CreateVolume disk "+volKey.String()+" had error checking ready status: ", err)
303+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk %q had error checking ready status: %v", volKey.String(), err.Error())
303304
}
304305
if !ready {
305-
return nil, status.Errorf(codes.Internal, "CreateVolume existing disk %v is not ready", volKey)
306+
return nil, status.Errorf(codes.Aborted, "CreateVolume existing disk %v is not ready", volKey)
306307
}
307308

308309
// If there is no validation error, immediately return success
@@ -378,10 +379,10 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
378379
// Verify the source disk is ready.
379380
ready, err := isDiskReady(diskFromSourceVolume)
380381
if err != nil {
381-
return nil, common.LoggedError("CreateVolume disk from source volume "+sourceVolKey.String()+" had error checking ready status: ", err)
382+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk from source volume %q had error checking ready status: %v", sourceVolKey.String(), err.Error())
382383
}
383384
if !ready {
384-
return nil, status.Errorf(codes.Internal, "CreateVolume disk from source volume %v is not ready", sourceVolKey)
385+
return nil, status.Errorf(codes.Aborted, "CreateVolume disk from source volume %v is not ready", sourceVolKey)
385386
}
386387
}
387388
} else { // if VolumeContentSource is nil, validate access mode is not read only
@@ -1734,9 +1735,10 @@ func createRegionalDisk(ctx context.Context, cloudProvider gce.GCECompute, name
17341735
gceAPIVersion = gce.GCEAPIVersionBeta
17351736
}
17361737

1738+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
17371739
disk, err := cloudProvider.GetDisk(ctx, project, meta.RegionalKey(name, region), gceAPIVersion)
17381740
if err != nil {
1739-
return nil, fmt.Errorf("failed to get disk after creating regional disk: %w", err)
1741+
return nil, status.Errorf(codes.Unavailable, "failed to get disk after creating regional disk: %v", err.Error())
17401742
}
17411743
return disk, nil
17421744
}
@@ -1756,9 +1758,10 @@ func createSingleZoneDisk(ctx context.Context, cloudProvider gce.GCECompute, nam
17561758
if multiWriter {
17571759
gceAPIVersion = gce.GCEAPIVersionBeta
17581760
}
1761+
// failed to GetDisk, however the Disk may already be created, the error code should be non-Final
17591762
disk, err := cloudProvider.GetDisk(ctx, project, meta.ZonalKey(name, diskZone), gceAPIVersion)
17601763
if err != nil {
1761-
return nil, err
1764+
return nil, status.Errorf(codes.Unavailable, "failed to get disk after creating zonal disk: %v", err.Error())
17621765
}
17631766
return disk, nil
17641767
}

0 commit comments

Comments
 (0)