Merge pull request #67939 from NickrenREN/rbd-ams

RBD AccessModes checking when attaching
pull/58/head
k8s-ci-robot 2018-09-24 17:17:00 -07:00 committed by GitHub
commit 9120dc01e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 23 deletions

View File

@ -395,39 +395,38 @@ func (util *RBDUtil) AttachDisk(b rbdMounter) (string, error) {
Steps: rbdImageWatcherSteps, Steps: rbdImageWatcherSteps,
} }
needValidUsed := true needValidUsed := true
// If accessModes contain ReadOnlyMany, we don't need check rbd status of being used.
if b.accessModes != nil { if b.accessModes != nil {
for _, v := range b.accessModes { // If accessModes only contains ReadOnlyMany, we don't need check rbd status of being used.
if v != v1.ReadWriteOnce { if len(b.accessModes) == 1 && b.accessModes[0] == v1.ReadOnlyMany {
needValidUsed = false needValidUsed = false
break }
}
// If accessModes is nil, the volume is referenced by in-line volume.
// We can assume the AccessModes to be {"RWO" and "ROX"}, which is what the volume plugin supports.
// We do not need to consider ReadOnly here, because it is used for VolumeMounts.
if needValidUsed {
err := wait.ExponentialBackoff(backoff, func() (bool, error) {
used, rbdOutput, err := util.rbdStatus(&b)
if err != nil {
return false, fmt.Errorf("fail to check rbd image status with: (%v), rbd output: (%s)", err, rbdOutput)
} }
return !used, nil
})
// Return error if rbd image has not become available for the specified timeout.
if err == wait.ErrWaitTimeout {
return "", fmt.Errorf("rbd image %s/%s is still being used", b.Pool, b.Image)
} }
} else { // Return error if any other errors were encountered during wating for the image to become available.
// ReadOnly rbd volume should not check rbd status of being used to
// support mounted as read-only by multiple consumers simultaneously.
needValidUsed = !b.rbd.ReadOnly
}
err := wait.ExponentialBackoff(backoff, func() (bool, error) {
used, rbdOutput, err := util.rbdStatus(&b)
if err != nil { if err != nil {
return false, fmt.Errorf("fail to check rbd image status with: (%v), rbd output: (%s)", err, rbdOutput) return "", err
} }
return !needValidUsed || !used, nil
})
// Return error if rbd image has not become available for the specified timeout.
if err == wait.ErrWaitTimeout {
return "", fmt.Errorf("rbd image %s/%s is still being used", b.Pool, b.Image)
}
// Return error if any other errors were encountered during wating for the image to become available.
if err != nil {
return "", err
} }
mon := util.kernelRBDMonitorsOpt(b.Mon) mon := util.kernelRBDMonitorsOpt(b.Mon)
glog.V(1).Infof("rbd: map mon %s", mon) glog.V(1).Infof("rbd: map mon %s", mon)
_, err = b.exec.Run("modprobe", "rbd") _, err := b.exec.Run("modprobe", "rbd")
if err != nil { if err != nil {
glog.Warningf("rbd: failed to load rbd kernel module:%v", err) glog.Warningf("rbd: failed to load rbd kernel module:%v", err)
} }