Updated Branches: refs/heads/rbd-snap-clone af1ac3575 -> 91cd55fa5
rbd: Use rados-java for performing a RBD copy and add more debugging Using the Java bindings instead of Qemu-Img for a RBD copy gives more control over the process. Extra debugging shows us what is going on. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/91cd55fa Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/91cd55fa Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/91cd55fa Branch: refs/heads/rbd-snap-clone Commit: 91cd55fa5d8abe6d71e051c7e913d2ae8fb9f70e Parents: af1ac35 Author: Wido den Hollander <[email protected]> Authored: Wed May 15 11:51:52 2013 +0200 Committer: Wido den Hollander <[email protected]> Committed: Wed May 15 11:51:52 2013 +0200 ---------------------------------------------------------------------- .../kvm/storage/LibvirtStorageAdaptor.java | 38 ++++++++------ 1 files changed, 22 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/91cd55fa/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 5ecba41..7bad644 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 @@ -723,38 +723,44 @@ public class LibvirtStorageAdaptor implements StorageAdaptor { if ((srcPool.getSourceHost().equals(destPool.getSourceHost())) && (srcPool.getSourceDir().equals(destPool.getSourceDir()))) { /* We are on the same Ceph cluster, but we require RBD format 2 on the source image */ s_logger.debug("Trying to perform a RBD clone (layering) since we are operating in the same storage pool"); + + /* Feature 1<<0 means layering in RBD format 2 */ + int rbdFeatures = (1<<0); + /* Order 0 means 4MB blocks (the default) */ + int rbdOrder = 0; + try { Rados r = new Rados(srcPool.getAuthUserName()); - r.confSet("mon_host", srcPool.getSourceHost()); + String mon_host = srcPool.getSourceHost() + ":" + srcPool.getSourcePort(); + r.confSet("mon_host", mon_host); r.confSet("key", srcPool.getAuthSecret()); r.connect(); + s_logger.debug("Succesfully connected to Ceph cluster at " + mon_host); IoCTX io = r.ioCtxCreate(srcPool.getSourceDir()); Rbd rbd = new Rbd(io); - RbdImage image = rbd.open(template.getName()); + RbdImage srcImage = rbd.open(template.getName()); - if (image.isOldFormat()) { - s_logger.debug("The source image " + template.getName() + " is RBD format 1. We have to perform a regular copy"); + if (srcImage.isOldFormat()) { /* The source image is RBD format 1, we have to do a regular copy */ - template.setFormat(PhysicalDiskFormat.RAW); - srcFile = new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(srcPool.getSourceHost(), - srcPool.getSourcePort(), - srcPool.getAuthUserName(), - srcPool.getAuthSecret(), - template.getPath())); - srcFile.setFormat(template.getFormat()); - qemu.convert(srcFile, destFile); + s_logger.debug("The source image " + template.getName() + " is RBD format 1. We have to perform a regular copy"); + + rbd.create(disk.getName(), template.getVirtualSize(), rbdFeatures, rbdOrder); + RbdImage destImage = rbd.open(disk.getName()); + + s_logger.debug("Starting to copy " + srcImage.getName() + " to " + destImage.getName() + " in Ceph pool " + srcPool.getSourceDir()); + rbd.copy(srcImage, destImage); + s_logger.debug("Finished copying " + srcImage.getName() + " to " + destImage.getName() + " in Ceph pool " + srcPool.getSourceDir()); + rbd.close(destImage); } else { s_logger.debug("The source image " + template.getName() + " is RBD format 2. We will perform a RBD clone using snapshot " + this.rbdTemplateSnapName); /* The source image is format 2, we can do a RBD snapshot+clone (layering) */ - /* Feature 1<<0 means layering in RBD format 2 */ - int rbdFeatures = (1<<0); - int rbdOrder = 0; rbd.clone(template.getName(), this.rbdTemplateSnapName, io, disk.getName(), rbdFeatures, rbdOrder); + s_logger.debug("Succesfully cloned " + template.getName() + "@" + this.rbdTemplateSnapName + " to " + disk.getName()); } - rbd.close(image); + rbd.close(srcImage); r.ioCtxDestroy(io); } catch (RadosException e) { s_logger.error("Failed to perform a RADOS action on the Ceph cluster, the error was: " + e.getMessage());
