diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index 056b7a57317..f3f9ab64e1d 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -936,8 +936,7 @@ func (ctrl *PersistentVolumeController) reclaimVolume(volume *v1.PersistentVolum glog.V(4).Infof("reclaimVolume[%s]: policy is Delete", volume.Name) opName := fmt.Sprintf("delete-%s[%s]", volume.Name, string(volume.UID)) ctrl.scheduleOperation(opName, func() error { - ctrl.deleteVolumeOperation(volume) - return nil + return ctrl.deleteVolumeOperation(volume) }) default: @@ -1042,12 +1041,13 @@ func (ctrl *PersistentVolumeController) recycleVolumeOperation(arg interface{}) // deleteVolumeOperation deletes a volume. This method is running in standalone // goroutine and already has all necessary locks. -func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) { +func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) error { volume, ok := arg.(*v1.PersistentVolume) if !ok { glog.Errorf("Cannot convert deleteVolumeOperation argument to volume, got %#v", arg) - return + return nil } + glog.V(4).Infof("deleteVolumeOperation [%s] started", volume.Name) // This method may have been waiting for a volume lock for some time. @@ -1056,16 +1056,16 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) { newVolume, err := ctrl.kubeClient.Core().PersistentVolumes().Get(volume.Name) if err != nil { glog.V(3).Infof("error reading peristent volume %q: %v", volume.Name, err) - return + return nil } needsReclaim, err := ctrl.isVolumeReleased(newVolume) if err != nil { glog.V(3).Infof("error reading claim for volume %q: %v", volume.Name, err) - return + return nil } if !needsReclaim { glog.V(3).Infof("volume %q no longer needs deletion, skipping", volume.Name) - return + return nil } deleted, err := ctrl.doDeleteVolume(volume) @@ -1082,17 +1082,17 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) { if _, err = ctrl.updateVolumePhaseWithEvent(volume, v1.VolumeFailed, v1.EventTypeWarning, "VolumeFailedDelete", err.Error()); err != nil { glog.V(4).Infof("deleteVolumeOperation [%s]: failed to mark volume as failed: %v", volume.Name, err) // Save failed, retry on the next deletion attempt - return + return err } } // Despite the volume being Failed, the controller will retry deleting // the volume in every syncVolume() call. - return + return err } if !deleted { // The volume waits for deletion by an external plugin. Do nothing. - return + return nil } glog.V(4).Infof("deleteVolumeOperation [%s]: success", volume.Name) @@ -1103,9 +1103,9 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) { // cache of "recently deleted volumes" and avoid unnecessary deletion, // this is left out as future optimization. glog.V(3).Infof("failed to delete volume %q from database: %v", volume.Name, err) - return + return nil } - return + return nil } // isVolumeReleased returns true if given volume is released and can be recycled diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index 80c31a8bb44..b1ded833133 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -71,7 +71,7 @@ func NewController(p ControllerParameters) *PersistentVolumeController { claims: cache.NewStore(cache.DeletionHandlingMetaNamespaceKeyFunc), kubeClient: p.KubeClient, eventRecorder: eventRecorder, - runningOperations: goroutinemap.NewGoRoutineMap(false /* exponentialBackOffOnError */), + runningOperations: goroutinemap.NewGoRoutineMap(true /* exponentialBackOffOnError */), cloud: p.Cloud, enableDynamicProvisioning: p.EnableDynamicProvisioning, clusterName: p.ClusterName,