File tree Expand file tree Collapse file tree 2 files changed +42
-8
lines changed
plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage Expand file tree Collapse file tree 2 files changed +42
-8
lines changed Original file line number Diff line number Diff line change @@ -930,7 +930,7 @@ public Answer backupSnapshot(final CopyCommand cmd) {
930
930
final String secondaryStoragePoolUrl = nfsImageStore .getUrl ();
931
931
// NOTE: snapshot name is encoded in snapshot path
932
932
final int index = snapshot .getPath ().lastIndexOf ("/" );
933
- final boolean isCreatedFromVmSnapshot = ( index == -1 ) ? true : false ; // -1 means the snapshot is created from existing vm snapshot
933
+ final boolean isCreatedFromVmSnapshot = index == -1 ; // -1 means the snapshot is created from existing vm snapshot
934
934
935
935
final String snapshotName = snapshot .getPath ().substring (index + 1 );
936
936
String descName = snapshotName ;
@@ -1002,7 +1002,7 @@ public Answer backupSnapshot(final CopyCommand cmd) {
1002
1002
}
1003
1003
} else {
1004
1004
final Script command = new Script (_manageSnapshotPath , cmd .getWaitInMillSeconds (), s_logger );
1005
- command .add ("-b" , snapshot .getPath ());
1005
+ command .add ("-b" , isCreatedFromVmSnapshot ? snapshotDisk . getPath () : snapshot .getPath ());
1006
1006
command .add (NAME_OPTION , snapshotName );
1007
1007
command .add ("-p" , snapshotDestPath );
1008
1008
if (isCreatedFromVmSnapshot ) {
Original file line number Diff line number Diff line change @@ -226,14 +226,48 @@ backup_snapshot() {
226
226
return 2
227
227
fi
228
228
elif [ -f ${disk} ]; then
229
+ if [[ $disk == * " /snapshots/" * ]]; then
230
+ # Backup volume snapshot
231
+ cp " $disk " " ${destPath} /${destName} "
232
+ ret_code=$?
229
233
230
- cp " $disk " " ${destPath} /${destName} "
231
- ret_code=$?
234
+ if [ $ret_code -gt 0 ]
235
+ then
236
+ printf " Failed to backup $snapshotname for disk $disk to $destPath \n" >&2
237
+ return 2
238
+ fi
239
+ else
240
+ # Backup VM snapshot
241
+ qemuimg_ret=$( $qemu_img snapshot $forceShareFlag -l $disk 2>&1 )
242
+ ret_code=$?
243
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == * " snapshot: invalid option -- 'U'" * ]]; then
244
+ forceShareFlag=" "
245
+ qemuimg_ret=$( $qemu_img snapshot $forceShareFlag -l $disk )
246
+ ret_code=$?
247
+ fi
232
248
233
- if [ $ret_code -gt 0 ]
234
- then
235
- printf " Failed to backup $snapshotname for disk $disk to $destPath \n" >&2
236
- return 2
249
+ if [ $ret_code -gt 0 ] || [[ ! $qemuimg_ret == * " $snapshotname " * ]]; then
250
+ printf " there is no $snapshotname on disk $disk \n" >&2
251
+ return 1
252
+ fi
253
+
254
+ qemuimg_ret=$( $qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l snapshot.name=$snapshotname $disk $destPath /$destName 2>&1 > /dev/null)
255
+ ret_code=$?
256
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == * " convert: invalid option -- 'U'" * ]]; then
257
+ forceShareFlag=" "
258
+ qemuimg_ret=$( $qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l snapshot.name=$snapshotname $disk $destPath /$destName 2>&1 > /dev/null)
259
+ ret_code=$?
260
+ fi
261
+
262
+ if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == * " convert: invalid option -- 'l'" * ]]; then
263
+ $qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -s $snapshotname $disk $destPath /$destName >& /dev/null
264
+ ret_code=$?
265
+ fi
266
+
267
+ if [ $ret_code -gt 0 ]; then
268
+ printf " Failed to backup $snapshotname for disk $disk to $destPath \n" >&2
269
+ return 2
270
+ fi
237
271
fi
238
272
else
239
273
printf " ***Failed to backup snapshot $snapshotname , undefined type $disk \n" >&2
You can’t perform that action at this time.
0 commit comments