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

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


The following commit(s) were added to refs/heads/4.19 by this push:
     new 95c24810ab4 linstor: try to delete -rst resource before snapshot 
backup (#10443)
95c24810ab4 is described below

commit 95c24810ab43810550ed70b3ebc4ba131082f7d3
Author: Rene Peinthor <[email protected]>
AuthorDate: Mon Mar 10 16:23:01 2025 +0100

    linstor: try to delete -rst resource before snapshot backup (#10443)
    
    If a -rst resource wasn't deleted because of a failed copy,
    a reoccurring snapshot attempt couldn't be done, because there
    was still the "old" -rst resource. To prevent this always
    try to remove the -rst resource before, if it doesn't exist it is a noop.
---
 plugins/storage/volume/linstor/CHANGELOG.md        |  6 +++++
 .../driver/LinstorPrimaryDataStoreDriverImpl.java  | 29 +++++++++++++---------
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/plugins/storage/volume/linstor/CHANGELOG.md 
b/plugins/storage/volume/linstor/CHANGELOG.md
index fb247eef5df..e27e521bcd8 100644
--- a/plugins/storage/volume/linstor/CHANGELOG.md
+++ b/plugins/storage/volume/linstor/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to Linstor CloudStack plugin will be 
documented in this file
 The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic 
Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [2025-02-21]
+
+### Fixed
+
+- Always try to delete cs-...-rst resource before doing a snapshot backup
+
 ## [2025-01-27]
 
 ### Fixed
diff --git 
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
 
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
index 22cb4eb8911..a0cb5d17444 100644
--- 
a/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
+++ 
b/plugins/storage/volume/linstor/src/main/java/org/apache/cloudstack/storage/datastore/driver/LinstorPrimaryDataStoreDriverImpl.java
@@ -1117,6 +1117,8 @@ public class LinstorPrimaryDataStoreDriverImpl implements 
PrimaryDataStoreDriver
             String snapshotName,
             String restoredName) throws ApiException {
         final String rscGrp = getRscGrp(storagePoolVO);
+        // try to delete -rst resource, could happen if the copy failed and 
noone deleted it.
+        deleteResourceDefinition(storagePoolVO, restoredName);
         ResourceDefinitionCreate rdc = 
createResourceDefinitionCreate(restoredName, rscGrp);
         api.resourceDefinitionCreate(rdc);
 
@@ -1259,19 +1261,22 @@ public class LinstorPrimaryDataStoreDriverImpl 
implements PrimaryDataStoreDriver
             throws ApiException {
         Answer answer;
         String restoreName = rscName + "-rst";
-        String devName = restoreResourceFromSnapshot(api, pool, rscName, 
snapshotName, restoreName);
-
-        Optional<RemoteHostEndPoint> optEPAny = getLinstorEP(api, restoreName);
-        if (optEPAny.isPresent()) {
-            // patch the src device path to the temporary linstor resource
-            snapshotObject.setPath(devName);
-            origCmd.setSrcTO(snapshotObject.getTO());
-            answer = optEPAny.get().sendMessage(origCmd);
-        } else{
-            answer = new Answer(origCmd, false, "Unable to get matching 
Linstor endpoint.");
+        try {
+            String devName = restoreResourceFromSnapshot(api, pool, rscName, 
snapshotName, restoreName);
+
+            Optional<RemoteHostEndPoint> optEPAny = getLinstorEP(api, 
restoreName);
+            if (optEPAny.isPresent()) {
+                // patch the src device path to the temporary linstor resource
+                snapshotObject.setPath(devName);
+                origCmd.setSrcTO(snapshotObject.getTO());
+                answer = optEPAny.get().sendMessage(origCmd);
+            } else{
+                answer = new Answer(origCmd, false, "Unable to get matching 
Linstor endpoint.");
+            }
+        } finally {
+            // delete the temporary resource, noop if already gone
+            api.resourceDefinitionDelete(restoreName);
         }
-        // delete the temporary resource, noop if already gone
-        api.resourceDefinitionDelete(restoreName);
         return answer;
     }
 

Reply via email to