Skip to content

Commit 9ed4ab7

Browse files
committed
CLOUDSTACK-5395: mark snapshot_store_ref as destroyed in case of backup snapshot failed
1 parent 90e01b1 commit 9ed4ab7

2 files changed

Lines changed: 30 additions & 22 deletions

File tree

engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,10 @@ protected Void copySnapshotAsyncCallback(AsyncCallbackDispatcher<SnapshotService
313313
if (result.isFailed()) {
314314
try {
315315
destSnapshot.processEvent(Event.OperationFailed);
316+
//if backup snapshot failed, mark srcSnapshot in snapshot_store_ref as failed also
317+
srcSnapshot.processEvent(Event.DestroyRequested);
318+
srcSnapshot.processEvent(Event.OperationSuccessed);
319+
316320
srcSnapshot.processEvent(Snapshot.Event.OperationFailed);
317321
} catch (NoTransitionException e) {
318322
s_logger.debug("Failed to update state: " + e.toString());

plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageProcessor.java

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,6 @@
3131
import java.util.Set;
3232
import java.util.UUID;
3333

34-
import org.apache.log4j.Logger;
35-
import org.apache.xmlrpc.XmlRpcException;
36-
37-
import com.xensource.xenapi.Connection;
38-
import com.xensource.xenapi.Host;
39-
import com.xensource.xenapi.PBD;
40-
import com.xensource.xenapi.Pool;
41-
import com.xensource.xenapi.SR;
42-
import com.xensource.xenapi.Types;
43-
import com.xensource.xenapi.Types.BadServerResponse;
44-
import com.xensource.xenapi.Types.VmPowerState;
45-
import com.xensource.xenapi.Types.XenAPIException;
46-
import com.xensource.xenapi.VBD;
47-
import com.xensource.xenapi.VDI;
48-
import com.xensource.xenapi.VM;
49-
import com.xensource.xenapi.VMGuestMetrics;
50-
5134
import org.apache.cloudstack.storage.command.AttachAnswer;
5235
import org.apache.cloudstack.storage.command.AttachCommand;
5336
import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreAnswer;
@@ -66,6 +49,8 @@
6649
import org.apache.cloudstack.storage.to.SnapshotObjectTO;
6750
import org.apache.cloudstack.storage.to.TemplateObjectTO;
6851
import org.apache.cloudstack.storage.to.VolumeObjectTO;
52+
import org.apache.log4j.Logger;
53+
import org.apache.xmlrpc.XmlRpcException;
6954

7055
import com.cloud.agent.api.Answer;
7156
import com.cloud.agent.api.CreateStoragePoolCommand;
@@ -88,6 +73,19 @@
8873
import com.cloud.utils.storage.encoding.DecodedDataObject;
8974
import com.cloud.utils.storage.encoding.DecodedDataStore;
9075
import com.cloud.utils.storage.encoding.Decoder;
76+
import com.xensource.xenapi.Connection;
77+
import com.xensource.xenapi.Host;
78+
import com.xensource.xenapi.PBD;
79+
import com.xensource.xenapi.Pool;
80+
import com.xensource.xenapi.SR;
81+
import com.xensource.xenapi.Types;
82+
import com.xensource.xenapi.Types.BadServerResponse;
83+
import com.xensource.xenapi.Types.VmPowerState;
84+
import com.xensource.xenapi.Types.XenAPIException;
85+
import com.xensource.xenapi.VBD;
86+
import com.xensource.xenapi.VDI;
87+
import com.xensource.xenapi.VM;
88+
import com.xensource.xenapi.VMGuestMetrics;
9189

9290
public class XenServerStorageProcessor implements StorageProcessor {
9391
private static final Logger s_logger = Logger.getLogger(XenServerStorageProcessor.class);
@@ -488,11 +486,15 @@ public Answer createSnapshot(CreateObjectCommand cmd) {
488486
Boolean isISCSI = IsISCSI(type);
489487
String snapshotParentUUID = getVhdParent(conn, srUUID, snapshotUUID, isISCSI);
490488

491-
String preSnapshotParentUUID = getVhdParent(conn, srUUID, preSnapshotUUID, isISCSI);
492-
if( snapshotParentUUID != null && snapshotParentUUID.equals(preSnapshotParentUUID)) {
493-
// this is empty snapshot, remove it
494-
snapshot.destroy(conn);
495-
snapshotUUID = preSnapshotUUID;
489+
try {
490+
String preSnapshotParentUUID = getVhdParent(conn, srUUID, preSnapshotUUID, isISCSI);
491+
if( snapshotParentUUID != null && snapshotParentUUID.equals(preSnapshotParentUUID)) {
492+
// this is empty snapshot, remove it
493+
snapshot.destroy(conn);
494+
snapshotUUID = preSnapshotUUID;
495+
}
496+
} catch(Exception e) {
497+
s_logger.debug("Failed to get parent snapshot", e);
496498
}
497499
}
498500
SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
@@ -1328,6 +1330,8 @@ public Answer backupSnapshot(CopyCommand cmd) {
13281330
}
13291331
}
13301332
} catch (Exception e) {
1333+
s_logger.debug("Failed to get parent snapshots, take full snapshot", e);
1334+
fullbackup = true;
13311335
}
13321336
}
13331337

0 commit comments

Comments
 (0)