This is an automated email from the ASF dual-hosted git repository.

gabriel pushed a commit to branch snapshot-deletion-issues
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit d31ecb8cfccf13096f8d6013e804b598cbfe0b38
Author: GabrielBrascher <gabr...@apache.org>
AuthorDate: Fri Mar 13 01:33:54 2020 -0300

    Manage snapshot deletion for KVM + NFS (primary storage)
---
 .../kvm/storage/KVMStorageProcessor.java           | 62 +++++++++++++---------
 1 file changed, 38 insertions(+), 24 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 9a2fd27..2bd55ad 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -127,6 +127,14 @@ public class KVMStorageProcessor implements 
StorageProcessor {
     private String _createTmplPath;
     private String _manageSnapshotPath;
     private int _cmdsTimeout;
+    
+    private static final String MANAGE_SNAPSTHOT_CREATE = "-c";
+    private static final String MANAGE_SNAPSTHOT_DESTROY = "-d";
+    private static final String NAME = "-n";
+    private static final String CEPH_MON_HOST = "mon_host";
+    private static final String CEPH_AUTH_KEY = "key";
+    private static final String CEPH_CLIENT_MOUNT_TIMEOUT = 
"client_mount_timeout";
+    private static final String CEPH_DEFAULT_MOUNT_TIMEOUT = "30";
 
     public KVMStorageProcessor(final KVMStoragePoolManager storagePoolMgr, 
final LibvirtComputingResource resource) {
         this.storagePoolMgr = storagePoolMgr;
@@ -563,7 +571,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                 final Script command = new Script(_createTmplPath, wait, 
s_logger);
                 command.add("-f", disk.getPath());
                 command.add("-t", tmpltPath);
-                command.add("-n", templateName + ".qcow2");
+                command.add(NAME, templateName + ".qcow2");
 
                 final String result = command.execute();
 
@@ -949,7 +957,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
             } else {
                 final Script command = new Script(_manageSnapshotPath, 
cmd.getWaitInMillSeconds(), s_logger);
                 command.add("-b", snapshotDisk.getPath());
-                command.add("-n", snapshotName);
+                command.add(NAME, snapshotName);
                 command.add("-p", snapshotDestPath);
                 if (isCreatedFromVmSnapshot) {
                     descName = UUID.randomUUID().toString();
@@ -1010,14 +1018,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                         }
                     } else {
                         if (primaryPool.getType() != StoragePoolType.RBD) {
-                            final Script command = new 
Script(_manageSnapshotPath, _cmdsTimeout, s_logger);
-                            command.add("-d", snapshotDisk.getPath());
-                            command.add("-n", snapshotName);
-                            final String result = command.execute();
-                            if (result != null) {
-                                s_logger.debug("Failed to delete snapshot on 
primary: " + result);
-                                // return new CopyCmdAnswer("Failed to backup 
snapshot: " + result);
-                            }
+                            
deleteSnapshotViaManageSnapshotScript(snapshotName, snapshotDisk);
                         }
                     }
                 } catch (final Exception ex) {
@@ -1035,6 +1036,16 @@ public class KVMStorageProcessor implements 
StorageProcessor {
         }
     }
 
+    private void deleteSnapshotViaManageSnapshotScript(final String 
snapshotName, KVMPhysicalDisk snapshotDisk) {
+        final Script command = new Script(_manageSnapshotPath, _cmdsTimeout, 
s_logger);
+        command.add(MANAGE_SNAPSTHOT_DESTROY, snapshotDisk.getPath());
+        command.add(NAME, snapshotName);
+        final String result = command.execute();
+        if (result != null) {
+            s_logger.debug("Failed to delete snapshot on primary: " + result);
+        }
+    }
+
     protected synchronized String attachOrDetachISO(final Connect conn, final 
String vmName, String isoPath, final boolean isAttach) throws LibvirtException, 
URISyntaxException,
     InternalErrorException {
         String isoXml = null;
@@ -1489,12 +1500,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                  */
                 if (primaryPool.getType() == StoragePoolType.RBD) {
                     try {
-                        final Rados r = new 
Rados(primaryPool.getAuthUserName());
-                        r.confSet("mon_host", primaryPool.getSourceHost() + 
":" + primaryPool.getSourcePort());
-                        r.confSet("key", primaryPool.getAuthSecret());
-                        r.confSet("client_mount_timeout", "30");
-                        r.connect();
-                        s_logger.debug("Succesfully connected to Ceph cluster 
at " + r.confGet("mon_host"));
+                        Rados r = radosConnect(primaryPool);
 
                         final IoCTX io = 
r.ioCtxCreate(primaryPool.getSourceDir());
                         final Rbd rbd = new Rbd(io);
@@ -1511,8 +1517,8 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                 } else {
                     /* VM is not running, create a snapshot by ourself */
                     final Script command = new Script(_manageSnapshotPath, 
_cmdsTimeout, s_logger);
-                    command.add("-c", disk.getPath());
-                    command.add("-n", snapshotName);
+                    command.add(MANAGE_SNAPSTHOT_CREATE, disk.getPath());
+                    command.add(NAME, snapshotName);
                     final String result = command.execute();
                     if (result != null) {
                         s_logger.debug("Failed to manage snapshot: " + result);
@@ -1531,6 +1537,16 @@ public class KVMStorageProcessor implements 
StorageProcessor {
         }
     }
 
+    private Rados radosConnect(final KVMStoragePool primaryPool) throws 
RadosException {
+        Rados r = new Rados(primaryPool.getAuthUserName());
+        r.confSet(CEPH_MON_HOST, primaryPool.getSourceHost() + ":" + 
primaryPool.getSourcePort());
+        r.confSet(CEPH_AUTH_KEY, primaryPool.getAuthSecret());
+        r.confSet(CEPH_CLIENT_MOUNT_TIMEOUT, CEPH_DEFAULT_MOUNT_TIMEOUT);
+        r.connect();
+        s_logger.debug("Succesfully connected to Ceph cluster at " + 
r.confGet(CEPH_MON_HOST));
+        return r;
+    }
+    
     @Override
     public Answer deleteVolume(final DeleteCommand cmd) {
         final VolumeObjectTO vol = (VolumeObjectTO)cmd.getData();
@@ -1619,12 +1635,7 @@ public class KVMStorageProcessor implements 
StorageProcessor {
             String snapshotName = 
snapshotFullPath.substring(snapshotFullPath.lastIndexOf("/") + 1);
             snap_full_name = disk.getName() + "@" + snapshotName;
             if (primaryPool.getType() == StoragePoolType.RBD) {
-                Rados r = new Rados(primaryPool.getAuthUserName());
-                r.confSet("mon_host", primaryPool.getSourceHost() + ":" + 
primaryPool.getSourcePort());
-                r.confSet("key", primaryPool.getAuthSecret());
-                r.confSet("client_mount_timeout", "30");
-                r.connect();
-                s_logger.debug("Succesfully connected to Ceph cluster at " + 
r.confGet("mon_host"));
+                Rados r = radosConnect(primaryPool);
                 IoCTX io = r.ioCtxCreate(primaryPool.getSourceDir());
                 Rbd rbd = new Rbd(io);
                 RbdImage image = rbd.open(disk.getName());
@@ -1644,6 +1655,9 @@ public class KVMStorageProcessor implements 
StorageProcessor {
                     rbd.close(image);
                     r.ioCtxDestroy(io);
                 }
+            } else if (primaryPool.getType() == 
StoragePoolType.NetworkFilesystem) {
+                s_logger.info(String.format("Attempting to remove snapshot on 
primary storage (id=%s, snapshot=%s, storage type=%s)", snapshotTO.getId(), 
snap_full_name, primaryPool.getType()));
+                deleteSnapshotViaManageSnapshotScript(snapshotName, disk);
             } else {
                 s_logger.warn("Operation not implemented for storage pool type 
of " + primaryPool.getType().toString());
                 throw new InternalErrorException("Operation not implemented 
for storage pool type of " + primaryPool.getType().toString());

Reply via email to