Storage: add method volume_rollback_is_possible
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>
This commit is contained in:
committed by
Dietmar Maurer
parent
a4034b9f19
commit
1597f1f9ad
@ -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 {
|
sub volume_snapshot {
|
||||||
my ($cfg, $volid, $snap, $running) = @_;
|
my ($cfg, $volid, $snap, $running) = @_;
|
||||||
|
|
||||||
|
|||||||
@ -656,6 +656,12 @@ sub volume_snapshot {
|
|||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub volume_rollback_is_possible {
|
||||||
|
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
sub volume_snapshot_rollback {
|
sub volume_snapshot_rollback {
|
||||||
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
||||||
|
|
||||||
|
|||||||
@ -311,10 +311,7 @@ sub volume_snapshot_rollback {
|
|||||||
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
||||||
|
|
||||||
# abort rollback if snapshot is not the latest
|
# abort rollback if snapshot is not the latest
|
||||||
my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname);
|
$class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap);
|
||||||
if ($snap ne $recentsnap) {
|
|
||||||
die "cannot rollback, more recent snapshots exist\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
$class->zfs_delete_lu($scfg, $volname);
|
$class->zfs_delete_lu($scfg, $volname);
|
||||||
|
|
||||||
|
|||||||
@ -412,14 +412,22 @@ sub volume_snapshot_rollback {
|
|||||||
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
my ($class, $scfg, $storeid, $volname, $snap) = @_;
|
||||||
|
|
||||||
# abort rollback if snapshot is not the latest
|
# abort rollback if snapshot is not the latest
|
||||||
my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname);
|
$class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap);
|
||||||
if ($snap ne $recentsnap) {
|
|
||||||
die "cannot rollback, more recent snapshots exist\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$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 "can't rollback, more recent snapshots exist\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
sub activate_storage {
|
sub activate_storage {
|
||||||
my ($class, $storeid, $scfg, $cache) = @_;
|
my ($class, $storeid, $scfg, $cache) = @_;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user