mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Add new error
This commit is contained in:
parent
641682c002
commit
a24e6a90bd
@ -1076,11 +1076,20 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(arg interface{}) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
// Delete failed, update the volume and emit an event.
|
// Delete failed, update the volume and emit an event.
|
||||||
glog.V(3).Infof("deletion of volume %q failed: %v", volume.Name, err)
|
glog.V(3).Infof("deletion of volume %q failed: %v", volume.Name, err)
|
||||||
|
if vol.IsDeletedVolumeInUse(err) {
|
||||||
|
// The plugin needs more time, don't mark the volume as Failed
|
||||||
|
// and send Normal event only
|
||||||
|
ctrl.eventRecorder.Event(volume, api.EventTypeNormal, "VolumeDelete", err.Error())
|
||||||
|
} else {
|
||||||
|
// The plugin failed, mark the volume as Failed and send Warning
|
||||||
|
// event
|
||||||
if _, err = ctrl.updateVolumePhaseWithEvent(volume, api.VolumeFailed, api.EventTypeWarning, "VolumeFailedDelete", err.Error()); err != nil {
|
if _, err = ctrl.updateVolumePhaseWithEvent(volume, api.VolumeFailed, api.EventTypeWarning, "VolumeFailedDelete", err.Error()); err != nil {
|
||||||
glog.V(4).Infof("deleteVolumeOperation [%s]: failed to mark volume as failed: %v", volume.Name, err)
|
glog.V(4).Infof("deleteVolumeOperation [%s]: failed to mark volume as failed: %v", volume.Name, err)
|
||||||
// Save failed, retry on the next deletion attempt
|
// Save failed, retry on the next deletion attempt
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Despite the volume being Failed, the controller will retry deleting
|
// Despite the volume being Failed, the controller will retry deleting
|
||||||
// the volume in every syncVolume() call.
|
// the volume in every syncVolume() call.
|
||||||
return
|
return
|
||||||
@ -1174,7 +1183,7 @@ func (ctrl *PersistentVolumeController) doDeleteVolume(volume *api.PersistentVol
|
|||||||
|
|
||||||
if err = deleter.Delete(); err != nil {
|
if err = deleter.Delete(); err != nil {
|
||||||
// Deleter failed
|
// Deleter failed
|
||||||
return false, fmt.Errorf("Delete of volume %q failed: %v", volume.Name, err)
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
glog.V(2).Infof("volume %q deleted", volume.Name)
|
glog.V(2).Infof("volume %q deleted", volume.Name)
|
||||||
|
@ -129,6 +129,12 @@ type Provisioner interface {
|
|||||||
type Deleter interface {
|
type Deleter interface {
|
||||||
Volume
|
Volume
|
||||||
// This method should block until completion.
|
// This method should block until completion.
|
||||||
|
// deletedVolumeInUseError returned from this function will not be reported
|
||||||
|
// as error and it will be sent as "Info" event to the PV being deleted. The
|
||||||
|
// volume controller will retry deleting the volume in the next periodic
|
||||||
|
// sync. This can be used to postpone deletion of a volume that is being
|
||||||
|
// dettached from a node. Deletion of such volume would fail anyway and such
|
||||||
|
// error would confuse users.
|
||||||
Delete() error
|
Delete() error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,6 +177,31 @@ type Detacher interface {
|
|||||||
UnmountDevice(deviceMountPath string) error
|
UnmountDevice(deviceMountPath string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewDeletedVolumeInUseError returns a new instance of DeletedVolumeInUseError
|
||||||
|
// error.
|
||||||
|
func NewDeletedVolumeInUseError(message string) error {
|
||||||
|
return deletedVolumeInUseError(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deletedVolumeInUseError string
|
||||||
|
|
||||||
|
var _ error = deletedVolumeInUseError("")
|
||||||
|
|
||||||
|
// IsDeletedVolumeInUse returns true if an error returned from Delete() is
|
||||||
|
// deletedVolumeInUseError
|
||||||
|
func IsDeletedVolumeInUse(err error) bool {
|
||||||
|
switch err.(type) {
|
||||||
|
case deletedVolumeInUseError:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err deletedVolumeInUseError) Error() string {
|
||||||
|
return string(err)
|
||||||
|
}
|
||||||
|
|
||||||
func RenameDirectory(oldPath, newName string) (string, error) {
|
func RenameDirectory(oldPath, newName string) (string, error) {
|
||||||
newPath, err := ioutil.TempDir(path.Dir(oldPath), newName)
|
newPath, err := ioutil.TempDir(path.Dir(oldPath), newName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user