rbd: When the template is a RAW image, do not use a temp file when deploying

This commit is contained in:
Wido den Hollander 2013-08-13 17:22:22 +02:00
parent 21d8982484
commit d7f738fb64
1 changed files with 21 additions and 11 deletions

View File

@ -1022,13 +1022,21 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
* A HUGE performance gain can be achieved here if QCOW2 -> RBD format 2 can be done in one step
*/
s_logger.debug("The source image is not RBD, but the destination is. We will convert into RBD format 2");
String tmpFile = "/tmp/" + name;
String sourceFile;
boolean useTmpFile = false;
try {
srcFile = new QemuImgFile(sourcePath, sourceFormat);
destFile = new QemuImgFile(tmpFile);
s_logger.debug("Converting " + srcFile.getFileName() + " to " + tmpFile + " as a temporary file for RBD conversion");
qemu.convert(srcFile, destFile);
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;
}
// We now convert the temporary file to a RBD image with format 2
Rados r = new Rados(destPool.getAuthUserName());
@ -1045,13 +1053,12 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
RbdImage image = rbd.open(name);
// We now read the temporary file and write it to the RBD image
File fh = new File(tmpFile);
File fh = new File(sourceFile);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fh));
int chunkSize = 4194304;
long offset = 0;
s_logger.debug("Reading temporary file " + tmpFile + " (" + fh.length() + " bytes) into RBD image " + name + " in chunks of " + chunkSize + " bytes");
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];
@ -1062,10 +1069,13 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
image.write(buf, offset, bytes);
offset += bytes;
}
s_logger.debug("Completed writing " + tmpFile + " to RBD image " + name + ". Bytes written: " + offset);
s_logger.debug("Completed writing " + sourceFile + " to RBD image " + name + ". Bytes written: " + offset);
bis.close();
s_logger.debug("Removing temporary file " + tmpFile);
fh.delete();
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 " + this.rbdTemplateSnapName + " on image " + name);