On October 8, 2019 11:25 am, Alwin Antreich wrote:
> On Tue, Oct 08, 2019 at 08:36:57AM +0200, Fabian Grünbichler wrote:
>> On October 7, 2019 2:41 pm, Alwin Antreich wrote:
>> > Machine states that were created on snapshots with memory could not be
>> > restored on rollback. The state volume was not activated so KVM couldn't
>> > load the state.
>> > 
>> > This patch moves the path generation into vm_start and de-/activates the
>> > state volume.
>> 
>> alternatively, the following could also work and re-use more code so 
>> that we don't miss the next special handling of some corner case. 
>> rolling back from a snapshot with state is just like resuming, but we 
>> want to keep the statefile instead of deleting it.
> I will send another version with your alternative.
> 
>> 
>> (untested):
>> 
>> diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
>> index edbf1a7..b70c276 100644
>> --- a/PVE/QemuConfig.pm
>> +++ b/PVE/QemuConfig.pm
>> @@ -358,9 +358,7 @@ sub __snapshot_rollback_vm_stop {
>>  sub __snapshot_rollback_vm_start {
>>      my ($class, $vmid, $vmstate, $data) = @_;
>>  
>> -    my $storecfg = PVE::Storage::config();
>> -    my $statefile = PVE::Storage::path($storecfg, $vmstate);
>> -    PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, undef, undef, 
>> undef, $data->{forcemachine});
>> +    PVE::QemuServer::vm_start($storecfg, $vmid, $vmstate, undef, undef, 
>> undef, $data->{forcemachine});
>>  }
>>  
>>  sub __snapshot_rollback_get_unused {
>> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index 8376260..f2d19e1 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -5418,6 +5418,11 @@ sub vm_start {
>>          print "Resuming suspended VM\n";
>>      }
>>  
>> +    if ($statefile && $statefile ne 'tcp' && $statefile ne 'unix') {
>> +        # re-use resume code
>> +        $conf->{vmstate} = $statefile;
>> +    }
>> +
>>      my ($cmd, $vollist, $spice_port) = config_to_command($storecfg, $vmid, 
>> $conf, $defaults, $forcemachine);
>>  
>>      my $migrate_port = 0;
>> @@ -5465,8 +5470,6 @@ sub vm_start {
>>              push @$cmd, '-incoming', $migrate_uri;
>>              push @$cmd, '-S';
>>  
>> -        } else {
>> -            push @$cmd, '-loadstate', $statefile;
>>          }
>>      } elsif ($paused) {
>>          push @$cmd, '-S';
>> @@ -5616,11 +5619,16 @@ sub vm_start {
>>                  property => "guest-stats-polling-interval",
>>                  value => 2) if (!defined($conf->{balloon}) || 
>> $conf->{balloon});
>>  
>> -    if ($is_suspended && (my $vmstate = $conf->{vmstate})) {
>> -        print "Resumed VM, removing state\n";
>> -        delete $conf->@{qw(lock vmstate runningmachine)};
>> +    if (my $vmstate = $conf->{vmstate}) {
>>          PVE::Storage::deactivate_volumes($storecfg, [$vmstate]);
>> -        PVE::Storage::vdisk_free($storecfg, $vmstate);
>> +        delete $conf->{vmstate};
>> +
>> +        if ($is_suspended) {
>> +            print "Resumed VM, removing state\n";
>> +            delete $conf->@{qw(lock runningmachine)};
>> +            PVE::Storage::vdisk_free($storecfg, $vmstate);
>> +        }
>> +
>>          PVE::QemuConfig->write_config($vmid, $conf);
>>      }
>>  
>> 
>> > 
>> > Signed-off-by: Alwin Antreich <a.antre...@proxmox.com>
>> > ---
>> >  PVE/QemuConfig.pm |  3 +--
>> >  PVE/QemuServer.pm | 10 +++++++++-
>> >  2 files changed, 10 insertions(+), 3 deletions(-)
>> > 
>> > diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
>> > index edbf1a7..e9796a3 100644
>> > --- a/PVE/QemuConfig.pm
>> > +++ b/PVE/QemuConfig.pm
>> > @@ -359,8 +359,7 @@ sub __snapshot_rollback_vm_start {
>> >      my ($class, $vmid, $vmstate, $data) = @_;
>> >  
>> >      my $storecfg = PVE::Storage::config();
>> > -    my $statefile = PVE::Storage::path($storecfg, $vmstate);
>> > -    PVE::QemuServer::vm_start($storecfg, $vmid, $statefile, undef, undef, 
>> > undef, $data->{forcemachine});
>> > +    PVE::QemuServer::vm_start($storecfg, $vmid, $vmstate, undef, undef, 
>> > undef, $data->{forcemachine});
>> >  }
>> >  
>> >  sub __snapshot_rollback_get_unused {
>> > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> > index 8376260..39315b3 100644
>> > --- a/PVE/QemuServer.pm
>> > +++ b/PVE/QemuServer.pm
>> > @@ -5420,6 +5420,7 @@ sub vm_start {
>> >  
>> >    my ($cmd, $vollist, $spice_port) = config_to_command($storecfg, $vmid, 
>> > $conf, $defaults, $forcemachine);
>> >  
>> > +
>> >    my $migrate_port = 0;
>> >    my $migrate_uri;
>> >    if ($statefile) {
>> > @@ -5466,7 +5467,12 @@ sub vm_start {
>> >            push @$cmd, '-S';
>> >  
>> >        } else {
>> > -          push @$cmd, '-loadstate', $statefile;
>> > +          my $sfile = $statefile;
>> > +          if (!-e $statefile) {
>> > +              PVE::Storage::activate_volumes($storecfg, [$statefile]);
>> > +              $sfile = PVE::Storage::path($storecfg, $statefile);
>> > +          }
>> 
>> why only activate if the file does not exist? $statefile should be a 
>> full volume ID including storage at this point, it does not make sense 
>> to check for existence?
> You can pass a stateuri on vm start (qm start <ID> --stateuri) and this
> can be a file path. I added the if to not break this.

true, I missed that (we use it for migration, but only with 'tcp' / 
'unix' as values). but in this case, we need to actually check whether 
it is an absolute path, or a PVE-managed volume. in the latter case, we 
can just push it to $vollist to get activation/deactivation handled like 
the other volumes?

> 
>> 
>> > +          push @$cmd, '-loadstate', $sfile;
>> >        }
>> >    } elsif ($paused) {
>> >        push @$cmd, '-S';
>> > @@ -5622,6 +5628,8 @@ sub vm_start {
>> >        PVE::Storage::deactivate_volumes($storecfg, [$vmstate]);
>> >        PVE::Storage::vdisk_free($storecfg, $vmstate);
>> >        PVE::QemuConfig->write_config($vmid, $conf);
>> > +  } elsif ($statefile && (!-e $statefile)) {
>> > +      PVE::Storage::deactivate_volumes($storecfg, [$statefile]);
>> 
>> this check looks wrong? we should always deactivate, no need to check 
>> whether it does not exist? (and like above, it always does not exist 
>> AFAICT?)
> True, besides that stateuri. :/
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel@pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to