Skip to content

Commit 86a5bd9

Browse files
committed
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.
1 parent 39ed64e commit 86a5bd9

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

pkg/volume/csi/csi_block.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ func (m *csiBlockMapper) stageVolumeForBlock(
189189
nil /* MountOptions */)
190190

191191
if err != nil {
192-
return "", errors.New(log("blockMapper.stageVolumeForBlock failed: %v", err))
192+
return "", err
193193
}
194194

195195
klog.V(4).Infof(log("blockMapper.stageVolumeForBlock successfully requested NodeStageVolume [%s]", stagingPath))
@@ -249,7 +249,7 @@ func (m *csiBlockMapper) publishVolumeForBlock(
249249
)
250250

251251
if err != nil {
252-
return "", errors.New(log("blockMapper.publishVolumeForBlock failed: %v", err))
252+
return "", err
253253
}
254254

255255
return publishPath, nil

pkg/volume/util/operationexecutor/operation_generator.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
929929
volumeAttacher, _ = attachableVolumePlugin.NewAttacher()
930930
}
931931

932-
mapVolumeFunc := func() (error, error) {
932+
mapVolumeFunc := func() (simpleErr error, detailedErr error) {
933933
var devicePath string
934934
// Set up global map path under the given plugin directory using symbolic link
935935
globalMapPath, err :=
@@ -956,6 +956,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
956956
if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
957957
mapErr := customBlockVolumeMapper.SetUpDevice()
958958
if mapErr != nil {
959+
og.markDeviceErrorState(volumeToMount, devicePath, globalMapPath, mapErr, actualStateOfWorld)
959960
// On failure, return error. Caller will log and retry.
960961
return volumeToMount.GenerateError("MapVolume.SetUpDevice failed", mapErr)
961962
}
@@ -970,15 +971,36 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
970971
return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr)
971972
}
972973

974+
markVolumeOpts := MarkVolumeOpts{
975+
PodName: volumeToMount.PodName,
976+
PodUID: volumeToMount.Pod.UID,
977+
VolumeName: volumeToMount.VolumeName,
978+
BlockVolumeMapper: blockVolumeMapper,
979+
OuterVolumeSpecName: volumeToMount.OuterVolumeSpecName,
980+
VolumeGidVolume: volumeToMount.VolumeGidValue,
981+
VolumeSpec: volumeToMount.VolumeSpec,
982+
VolumeMountState: VolumeMounted,
983+
}
984+
973985
// Call MapPodDevice if blockVolumeMapper implements CustomBlockVolumeMapper
974986
if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok {
975987
// Execute driver specific map
976988
pluginDevicePath, mapErr := customBlockVolumeMapper.MapPodDevice()
977989
if mapErr != nil {
978990
// On failure, return error. Caller will log and retry.
991+
og.markVolumeErrorState(volumeToMount, markVolumeOpts, mapErr, actualStateOfWorld)
979992
return volumeToMount.GenerateError("MapVolume.MapPodDevice failed", mapErr)
980993
}
981994

995+
// From now on, the volume is mapped. Mark it as uncertain on error,
996+
// so it is is unmapped when corresponding pod is deleted.
997+
defer func() {
998+
if simpleErr != nil {
999+
errText := simpleErr.Error()
1000+
og.markVolumeErrorState(volumeToMount, markVolumeOpts, volumetypes.NewUncertainProgressError(errText), actualStateOfWorld)
1001+
}
1002+
}()
1003+
9821004
// if pluginDevicePath is provided, assume attacher may not provide device
9831005
// or attachment flow uses SetupDevice to get device path
9841006
if len(pluginDevicePath) != 0 {
@@ -1044,17 +1066,6 @@ func (og *operationGenerator) GenerateMapVolumeFunc(
10441066
return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed while expanding volume", resizeError)
10451067
}
10461068

1047-
markVolumeOpts := MarkVolumeOpts{
1048-
PodName: volumeToMount.PodName,
1049-
PodUID: volumeToMount.Pod.UID,
1050-
VolumeName: volumeToMount.VolumeName,
1051-
BlockVolumeMapper: blockVolumeMapper,
1052-
OuterVolumeSpecName: volumeToMount.OuterVolumeSpecName,
1053-
VolumeGidVolume: volumeToMount.VolumeGidValue,
1054-
VolumeSpec: volumeToMount.VolumeSpec,
1055-
VolumeMountState: VolumeMounted,
1056-
}
1057-
10581069
markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markVolumeOpts)
10591070
if markVolMountedErr != nil {
10601071
// On failure, return error. Caller will log and retry.

0 commit comments

Comments
 (0)