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.l...@proxmox.com> --- PVE/Storage.pm | 15 +++++++++++++++ PVE/Storage/Plugin.pm | 6 ++++++ PVE/Storage/ZFSPlugin.pm | 7 ++----- PVE/Storage/ZFSPoolPlugin.pm | 12 ++++++++++-- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 8711710..7845ad1 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -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) = @_; diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 15c23d4..3eb99f2 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -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) = @_; diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm index 77394b9..6aac58d 100644 --- a/PVE/Storage/ZFSPlugin.pm +++ b/PVE/Storage/ZFSPlugin.pm @@ -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"); diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index 754f29f..2a1cfef 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -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 { -- 1.7.10.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel