Updated Branches:
  refs/heads/rbd-snap-clone 91cd55fa5 -> 76eca22f5

rbd: When performing a inter Ceph cluster copy use the Java bindings instead of 
Qemu-img


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5b1a3f2a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5b1a3f2a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5b1a3f2a

Branch: refs/heads/rbd-snap-clone
Commit: 5b1a3f2a989c55b3c7b36e67f20ac4efaa255d6f
Parents: 91cd55f
Author: Wido den Hollander <[email protected]>
Authored: Wed May 15 12:47:07 2013 +0200
Committer: Wido den Hollander <[email protected]>
Committed: Wed May 15 12:47:07 2013 +0200

----------------------------------------------------------------------
 .../kvm/storage/LibvirtStorageAdaptor.java         |   71 ++++++++++-----
 1 files changed, 47 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5b1a3f2a/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 7bad644..58c6ea6 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
@@ -720,16 +720,16 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
                      * we want to copy it
                      */
 
-                    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;
 
-                        /* Feature 1<<0 means layering in RBD format 2 */
-                        int rbdFeatures = (1<<0);
-                        /* Order 0 means 4MB blocks (the default) */
-                        int rbdOrder = 0;
-
-                        try {
+                    try {
+                        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");
+   
                             Rados r = new Rados(srcPool.getAuthUserName());
                             String mon_host = srcPool.getSourceHost() + ":" + 
srcPool.getSourcePort();
                             r.confSet("mon_host", mon_host);
@@ -762,22 +762,45 @@ public class LibvirtStorageAdaptor implements 
StorageAdaptor {
 
                             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());
-                        } catch (RbdException e) {
-                            s_logger.error("Failed to perform a RBD action on 
the Ceph cluster, the error was: " + e.getMessage());
-                        }
+                        } else {
+                            /* The source pool or host is not the same Ceph 
cluster, we do a simple copy with Qemu-Img */
+                            s_logger.debug("Both the source and destination 
are RBD, but not the same Ceph cluster. Performing a copy");
 
-                    } else {
-                        /* The source pool or host is not the same Ceph 
cluster, we do a simple copy with Qemu-Img */
-                        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);
+                            Rados rSrc = new Rados(srcPool.getAuthUserName());
+                            rSrc.confSet("mon_host", srcPool.getSourceHost() + 
":" + srcPool.getSourcePort());
+                            rSrc.confSet("key", srcPool.getAuthSecret());
+
+                            Rados rDest = new 
Rados(destPool.getAuthUserName());
+                            rDest.confSet("mon_host", destPool.getSourceHost() 
+ ":" + destPool.getSourcePort());
+                            rDest.confSet("key", destPool.getAuthSecret());
+
+                            IoCTX sIO = 
rSrc.ioCtxCreate(srcPool.getSourceDir());
+                            Rbd sRbd = new Rbd(sIO);
+
+                            IoCTX dIO = 
rDest.ioCtxCreate(destPool.getSourceDir());
+                            Rbd dRbd = new Rbd(dIO);
+
+                            s_logger.debug("Creating " + disk.getName() + " on 
the destination cluster " + rDest.confGet("mon_host")
+                                           + " in pool " + 
destPool.getSourceDir());
+                            dRbd.create(disk.getName(), 
template.getVirtualSize(), rbdFeatures, rbdOrder);
+
+                            RbdImage srcImage = sRbd.open(template.getName());
+                            RbdImage destImage = dRbd.open(disk.getName());
+
+                            s_logger.debug("Copying " + template.getName() + " 
from Ceph cluster " + rSrc.confGet("mon_host") + " to " + disk.getName()
+                                           + " on cluster " + 
rDest.confGet("mon_host"));
+                            sRbd.copy(srcImage, destImage);
+
+                            sRbd.close(srcImage);
+                            dRbd.close(destImage);
+                        
+                            rSrc.ioCtxDestroy(sIO);
+                            rDest.ioCtxDestroy(dIO);
+                        }
+                    } catch (RadosException e) {
+                        s_logger.error("Failed to perform a RADOS action on 
the Ceph cluster, the error was: " + e.getMessage());
+                    } catch (RbdException e) {
+                        s_logger.error("Failed to perform a RBD action on the 
Ceph cluster, the error was: " + e.getMessage());
                     }
                 }
             }

Reply via email to