You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by wi...@apache.org on 2014/03/24 16:37:12 UTC
git commit: updated refs/heads/master to 9763faf
Repository: cloudstack
Updated Branches:
refs/heads/master d5333f459 -> 9763faf85
rbd: Use qemu-img to convert from QCOW2 templates to RBD directly.
This saves the step of writing to a temporary image in /tmp first before
writing to RBD.
This is possible due to a new version in librbd. With the rbd_default_format
setting we can now force qemu-img to create format 2 RBD images.
This is available since Ceph version 0.67.5 (Dumpling).
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9763faf8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9763faf8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9763faf8
Branch: refs/heads/master
Commit: 9763faf85e3f54ac84d5ca1d5ad6e89c7fcc87ee
Parents: d5333f4
Author: Wido den Hollander <wi...@widodh.nl>
Authored: Mon Mar 24 16:35:13 2014 +0100
Committer: Wido den Hollander <wi...@widodh.nl>
Committed: Mon Mar 24 16:35:13 2014 +0100
----------------------------------------------------------------------
.../hypervisor/kvm/storage/KVMPhysicalDisk.java | 4 ++
.../kvm/storage/LibvirtStorageAdaptor.java | 60 +++++---------------
2 files changed, 17 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9763faf8/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
index 7726727..669bd0b 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
@@ -39,6 +39,10 @@ public class KVMPhysicalDisk {
rbdOpts += ":id=" + authUserName;
rbdOpts += ":key=" + authSecret;
}
+
+ rbdOpts += ":rbd_default_format=2";
+ rbdOpts += ":client_mount_timeout=30";
+
return rbdOpts;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9763faf8/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 5de8bd2..c1a5043 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
@@ -16,10 +16,7 @@
// under the License.
package com.cloud.hypervisor.kvm.storage;
-import java.io.BufferedInputStream;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -1096,19 +1093,19 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
boolean useTmpFile = false;
try {
- if (sourceFormat != destFormat) {
- srcFile = new QemuImgFile(sourcePath, sourceFormat);
- destFile = new QemuImgFile("/tmp/" + name);
- s_logger.debug("Converting " + srcFile.getFileName() + " to " + destFile.getFileName() + " as a temporary file for RBD conversion");
- qemu.convert(srcFile, destFile);
- sourceFile = destFile.getFileName();
- useTmpFile = true;
- } else {
- // Source file is RAW, we can write directly to RBD
- sourceFile = sourcePath;
- }
+ srcFile = new QemuImgFile(sourcePath, sourceFormat);
+ String rbdDestFile = KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
+ destPool.getSourcePort(),
+ destPool.getAuthUserName(),
+ destPool.getAuthSecret(),
+ destPool.getSourceDir() + "/" + name);
+ destFile = new QemuImgFile(rbdDestFile, destFormat);
+
+ s_logger.debug("Starting copy from source image " + srcFile.getFileName() + " to RBD image " + destPool.getSourceDir() + "/" + name);
+ qemu.convert(srcFile, destFile);
+ s_logger.debug("Succesfully converted source image " + srcFile.getFileName() + " to RBD image " + destPool.getSourceDir() + "/" + name);
- // We now convert the temporary file to a RBD image with format 2
+ /* We still have to create and protect a RBD snapshot in order to do cloning */
Rados r = new Rados(destPool.getAuthUserName());
r.confSet("mon_host", destPool.getSourceHost() + ":" + destPool.getSourcePort());
r.confSet("key", destPool.getAuthSecret());
@@ -1119,35 +1116,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
IoCTX io = r.ioCtxCreate(destPool.getSourceDir());
Rbd rbd = new Rbd(io);
- s_logger.debug("Creating RBD image " + name + " in Ceph pool " + destPool.getSourceDir() + " with RBD format 2");
- rbd.create(name, disk.getVirtualSize(), rbdFeatures, rbdOrder);
-
RbdImage image = rbd.open(name);
- File fh = new File(sourceFile);
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fh));
-
- int chunkSize = 4194304;
- long offset = 0;
- s_logger.debug("Reading file " + sourceFile + " (" + fh.length() + " bytes) into RBD image " + name + " in chunks of " + chunkSize + " bytes");
- while (true) {
- byte[] buf = new byte[chunkSize];
-
- int bytes = bis.read(buf);
- if (bytes <= 0) {
- break;
- }
- image.write(buf, offset, bytes);
- offset += bytes;
- }
- s_logger.debug("Completed writing " + sourceFile + " to RBD image " + name + ". Bytes written: " + offset);
- bis.close();
-
- if (useTmpFile) {
- s_logger.debug("Removing temporary file " + sourceFile);
- fh.delete();
- }
-
/* Snapshot the image and protect that snapshot so we can clone (layer) from it */
s_logger.debug("Creating RBD snapshot " + rbdTemplateSnapName + " on image " + name);
image.snapCreate(rbdTemplateSnapName);
@@ -1157,7 +1127,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
rbd.close(image);
r.ioCtxDestroy(io);
} catch (QemuImgException e) {
- s_logger.error("Failed to do a temp convert from " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage());
+ s_logger.error("Failed to convert from " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage());
newDisk = null;
} catch (RadosException e) {
s_logger.error("A Ceph RADOS operation failed (" + e.getReturnValue() + "). The error was: " + e.getMessage());
@@ -1165,11 +1135,7 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
} catch (RbdException e) {
s_logger.error("A Ceph RBD operation failed (" + e.getReturnValue() + "). The error was: " + e.getMessage());
newDisk = null;
- } catch (IOException e) {
- s_logger.error("Failed reading the temporary file during the conversion to RBD: " + e.getMessage());
- newDisk = null;
}
-
} else {
/**
We let Qemu-Img do the work here. Although we could work with librbd and have that do the cloning