CLOUDSTACK-8560: Stat the resulting image after copying from template and return the size

This way we update the DB with the actual size of the disk after deployment from template
This commit is contained in:
Wido den Hollander 2015-06-15 17:30:06 +02:00
parent 3e3c11ffca
commit 4b4c52ea77

View File

@ -39,6 +39,7 @@ import com.ceph.rados.RadosException;
import com.ceph.rbd.Rbd; import com.ceph.rbd.Rbd;
import com.ceph.rbd.RbdException; import com.ceph.rbd.RbdException;
import com.ceph.rbd.RbdImage; import com.ceph.rbd.RbdImage;
import com.ceph.rbd.jna.RbdImageInfo;
import com.ceph.rbd.jna.RbdSnapInfo; import com.ceph.rbd.jna.RbdSnapInfo;
import org.apache.cloudstack.utils.qemu.QemuImg; import org.apache.cloudstack.utils.qemu.QemuImg;
@ -1239,6 +1240,10 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
destFile = new QemuImgFile(destPath, destFormat); destFile = new QemuImgFile(destPath, destFormat);
try { try {
qemu.convert(srcFile, destFile); qemu.convert(srcFile, destFile);
Map<String, String> destInfo = qemu.info(destFile);
Long virtualSize = Long.parseLong(destInfo.get(new String("virtual_size")));
newDisk.setVirtualSize(virtualSize);
newDisk.setSize(virtualSize);
} catch (QemuImgException e) { } catch (QemuImgException e) {
s_logger.error("Failed to convert " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage()); s_logger.error("Failed to convert " + srcFile.getFileName() + " to " + destFile.getFileName() + " the error was: " + e.getMessage());
newDisk = null; newDisk = null;
@ -1257,18 +1262,19 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
s_logger.debug("The source image is not RBD, but the destination is. We will convert into RBD format 2"); s_logger.debug("The source image is not RBD, but the destination is. We will convert into RBD format 2");
try { try {
srcFile = new QemuImgFile(sourcePath, sourceFormat); srcFile = new QemuImgFile(sourcePath, sourceFormat);
String rbdDestPath = destPool.getSourceDir() + "/" + name;
String rbdDestFile = KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(), String rbdDestFile = KVMPhysicalDisk.RBDStringBuilder(destPool.getSourceHost(),
destPool.getSourcePort(), destPool.getSourcePort(),
destPool.getAuthUserName(), destPool.getAuthUserName(),
destPool.getAuthSecret(), destPool.getAuthSecret(),
destPool.getSourceDir() + "/" + name); rbdDestPath);
destFile = new QemuImgFile(rbdDestFile, destFormat); destFile = new QemuImgFile(rbdDestFile, destFormat);
s_logger.debug("Starting copy from source image " + srcFile.getFileName() + " to RBD image " + destPool.getSourceDir() + "/" + name); s_logger.debug("Starting copy from source image " + srcFile.getFileName() + " to RBD image " + rbdDestPath);
qemu.convert(srcFile, destFile); qemu.convert(srcFile, destFile);
s_logger.debug("Succesfully converted source image " + srcFile.getFileName() + " to RBD image " + destPool.getSourceDir() + "/" + name); s_logger.debug("Succesfully converted source image " + srcFile.getFileName() + " to RBD image " + rbdDestPath);
/* We still have to create and protect a RBD snapshot in order to do cloning */ /* We have to stat the RBD image to see how big it became afterwards */
Rados r = new Rados(destPool.getAuthUserName()); Rados r = new Rados(destPool.getAuthUserName());
r.confSet("mon_host", destPool.getSourceHost() + ":" + destPool.getSourcePort()); r.confSet("mon_host", destPool.getSourceHost() + ":" + destPool.getSourcePort());
r.confSet("key", destPool.getAuthSecret()); r.confSet("key", destPool.getAuthSecret());
@ -1280,8 +1286,12 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
Rbd rbd = new Rbd(io); Rbd rbd = new Rbd(io);
RbdImage image = rbd.open(name); RbdImage image = rbd.open(name);
RbdImageInfo rbdInfo = image.stat();
newDisk.setSize(rbdInfo.size);
newDisk.setVirtualSize(rbdInfo.size);
s_logger.debug("After copy the resulting RBD image " + rbdDestPath + " is " + rbdInfo.size + " bytes long");
rbd.close(image); rbd.close(image);
r.ioCtxDestroy(io); r.ioCtxDestroy(io);
} catch (QemuImgException e) { } catch (QemuImgException e) {
s_logger.error("Failed to 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());