Updated Branches: refs/heads/4.2 a6d646856 -> 8a49f5a1a
CLOUDSTACK-4114: Use RAW disk images for RBD instead of QCOW2 Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8a49f5a1 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8a49f5a1 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8a49f5a1 Branch: refs/heads/4.2 Commit: 8a49f5a1a96e80590589ca0c0c5a19a2ea8b4786 Parents: a6d6468 Author: Wido den Hollander <[email protected]> Authored: Tue Aug 6 16:25:55 2013 +0200 Committer: Wido den Hollander <[email protected]> Committed: Tue Aug 13 16:26:02 2013 +0200 ---------------------------------------------------------------------- .../com/cloud/upgrade/dao/Upgrade412to420.java | 11 ++++++ .../cloudstack/storage/image/format/RAW.java | 32 +++++++++++++++ .../cloudstack/storage/volume/VolumeObject.java | 6 +++ .../kvm/storage/KVMStorageProcessor.java | 41 +++++++++++++++++++- .../kvm/storage/LibvirtStorageAdaptor.java | 1 + 5 files changed, 90 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8a49f5a1/engine/schema/src/com/cloud/upgrade/dao/Upgrade412to420.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade412to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade412to420.java index e64aff4..022485d 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade412to420.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade412to420.java @@ -104,6 +104,7 @@ public class Upgrade412to420 implements DbUpgrade { fixRouterKeys(conn); updateConcurrentConnectionsInNetworkOfferings(conn); migrateDatafromIsoIdInVolumesTable(conn); + setRAWformatForRBDVolumes(conn); } private void movePrivateZoneToDedicatedResource(Connection conn) { @@ -2261,6 +2262,16 @@ public class Upgrade412to420 implements DbUpgrade { }catch (SQLException e) { //implies iso_id1 is not present, so do nothing. } + } + protected void setRAWformatForRBDVolumes(Connection conn) { + PreparedStatement pstmt = null; + try { + s_logger.debug("Setting format to RAW for all volumes on RBD primary storage pools"); + pstmt = conn.prepareStatement("UPDATE volumes SET format = 'RAW' WHERE pool_id IN(SELECT id FROM storage_pool WHERE pool_type = 'RBD')"); + pstmt.executeQuery(); + } catch (SQLException e) { + throw new CloudRuntimeException("Failed to update volume format to RAW for volumes on RBD pools"); + } } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8a49f5a1/engine/storage/src/org/apache/cloudstack/storage/image/format/RAW.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/format/RAW.java b/engine/storage/src/org/apache/cloudstack/storage/image/format/RAW.java new file mode 100644 index 0000000..84adff2 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/format/RAW.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cloudstack.storage.image.format; + +import org.apache.cloudstack.storage.BaseType; +import org.springframework.stereotype.Component; + +@Component("imageformat_raw") +public class RAW extends BaseType implements ImageFormat { + private final String type = "RAW"; + + @Override + public String toString() { + return type; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8a49f5a1/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java ---------------------------------------------------------------------- diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index 5058dba..b24b715 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -474,6 +474,9 @@ public class VolumeObject implements VolumeInfo { if (newVol.getSize() != null) { vol.setSize(newVol.getSize()); } + if (newVol.getFormat() != null) { + vol.setFormat(newVol.getFormat()); + } vol.setPoolId(this.getDataStore().getId()); volumeDao.update(vol.getId(), vol); } else if (answer instanceof CreateObjectAnswer) { @@ -485,6 +488,9 @@ public class VolumeObject implements VolumeInfo { vol.setSize(newVol.getSize()); } vol.setPoolId(this.getDataStore().getId()); + if (newVol.getFormat() != null) { + vol.setFormat(newVol.getFormat()); + } volumeDao.update(vol.getId(), vol); } } else { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8a49f5a1/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java index d813eb9..8f46c22 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java @@ -199,7 +199,16 @@ public class KVMStorageProcessor implements StorageProcessor { TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(primaryVol.getName()); - newTemplate.setFormat(ImageFormat.QCOW2); + + /** + * Force the ImageFormat for RBD templates to RAW + * + */ + if (primaryPool.getType() == StoragePoolType.RBD) { + newTemplate.setFormat(ImageFormat.RAW); + } else { + newTemplate.setFormat(ImageFormat.QCOW2); + } return new CopyCmdAnswer(newTemplate); } catch (CloudRuntimeException e) { return new CopyCmdAnswer(e.toString()); @@ -291,6 +300,12 @@ public class KVMStorageProcessor implements StorageProcessor { newVol.setPath(vol.getName()); newVol.setSize(volume.getSize()); + if (vol.getFormat() == PhysicalDiskFormat.RAW) { + newVol.setFormat(ImageFormat.RAW); + } else if (vol.getFormat() == PhysicalDiskFormat.QCOW2) { + newVol.setFormat(ImageFormat.QCOW2); + } + return new CopyCmdAnswer(newVol); } catch (CloudRuntimeException e) { s_logger.debug("Failed to create volume: " + e.toString()); @@ -985,6 +1000,15 @@ public class KVMStorageProcessor implements StorageProcessor { VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(vol.getName()); newVol.setSize(volume.getSize()); + + /** + * Volumes on RBD are always in RAW format + * Hardcode this to RAW since there is no other way right now + */ + if (primaryPool.getType() == StoragePoolType.RBD) { + newVol.setFormat(ImageFormat.RAW); + } + return new CreateObjectAnswer(newVol); } catch (Exception e) { s_logger.debug("Failed to create volume: " + e.toString()); @@ -1120,6 +1144,7 @@ public class KVMStorageProcessor implements StorageProcessor { DataTO destData = cmd.getDestTO(); PrimaryDataStoreTO pool = (PrimaryDataStoreTO) destData.getDataStore(); DataStoreTO imageStore = srcData.getDataStore(); + VolumeObjectTO volume = snapshot.getVolume(); if (!(imageStore instanceof NfsTO)) { return new CopyCmdAnswer("unsupported protocol"); @@ -1135,6 +1160,12 @@ public class KVMStorageProcessor implements StorageProcessor { + snapshotPath); KVMPhysicalDisk snapshotDisk = secondaryPool.getPhysicalDisk(snapshotName); + if (volume.getFormat() == ImageFormat.RAW) { + snapshotDisk.setFormat(PhysicalDiskFormat.RAW); + } else if (volume.getFormat() == ImageFormat.QCOW2) { + snapshotDisk.setFormat(PhysicalDiskFormat.QCOW2); + } + String primaryUuid = pool.getUuid(); KVMStoragePool primaryPool = storagePoolMgr.getStoragePool(pool.getPoolType(), primaryUuid); String volUuid = UUID.randomUUID().toString(); @@ -1142,6 +1173,14 @@ public class KVMStorageProcessor implements StorageProcessor { VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(disk.getName()); newVol.setSize(disk.getVirtualSize()); + + /** + * We have to force the format of RBD volumes to RAW + */ + if (primaryPool.getType() == StoragePoolType.RBD) { + newVol.setFormat(ImageFormat.RAW); + } + return new CopyCmdAnswer(newVol); } catch (CloudRuntimeException e) { return new CopyCmdAnswer(e.toString()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8a49f5a1/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 262343a..28cfd42 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -787,6 +787,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { qemu.convert(sourceFile, destFile); } } else { + format = PhysicalDiskFormat.RAW; disk = new KVMPhysicalDisk(destPool.getSourceDir() + "/" + newUuid, newUuid, destPool); disk.setFormat(format); disk.setSize(template.getVirtualSize());
