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());

Reply via email to