From: Fabian Grünbichler Date: Wed, 21 Dec 2016 09:54:18 +0000 (+0100) Subject: refactor delete_snapshot for readability X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=commitdiff_plain;h=e4ae11709910abb5eab43ae6b845a3e197bb62b1 refactor delete_snapshot for readability Signed-off-by: Fabian Grünbichler --- diff --git a/src/PVE/AbstractConfig.pm b/src/PVE/AbstractConfig.pm index 23512d0..7395768 100644 --- a/src/PVE/AbstractConfig.pm +++ b/src/PVE/AbstractConfig.pm @@ -239,7 +239,7 @@ sub __snapshot_create_vol_snapshot { # Remove a drive from the snapshot config. sub __snapshot_delete_remove_drive { - my ($class, $snap, $remove_drive) = @_; + my ($class, $snap, $drive) = @_; die "abstract method - implement me\n"; } @@ -483,54 +483,39 @@ sub snapshot_delete { } }; - my $updatefn = sub { - my ($remove_drive) = @_; + my $remove_drive = sub { + my ($drive) = @_; my $conf = $class->load_config($vmid); + $snap = $conf->{snapshots}->{$snapname}; + die "snapshot '$snapname' does not exist\n" if !defined($snap); - if (!$drivehash) { - die "you can't delete a snapshot if vm is a template\n" - if $class->is_template($conf); - } + $class->__snapshot_delete_remove_drive($snap, $drive); - $snap = $conf->{snapshots}->{$snapname}; + $class->write_config($vmid, $conf); + }; - die "snapshot '$snapname' does not exist\n" if !defined($snap); + #prepare + $class->lock_config($vmid, sub { + my $conf = $class->load_config($vmid); - # remove parent refs - if (!$prepare) { - &$unlink_parent($conf, $snap->{parent}); - foreach my $sn (keys %{$conf->{snapshots}}) { - next if $sn eq $snapname; - &$unlink_parent($conf->{snapshots}->{$sn}, $snap->{parent}); - } - } + die "you can't delete a snapshot if vm is a template\n" + if $class->is_template($conf); - if ($remove_drive) { - $class->__snapshot_delete_remove_drive($snap, $remove_drive); - } + $snap = $conf->{snapshots}->{$snapname}; + die "snapshot '$snapname' does not exist\n" if !defined($snap); - if ($prepare) { - $snap->{snapstate} = 'delete'; - } else { - delete $conf->{snapshots}->{$snapname}; - delete $conf->{lock}; - foreach my $volid (@$unused) { - $class->add_unused_volume($conf, $volid); - } - } + $snap->{snapstate} = 'delete'; $class->write_config($vmid, $conf); - }; - - $class->lock_config($vmid, $updatefn); + }); # now remove vmstate file if ($snap->{vmstate}) { $class->__snapshot_delete_vmstate_file($snap, $force); # save changes (remove vmstate from snapshot) - $class->lock_config($vmid, $updatefn, 'vmstate') if !$force; + $class->lock_config($vmid, $remove_drive, 'vmstate') if !$force; }; # now remove all volume snapshots @@ -546,13 +531,32 @@ sub snapshot_delete { } } - # save changes (remove mp from snapshot) - $class->lock_config($vmid, $updatefn, $vs) if !$force; + # save changes (remove drive from snapshot) + $class->lock_config($vmid, $remove_drive, $vs) if !$force; }); # now cleanup config - $prepare = 0; - $class->lock_config($vmid, $updatefn); + $class->lock_config($vmid, sub { + my $conf = $class->load_config($vmid); + $snap = $conf->{snapshots}->{$snapname}; + die "snapshot '$snapname' does not exist\n" if !defined($snap); + + # remove parent refs + &$unlink_parent($conf, $snap->{parent}); + foreach my $sn (keys %{$conf->{snapshots}}) { + next if $sn eq $snapname; + &$unlink_parent($conf->{snapshots}->{$sn}, $snap->{parent}); + } + + + delete $conf->{snapshots}->{$snapname}; + delete $conf->{lock}; + foreach my $volid (@$unused) { + $class->add_unused_volume($conf, $volid); + } + + $class->write_config($vmid, $conf); + }); } # Rolls back to a given snapshot.