]> git.proxmox.com Git - pve-storage.git/commitdiff
Storage: add method volume_rollback_is_possible
authorWolfgang Link <w.link@proxmox.com>
Thu, 12 Feb 2015 07:41:35 +0000 (08:41 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 12 Feb 2015 08:15:02 +0000 (09:15 +0100)
add method volume_rollback_is_possible and redactor
Improve error handling
If snapshot is not reversible catch it before vm will lock and shutdown.
This is the case if zfs has an younger snapshot.

Signed-off-by: Wolfgang Link <w.link@proxmox.com>
PVE/Storage.pm
PVE/Storage/Plugin.pm
PVE/Storage/ZFSPlugin.pm
PVE/Storage/ZFSPoolPlugin.pm

index 87117109b15e6a58d22c1d6754405defbd3b2648..7845ad174bde6b416e834c3085378a51c3bf5c41 100755 (executable)
@@ -144,6 +144,21 @@ sub volume_resize {
     }
 }
 
+sub volume_rollback_is_possible {
+    my ($cfg, $volid, $snap) = @_;
+    
+    my ($storeid, $volname) = parse_volume_id($volid, 1);
+    if ($storeid) {
+        my $scfg = storage_config($cfg, $storeid);
+        my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+        return $plugin->volume_rollback_is_possible($scfg, $storeid, $volname, $snap);
+    } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
+        die "snapshot rollback device $volid is not possible";
+    } else {
+        die "can't parse volume id";
+    }
+}
+
 sub volume_snapshot {
     my ($cfg, $volid, $snap, $running) = @_;
 
index 15c23d4fe17c880c74ae07b503550dc9b084704f..3eb99f2b454c2b2cb0885c1985dc831b8c401079 100644 (file)
@@ -656,6 +656,12 @@ sub volume_snapshot {
     return undef;
 }
 
+sub volume_rollback_is_possible {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_; 
+
+    return 1; 
+}
+
 sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
index 77394b98be47155f447d96220b349706d1dba03b..6aac58d5aad8618841260cb588c86b9e637adb20 100644 (file)
@@ -311,11 +311,8 @@ sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
     # abort rollback if snapshot is not the latest
-    my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname);
-    if ($snap ne $recentsnap) {
-        die "cannot rollback, more recent snapshots exist\n";
-    }
-
+    $class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap);
+    
     $class->zfs_delete_lu($scfg, $volname);
 
     $class->zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
index 754f29f9eedfe8b55d17b6238abebd9cc5087e65..2a1cfef7dd94188912fd6dbe88ff7d564835b7ab 100644 (file)
@@ -412,12 +412,20 @@ sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
     # abort rollback if snapshot is not the latest
+    $class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap);
+
+    zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+}
+
+sub volume_rollback_is_possible {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_; 
+    
     my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname);
     if ($snap ne $recentsnap) {
-        die "cannot rollback, more recent snapshots exist\n";
+       die "can't rollback, more recent snapshots exist\n";
     }
 
-    zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+    return 1; 
 }
 
 sub activate_storage {