Add uncertain map state to block volumes
Volume mount should be marked as uncertain after NodeStage / NodePublish timeout or similar error, when the driver can continue with the operation in background.
This commit is contained in:
		| @@ -189,7 +189,7 @@ func (m *csiBlockMapper) stageVolumeForBlock( | ||||
| 		nil /* MountOptions */) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return "", errors.New(log("blockMapper.stageVolumeForBlock failed: %v", err)) | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	klog.V(4).Infof(log("blockMapper.stageVolumeForBlock successfully requested NodeStageVolume [%s]", stagingPath)) | ||||
| @@ -249,7 +249,7 @@ func (m *csiBlockMapper) publishVolumeForBlock( | ||||
| 	) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return "", errors.New(log("blockMapper.publishVolumeForBlock failed: %v", err)) | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return publishPath, nil | ||||
|   | ||||
| @@ -929,7 +929,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc( | ||||
| 		volumeAttacher, _ = attachableVolumePlugin.NewAttacher() | ||||
| 	} | ||||
|  | ||||
| 	mapVolumeFunc := func() (error, error) { | ||||
| 	mapVolumeFunc := func() (simpleErr error, detailedErr error) { | ||||
| 		var devicePath string | ||||
| 		// Set up global map path under the given plugin directory using symbolic link | ||||
| 		globalMapPath, err := | ||||
| @@ -956,6 +956,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc( | ||||
| 		if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok { | ||||
| 			mapErr := customBlockVolumeMapper.SetUpDevice() | ||||
| 			if mapErr != nil { | ||||
| 				og.markDeviceErrorState(volumeToMount, devicePath, globalMapPath, mapErr, actualStateOfWorld) | ||||
| 				// On failure, return error. Caller will log and retry. | ||||
| 				return volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr) | ||||
| 			} | ||||
| @@ -970,15 +971,36 @@ func (og *operationGenerator) GenerateMapVolumeFunc( | ||||
| 			return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) | ||||
| 		} | ||||
|  | ||||
| 		markVolumeOpts := MarkVolumeOpts{ | ||||
| 			PodName:             volumeToMount.PodName, | ||||
| 			PodUID:              volumeToMount.Pod.UID, | ||||
| 			VolumeName:          volumeToMount.VolumeName, | ||||
| 			BlockVolumeMapper:   blockVolumeMapper, | ||||
| 			OuterVolumeSpecName: volumeToMount.OuterVolumeSpecName, | ||||
| 			VolumeGidVolume:     volumeToMount.VolumeGidValue, | ||||
| 			VolumeSpec:          volumeToMount.VolumeSpec, | ||||
| 			VolumeMountState:    VolumeMounted, | ||||
| 		} | ||||
|  | ||||
| 		// Call MapPodDevice if blockVolumeMapper implements CustomBlockVolumeMapper | ||||
| 		if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok { | ||||
| 			// Execute driver specific map | ||||
| 			pluginDevicePath, mapErr := customBlockVolumeMapper.MapPodDevice() | ||||
| 			if mapErr != nil { | ||||
| 				// On failure, return error. Caller will log and retry. | ||||
| 				og.markVolumeErrorState(volumeToMount, markVolumeOpts, mapErr, actualStateOfWorld) | ||||
| 				return volumeToMount.GenerateError("MapVolume.MapPodDevice failed", mapErr) | ||||
| 			} | ||||
|  | ||||
| 			// From now on, the volume is mapped. Mark it as uncertain on error, | ||||
| 			// so it is is unmapped when corresponding pod is deleted. | ||||
| 			defer func() { | ||||
| 				if simpleErr != nil { | ||||
| 					errText := simpleErr.Error() | ||||
| 					og.markVolumeErrorState(volumeToMount, markVolumeOpts, volumetypes.NewUncertainProgressError(errText), actualStateOfWorld) | ||||
| 				} | ||||
| 			}() | ||||
|  | ||||
| 			// if pluginDevicePath is provided, assume attacher may not provide device | ||||
| 			// or attachment flow uses SetupDevice to get device path | ||||
| 			if len(pluginDevicePath) != 0 { | ||||
| @@ -1044,17 +1066,6 @@ func (og *operationGenerator) GenerateMapVolumeFunc( | ||||
| 			return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed while expanding volume", resizeError) | ||||
| 		} | ||||
|  | ||||
| 		markVolumeOpts := MarkVolumeOpts{ | ||||
| 			PodName:             volumeToMount.PodName, | ||||
| 			PodUID:              volumeToMount.Pod.UID, | ||||
| 			VolumeName:          volumeToMount.VolumeName, | ||||
| 			BlockVolumeMapper:   blockVolumeMapper, | ||||
| 			OuterVolumeSpecName: volumeToMount.OuterVolumeSpecName, | ||||
| 			VolumeGidVolume:     volumeToMount.VolumeGidValue, | ||||
| 			VolumeSpec:          volumeToMount.VolumeSpec, | ||||
| 			VolumeMountState:    VolumeMounted, | ||||
| 		} | ||||
|  | ||||
| 		markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markVolumeOpts) | ||||
| 		if markVolMountedErr != nil { | ||||
| 			// On failure, return error. Caller will log and retry. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jan Safranek
					Jan Safranek