[pve-devel] [PATCH] Storage: add methode

Wolfgang Link w.link at proxmox.com
Wed Feb 11 13:33:15 CET 2015


add methode volume_rollback_is_possibel and refactor
Improve error handling
If snapshot is not revetable 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 at proxmox.com>
---
 PVE/Storage.pm               |   19 +++++++++++++++----
 PVE/Storage/Plugin.pm        |    6 ++++++
 PVE/Storage/ZFSPlugin.pm     |    6 ------
 PVE/Storage/ZFSPoolPlugin.pm |   11 ++++++++---
 4 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 8711710..c4b9a68 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -144,6 +144,21 @@ sub volume_resize {
     }
 }
 
+sub volume_rollback_is_possibel {
+    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_possibe($scfg, $storeid, $volname, $snap);
+     } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
+        die "snapshot rollback device is not possible";
+    } else {
+        die "can't snapshot";
+    }
+}
+
 sub volume_snapshot {
     my ($cfg, $volid, $snap, $running) = @_;
 
@@ -167,10 +182,6 @@ sub volume_snapshot_rollback {
         my $scfg = storage_config($cfg, $storeid);
         my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
         return $plugin->volume_snapshot_rollback($scfg, $storeid, $volname, $snap);
-    } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
-        die "snapshot rollback device is not possible";
-    } else {
-        die "can't snapshot";
     }
 }
 
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index 15c23d4..4549f9f 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -656,6 +656,12 @@ sub volume_snapshot {
     return undef;
 }
 
+sub volume_rollback_is_possibe {
+    my ($class, $scfg, $storeid, $volname, $snap) = @_; 
+
+    return 1; 
+}
+
 sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
index 77394b9..f020985 100644
--- a/PVE/Storage/ZFSPlugin.pm
+++ b/PVE/Storage/ZFSPlugin.pm
@@ -310,12 +310,6 @@ sub volume_resize {
 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->zfs_delete_lu($scfg, $volname);
 
     $class->zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm
index 754f29f..0d38012 100644
--- a/PVE/Storage/ZFSPoolPlugin.pm
+++ b/PVE/Storage/ZFSPoolPlugin.pm
@@ -411,13 +411,18 @@ sub volume_snapshot_delete {
 sub volume_snapshot_rollback {
     my ($class, $scfg, $storeid, $volname, $snap) = @_;
 
-    # abort rollback if snapshot is not the latest
+    zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+}
+
+sub volume_rollback_is_possibe {
+    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 "cannot rollback, more recent snapshots exist\n";
     }
 
-    zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+    return 1; 
 }
 
 sub activate_storage {
-- 
1.7.10.4





More information about the pve-devel mailing list