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 */)
 | 
							nil /* MountOptions */)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						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))
 | 
						klog.V(4).Infof(log("blockMapper.stageVolumeForBlock successfully requested NodeStageVolume [%s]", stagingPath))
 | 
				
			||||||
@@ -249,7 +249,7 @@ func (m *csiBlockMapper) publishVolumeForBlock(
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return "", errors.New(log("blockMapper.publishVolumeForBlock failed: %v", err))
 | 
							return "", err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return publishPath, nil
 | 
						return publishPath, nil
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -929,7 +929,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
 | 
				
			|||||||
		volumeAttacher, _ = attachableVolumePlugin.NewAttacher()
 | 
							volumeAttacher, _ = attachableVolumePlugin.NewAttacher()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mapVolumeFunc := func() (error, error) {
 | 
						mapVolumeFunc := func() (simpleErr error, detailedErr error) {
 | 
				
			||||||
		var devicePath string
 | 
							var devicePath string
 | 
				
			||||||
		// Set up global map path under the given plugin directory using symbolic link
 | 
							// Set up global map path under the given plugin directory using symbolic link
 | 
				
			||||||
		globalMapPath, err :=
 | 
							globalMapPath, err :=
 | 
				
			||||||
@@ -956,6 +956,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
 | 
				
			|||||||
		if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
 | 
							if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
 | 
				
			||||||
			mapErr := customBlockVolumeMapper.SetUpDevice()
 | 
								mapErr := customBlockVolumeMapper.SetUpDevice()
 | 
				
			||||||
			if mapErr != nil {
 | 
								if mapErr != nil {
 | 
				
			||||||
 | 
									og.markDeviceErrorState(volumeToMount, devicePath, globalMapPath, mapErr, actualStateOfWorld)
 | 
				
			||||||
				// On failure, return error. Caller will log and retry.
 | 
									// On failure, return error. Caller will log and retry.
 | 
				
			||||||
				return volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr)
 | 
									return volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -970,15 +971,36 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
 | 
				
			|||||||
			return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr)
 | 
								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
 | 
							// Call MapPodDevice if blockVolumeMapper implements CustomBlockVolumeMapper
 | 
				
			||||||
		if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
 | 
							if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
 | 
				
			||||||
			// Execute driver specific map
 | 
								// Execute driver specific map
 | 
				
			||||||
			pluginDevicePath, mapErr := customBlockVolumeMapper.MapPodDevice()
 | 
								pluginDevicePath, mapErr := customBlockVolumeMapper.MapPodDevice()
 | 
				
			||||||
			if mapErr != nil {
 | 
								if mapErr != nil {
 | 
				
			||||||
				// On failure, return error. Caller will log and retry.
 | 
									// On failure, return error. Caller will log and retry.
 | 
				
			||||||
 | 
									og.markVolumeErrorState(volumeToMount, markVolumeOpts, mapErr, actualStateOfWorld)
 | 
				
			||||||
				return volumeToMount.GenerateError("MapVolume.MapPodDevice failed", mapErr)
 | 
									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
 | 
								// if pluginDevicePath is provided, assume attacher may not provide device
 | 
				
			||||||
			// or attachment flow uses SetupDevice to get device path
 | 
								// or attachment flow uses SetupDevice to get device path
 | 
				
			||||||
			if len(pluginDevicePath) != 0 {
 | 
								if len(pluginDevicePath) != 0 {
 | 
				
			||||||
@@ -1044,17 +1066,6 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
 | 
				
			|||||||
			return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed while expanding volume", resizeError)
 | 
								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)
 | 
							markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markVolumeOpts)
 | 
				
			||||||
		if markVolMountedErr != nil {
 | 
							if markVolMountedErr != nil {
 | 
				
			||||||
			// On failure, return error. Caller will log and retry.
 | 
								// On failure, return error. Caller will log and retry.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user