Merge pull request #14158 from swordqiu/hotfix/qj-glance-convert-vmdk-fail

fix: glance convert vmdk fail
This commit is contained in:
Zexi Li
2022-04-27 14:33:40 +08:00
committed by GitHub
2 changed files with 43 additions and 5 deletions
+5 -5
View File
@@ -114,12 +114,12 @@ func (self *SImageSubformat) doConvert(image *SImage) error {
log.Errorf("fail to convert image %s", err)
return err
}
err = self.SaveTorrent()
if err != nil {
log.Errorf("fail to convert image torrent %s", err)
return err
}
if options.Options.EnableTorrentService {
err = self.SaveTorrent()
if err != nil {
log.Errorf("fail to convert image torrent %s", err)
return err
}
err = self.seedTorrent(image.Id)
if err != nil {
log.Errorf("fail to seed torrent %s", err)
+38
View File
@@ -240,6 +240,44 @@ func (info SConvertInfo) encrypted() bool {
}
func Convert(srcInfo, destInfo SConvertInfo, compact bool, workerOpions []string) error {
if srcInfo.Format == QCOW2 && destInfo.Format == QCOW2 {
return convertQcow2(srcInfo, destInfo, compact, workerOpions)
} else {
return convertOther(srcInfo, destInfo, compact, workerOpions)
}
}
func convertOther(srcInfo, destInfo SConvertInfo, compact bool, workerOpions []string) error {
cmdline := []string{"-c", strconv.Itoa(int(srcInfo.IoLevel)),
qemutils.GetQemuImg(), "convert"}
if compact {
cmdline = append(cmdline, "-c")
}
if workerOpions == nil {
// https://bugzilla.redhat.com/show_bug.cgi?id=1969848
// https://bugs.launchpad.net/qemu/+bug/1805256
// qemu-img convert may hang on aarch64, fix: add -m 1
cmdline = append(cmdline, "-m", "1")
} else {
cmdline = append(cmdline, workerOpions...)
}
if compact {
cmdline = append(cmdline, "-c")
}
cmdline = append(cmdline, "-f", srcInfo.Format.String(), "-O", destInfo.Format.String())
cmdline = append(cmdline, srcInfo.Path, destInfo.Path)
log.Infof("XXXX qemu-img command: %s", cmdline)
cmd := procutils.NewRemoteCommandAsFarAsPossible("ionice", cmdline...)
output, err := cmd.Output()
if err != nil {
log.Errorf("qemu convert fail %s, output: %s", err, string(output))
os.Remove(destInfo.Path)
return err
}
return nil
}
func convertQcow2(srcInfo, destInfo SConvertInfo, compact bool, workerOpions []string) error {
source, err := NewQemuImageWithIOLevel(srcInfo.Path, srcInfo.IoLevel)
if err != nil {
return errors.Wrapf(err, "NewQemuImage source %s", srcInfo.Path)