Skip to content
This repository has been archived by the owner on Feb 8, 2021. It is now read-only.

cinder/rbd: flatten rbd volumes upon rbd map error 22 (EINVAL) #174

Merged
merged 2 commits into from Aug 24, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 18 additions & 2 deletions pkg/volume/cinder/drivers/rbd.go
Expand Up @@ -116,15 +116,31 @@ func (d *RBDDriver) Format(volumeData map[string]interface{}, fsType string) err

mappedDeviceByte, err := exec.Command(rbdPath, "map", volume.Name).CombinedOutput()
if err != nil {
return fmt.Errorf("rbd map failed: %v", err)
// when we get status 22 (EINVAL), it might be because the volume has
// too many (>22) parent layers. Let's flatten it and try again.
if strings.Contains(err.Error(), "status 22") {
glog.Warningf("rbd map volume %s failed: %v. try to flatten it", volume.Name, err)
_, errFlatten := exec.Command(rbdPath, "flatten", volume.Name).CombinedOutput()
if errFlatten != nil {
glog.Warningf("rbd flatten volume %s failed: %v", volume.Name, errFlatten)
return fmt.Errorf("rbd map %s failed: %v", volume.Name, err)
}
mappedDeviceByte, err = exec.Command(rbdPath, "map", volume.Name).CombinedOutput()
if err != nil {
glog.Warningf("rbd map after flatten volume %s failed: %v", volume.Name, err)
return fmt.Errorf("rbd map %s failed: %v", volume.Name, err)
}
} else {
return fmt.Errorf("rbd map %s failed: %v", volume.Name, err)
}
}

mappedDevice := strings.TrimSpace(string(mappedDeviceByte))
defer d.unmapRBD(rbdPath, mappedDevice)

deviceInfo, err := exec.Command(filePath, "-s", mappedDevice).CombinedOutput()
if err != nil {
return fmt.Errorf("rbd map failed: %v", err)
return fmt.Errorf("file -s on volume %s failed: %v", volume.Name, err)
}

if !strings.Contains(string(deviceInfo), fmt.Sprintf("%s filesystem", fsType)) {
Expand Down