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

dahn pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.20 by this push:
     new 9b8c862f9f6 removing the usage of volumeFreeze StorPool API call 
(#8575)
9b8c862f9f6 is described below

commit 9b8c862f9f6106ccd0945b5a087ea6f124ba0619
Author: slavkap <[email protected]>
AuthorDate: Mon Mar 3 17:03:15 2025 +0200

    removing the usage of volumeFreeze StorPool API call (#8575)
---
 .../driver/StorPoolPrimaryDataStoreDriver.java     | 119 +++++++++------------
 .../storage/datastore/util/StorPoolUtil.java       |   6 ++
 .../storage/motion/StorPoolDataMotionStrategy.java |  15 ++-
 3 files changed, 64 insertions(+), 76 deletions(-)

diff --git 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java
 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java
index 631186636ca..c04538271a1 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
+import com.cloud.storage.dao.SnapshotDetailsVO;
 import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -110,7 +111,6 @@ import com.cloud.storage.VolumeDetailVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.SnapshotDetailsDao;
-import com.cloud.storage.dao.SnapshotDetailsVO;
 import com.cloud.storage.dao.StoragePoolHostDao;
 import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VolumeDao;
@@ -640,57 +640,16 @@ public class StorPoolPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
                     SnapshotDataStoreVO snap = 
getSnapshotImageStoreRef(sinfo.getId(), vinfo.getDataCenterId());
                     SnapshotDetailsVO snapshotDetail = 
snapshotDetailsDao.findDetail(sinfo.getId(), StorPoolUtil.SP_DELAY_DELETE);
                     if (snapshotDetail != null) {
-                        err = String.format("Could not create volume from 
snapshot due to: %s", resp.getError());
+                        err = String.format("Could not create volume from 
snapshot due to: %s. The snapshot was created with the delayDelete option.", 
resp.getError());
                     } else if (snap != null && 
StorPoolStorageAdaptor.getVolumeNameFromPath(snap.getInstallPath(), false) == 
null) {
-                        resp = StorPoolUtil.volumeCreate(srcData.getUuid(), 
null, size, null, "no", "snapshot", sinfo.getBaseVolume().getMaxIops(), conn);
-                        if (resp.getError() == null) {
-                            VolumeObjectTO dstTO = (VolumeObjectTO) 
dstData.getTO();
-                            dstTO.setSize(size);
-                            
dstTO.setPath(StorPoolUtil.devPath(StorPoolUtil.getNameFromResponse(resp, 
false)));
-                            cmd = new 
StorPoolDownloadTemplateCommand(srcData.getTO(), dstTO, 
StorPoolHelper.getTimeout(StorPoolHelper.PrimaryStorageDownloadWait, 
configDao), VirtualMachineManager.ExecuteInSequence.value(), "volume");
-
-                            EndPoint ep = selector.select(srcData, dstData);
-                            if (ep == null) {
-                                err = "No remote endpoint to send command, 
check if host or ssvm is down?";
-                            } else {
-                                answer = ep.sendMessage(cmd);
-                            }
-
-                            if (answer != null && answer.getResult()) {
-                                SpApiResponse resp2 = 
StorPoolUtil.volumeFreeze(StorPoolUtil.getNameFromResponse(resp, true), conn);
-                                if (resp2.getError() != null) {
-                                    err = String.format("Could not freeze 
Storpool volume %s. Error: %s", srcData.getUuid(), resp2.getError());
-                                } else {
-                                    String name = 
StorPoolUtil.getNameFromResponse(resp, false);
-                                    SnapshotDetailsVO snapshotDetails = 
snapshotDetailsDao.findDetail(sinfo.getId(), sinfo.getUuid());
-                                    if (snapshotDetails != null) {
-                                        
StorPoolHelper.updateSnapshotDetailsValue(snapshotDetails.getId(), 
StorPoolUtil.devPath(name), "snapshot");
-                                    }else {
-                                        
StorPoolHelper.addSnapshotDetails(sinfo.getId(), sinfo.getUuid(), 
StorPoolUtil.devPath(name), snapshotDetailsDao);
-                                    }
-                                    resp = 
StorPoolUtil.volumeCreate(volumeName, StorPoolUtil.getNameFromResponse(resp, 
true), size, null, null, "volume", sinfo.getBaseVolume().getMaxIops(), conn);
-                                    if (resp.getError() == null) {
-                                        
updateStoragePool(dstData.getDataStore().getId(), size);
-
-                                        VolumeObjectTO to = (VolumeObjectTO) 
dstData.getTO();
-                                        
to.setPath(StorPoolUtil.devPath(StorPoolUtil.getNameFromResponse(resp, false)));
-                                        to.setSize(size);
-                                        // successfully downloaded snapshot to 
primary storage
-                                        answer = new CopyCmdAnswer(to);
-                                        StorPoolUtil.spLog("Created volume=%s 
with uuid=%s from snapshot=%s with uuid=%s", name, to.getUuid(), snapshotName, 
sinfo.getUuid());
-
-                                    } else {
-                                        err = String.format("Could not create 
Storpool volume %s from snapshot %s. Error: %s", volumeName, snapshotName, 
resp.getError());
-                                    }
-                                }
-                            } else {
-                                err = answer != null ? answer.getDetails() : 
"Unknown error while downloading template. Null answer returned.";
-                            }
+                        SpApiResponse emptyVolumeCreateResp = 
StorPoolUtil.volumeCreate(volumeName, null, size, null, null, "volume", null, 
conn);
+                        if (emptyVolumeCreateResp.getError() == null) {
+                            answer = createVolumeFromSnapshot(srcData, 
dstData, size, emptyVolumeCreateResp);
                         } else {
-                            err = String.format("Could not create Storpool 
volume %s from snapshot %s. Error: %s", volumeName, snapshotName, 
resp.getError());
+                            answer = new Answer(cmd, false, 
String.format("Could not create Storpool volume %s from snapshot %s. Error: 
%s", volumeName, snapshotName, emptyVolumeCreateResp.getError()));
                         }
                     } else {
-                        err = String.format("The snapshot %s does not exists 
neither on primary, neither on secondary storage. Cannot create volume from 
snapshot", snapshotName);
+                        answer = new Answer(cmd, false, String.format("The 
snapshot %s does not exists neither on primary, neither on secondary storage. 
Cannot create volume from snapshot", snapshotName));
                     }
                 } else {
                     err = String.format("Could not create Storpool volume %s 
from snapshot %s. Error: %s", volumeName, snapshotName, resp.getError());
@@ -791,22 +750,17 @@ public class StorPoolPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
                         err = String.format("Could not create Storpool volume 
for CS template %s. Error: %s", name, resp.getError());
                     } else {
                         String volumeNameToSnapshot = 
StorPoolUtil.getNameFromResponse(resp, true);
-                        SpApiResponse resp2 = 
StorPoolUtil.volumeFreeze(volumeNameToSnapshot, conn);
-                        if (resp2.getError() != null) {
-                            err = String.format("Could not freeze Storpool 
volume %s. Error: %s", name, resp2.getError());
-                        } else {
-                            StorPoolUtil.spLog("Storpool snapshot [%s] for a 
template exists. Creating template on Storpool with name [%s]", 
tinfo.getUuid(), name);
-                            TemplateObjectTO dstTO = (TemplateObjectTO) 
dstData.getTO();
-                            
dstTO.setPath(StorPoolUtil.devPath(StorPoolUtil.getNameFromResponse(resp, 
false)));
-                            dstTO.setSize(size);
-                            answer = new CopyCmdAnswer(dstTO);
-                        }
+                        TemplateObjectTO dstTO = (TemplateObjectTO) 
dstData.getTO();
+
+                        answer = createVolumeSnapshot(cmd, size, conn, 
volumeNameToSnapshot, dstTO);
+                        StorPoolUtil.volumeDelete(volumeNameToSnapshot, conn);
                     }
                 } else {
                     resp = StorPoolUtil.volumeCreate(name, null, size, null, 
"no", "template", null, conn);
                     if (resp.getError() != null) {
                         err = String.format("Could not create Storpool volume 
for CS template %s. Error: %s", name, resp.getError());
                     } else {
+                        String volName = 
StorPoolUtil.getNameFromResponse(resp, true);
                         TemplateObjectTO dstTO = 
(TemplateObjectTO)dstData.getTO();
                         
dstTO.setPath(StorPoolUtil.devPath(StorPoolUtil.getNameFromResponse(resp, 
false)));
                         dstTO.setSize(size);
@@ -822,19 +776,12 @@ public class StorPoolPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
 
                         if (answer != null && answer.getResult()) {
                             // successfully downloaded template to primary 
storage
-                            SpApiResponse resp2 = 
StorPoolUtil.volumeFreeze(StorPoolUtil.getNameFromResponse(resp, true), conn);
-                            if (resp2.getError() != null) {
-                                err = String.format("Could not freeze Storpool 
volume %s. Error: %s", name, resp2.getError());
-                            }
+                            answer = createVolumeSnapshot(cmd, size, conn, 
volName, dstTO);
                         } else {
                             err = answer != null ? answer.getDetails() : 
"Unknown error while downloading template. Null answer returned.";
                         }
-                    }
-                }
-                if (err != null) {
-                    resp = 
StorPoolUtil.volumeDelete(StorPoolUtil.getNameFromResponse(resp, true), conn);
-                    if (resp.getError() != null) {
-                        logger.warn(String.format("Could not clean-up Storpool 
volume %s. Error: %s", name, resp.getError()));
+
+                        StorPoolUtil.volumeDelete(volName, conn);
                     }
                 }
             } else if (srcType == DataObjectType.TEMPLATE && dstType == 
DataObjectType.VOLUME) {
@@ -1027,6 +974,42 @@ public class StorPoolPrimaryDataStoreDriver implements 
PrimaryDataStoreDriver {
         callback.complete(res);
     }
 
+    private Answer createVolumeSnapshot(StorageSubSystemCommand cmd, Long 
size, SpConnectionDesc conn,
+            String volName, TemplateObjectTO dstTO) {
+        Answer answer;
+        SpApiResponse resp = StorPoolUtil.volumeSnapshot(volName, 
dstTO.getUuid(), null, "template", null, conn);
+        if (resp.getError() != null) {
+            answer = new Answer(cmd, false, String.format("Could not snapshot 
volume. Error: %s", resp.getError()));
+        } else {
+            dstTO.setPath(StorPoolUtil.devPath(
+                    StorPoolUtil.getSnapshotNameFromResponse(resp, false, 
StorPoolUtil.GLOBAL_ID)));
+            dstTO.setSize(size);
+            answer = new CopyCmdAnswer(dstTO);
+        }
+        return answer;
+    }
+
+    private Answer createVolumeFromSnapshot(DataObject srcData, DataObject 
dstData, final Long size,
+            SpApiResponse emptyVolumeCreateResp) {
+        Answer answer;
+        String name = StorPoolUtil.getNameFromResponse(emptyVolumeCreateResp, 
false);
+        VolumeObjectTO dstTO = (VolumeObjectTO) dstData.getTO();
+        dstTO.setSize(size);
+        dstTO.setPath(StorPoolUtil.devPath(name));
+        StorageSubSystemCommand cmd = new 
StorPoolDownloadTemplateCommand(srcData.getTO(), dstTO, 
StorPoolHelper.getTimeout(StorPoolHelper.PrimaryStorageDownloadWait, 
configDao), VirtualMachineManager.ExecuteInSequence.value(), "volume");
+
+        EndPoint ep = selector.select(srcData, dstData);
+        if (ep == null) {
+            answer = new Answer(cmd, false, "\"No remote endpoint to send 
command, check if host or ssvm is down?\"");
+        } else {
+            answer = ep.sendMessage(cmd);
+        }
+        if (answer == null || !answer.getResult()) {
+            answer = new Answer(cmd, false, answer != null ? 
answer.getDetails() : "Unknown error while downloading template. Null answer 
returned.");
+        }
+        return answer;
+    }
+
     private void updateVolumePoolType(VolumeInfo vinfo) {
         VolumeVO volumeVO = volumeDao.findById(vinfo.getId());
         volumeVO.setPoolType(StoragePoolType.StorPool);
diff --git 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolUtil.java
 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolUtil.java
index dcb190a573b..fd62157f136 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolUtil.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/util/StorPoolUtil.java
@@ -643,6 +643,12 @@ public class StorPoolUtil {
         return POST("MultiCluster/VolumeRevert/" + name, json, conn);
     }
 
+    /**
+     * @deprecated Use volumeSnapshot instead
+     * @param volumeName
+     * @param conn
+     * @return
+     */
     public static SpApiResponse volumeFreeze(final String volumeName, 
SpConnectionDesc conn) {
         return POST("MultiCluster/VolumeFreeze/" + volumeName, null, conn);
     }
diff --git 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java
 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java
index e7ea0900112..aa972d44343 100644
--- 
a/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java
+++ 
b/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/motion/StorPoolDataMotionStrategy.java
@@ -219,24 +219,23 @@ public class StorPoolDataMotionStrategy implements 
DataMotionStrategy {
                 } else {
                     answer = (CopyCmdAnswer) ep2.sendMessage(backupSnapshot);
                     if (answer != null && answer.getResult()) {
-                        SpApiResponse resSnapshot = 
StorPoolUtil.volumeFreeze(volumeName, conn);
+                        SpApiResponse resSnapshot = 
StorPoolUtil.volumeSnapshot(volumeName, template.getUuid(), null, "template", 
null, conn);
                         if (resSnapshot.getError() != null) {
-                            logger.debug("Could not snapshot volume [id: {}, 
name: {}]", snapshot.getId(), snapshot.getName());
-                            StorPoolUtil.spLog("Volume freeze failed with 
error=%s", resSnapshot.getError().getDescr());
+                            logger.debug(String.format("Could not snapshot 
volume with ID={}", snapshot.getId()));
+                            StorPoolUtil.spLog("VolumeSnapshot failed with 
error=%s", resSnapshot.getError().getDescr());
                             err = resSnapshot.getError().getDescr();
-                            StorPoolUtil.volumeDelete(volumeName, conn);
                         } else {
+                           String templPath = StorPoolUtil.devPath(
+                                    
StorPoolUtil.getSnapshotNameFromResponse(resSnapshot, false, 
StorPoolUtil.GLOBAL_ID));
                             
StorPoolHelper.updateVmStoreTemplate(template.getId(), 
template.getDataStore().getRole(),
-                                    
StorPoolUtil.devPath(StorPoolUtil.getNameFromResponse(res, false)), 
_templStoreDao);
+                                    templPath, _templStoreDao);
                         }
-                    } else {
-                        err = "Could not copy template to secondary " + 
answer.getResult();
-                        
StorPoolUtil.volumeDelete(StorPoolUtil.getNameFromResponse(res, true), conn);
                     }
                 }
             } catch (CloudRuntimeException e) {
                 err = e.getMessage();
             }
+            StorPoolUtil.volumeDelete(volumeName, conn);
         }
         _vmTemplateDetailsDao.persist(new VMTemplateDetailVO(template.getId(), 
StorPoolUtil.SP_STORAGE_POOL_ID,
                 String.valueOf(vInfo.getDataStore().getId()), false));

Reply via email to