From 20e5d10659fd4fcff06bfcd3ba792d743619525f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Mon, 22 Feb 2016 13:09:00 +0100 Subject: [PATCH] Refactor snapshot_rollback like in QemuServer.pm, but only for rootfs for now --- src/PVE/LXC.pm | 60 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index e34c5b4..177ef53 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -2074,16 +2074,26 @@ sub snapshot_delete { sub snapshot_rollback { my ($vmid, $snapname) = @_; + my $prepare = 1; + my $storecfg = PVE::Storage::config(); my $conf = load_config($vmid); - die "you can't rollback if vm is a template\n" if is_template($conf); + my $get_snapshot_config = sub { - my $snap = $conf->{snapshots}->{$snapname}; + die "you can't rollback if vm is a template\n" if is_template($conf); - die "snapshot '$snapname' does not exist\n" if !defined($snap); + my $res = $conf->{snapshots}->{$snapname}; + die "snapshot '$snapname' does not exist\n" if !defined($res); + + return $res; + }; + + my $snap = &$get_snapshot_config(); + + # only for rootfs for now! my $rootfs = $snap->{rootfs}; my $rootinfo = parse_ct_rootfs($rootfs); my $volid = $rootinfo->{volume}; @@ -2092,42 +2102,50 @@ sub snapshot_rollback { my $updatefn = sub { - die "unable to rollback to incomplete snapshot (snapstate = $snap->{snapstate})\n" - if $snap->{snapstate}; + $conf = load_config($vmid); - check_lock($conf); + $snap = &$get_snapshot_config(); + + die "unable to rollback to incomplete snapshot (snapstate = $snap->{snapstate})\n" + if $snap->{snapstate}; - system("lxc-stop -n $vmid --kill") if check_running($vmid); + if ($prepare) { + check_lock($conf); + system("lxc-stop -n $vmid --kill") if check_running($vmid); + } die "unable to rollback vm $vmid: vm is running\n" if check_running($vmid); - $conf->{lock} = 'rollback'; + if ($prepare) { + $conf->{lock} = 'rollback'; + } else { + die "got wrong lock\n" if !($conf->{lock} && $conf->{lock} eq 'rollback'); + delete $conf->{lock}; + } my $forcemachine; - # copy snapshot config to current config - - my $tmp_conf = $conf; - &$snapshot_copy_config($tmp_conf->{snapshots}->{$snapname}, $conf); - $conf->{snapshots} = $tmp_conf->{snapshots}; - delete $conf->{snaptime}; - delete $conf->{snapname}; - $conf->{parent} = $snapname; + if (!$prepare) { + # copy snapshot config to current config + $conf = &$snapshot_apply_config($conf, $snap); + $conf->{parent} = $snapname; + } write_config($vmid, $conf); - }; - my $unlockfn = sub { - delete $conf->{lock}; - write_config($vmid, $conf); + if (!$prepare && $snap->{vmstate}) { + die "implement me - save vmstate"; + } }; lock_config($vmid, $updatefn); + # only rootfs for now! PVE::Storage::volume_snapshot_rollback($storecfg, $volid, $snapname); - lock_config($vmid, $unlockfn); + $prepare = 0; + lock_config($vmid, $updatefn); } sub template_create { -- 2.39.2