$timeout = 60*60; # 1 hour
} elsif ($cmd->{execute} =~ m/^(eject|change)/) {
$timeout = 60; # note: cdrom mount command is slow
- } elsif ($cmd->{execute} eq 'snapshot-start' ||
- $cmd->{execute} eq 'snapshot-end' ||
+ } elsif ($cmd->{execute} eq 'savevm-start' ||
+ $cmd->{execute} eq 'savevm-end' ||
+ $cmd->{execute} eq 'query-savevm' ||
$cmd->{execute} eq 'delete-drive-snapshot' ||
$cmd->{execute} eq 'snapshot-drive' ) {
$timeout = 10*60; # 10 mins ?
lock_config($vmid, $updatefn);
}
+my $savevm_wait = sub {
+ my ($vmid) = @_;
+
+ for(;;) {
+ my $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "query-savevm");
+ if (!$stat->{status}) {
+ die "savevm not active\n";
+ } elsif ($stat->{status} eq 'active') {
+ sleep(1);
+ next;
+ } elsif ($stat->{status} eq 'completed') {
+ last;
+ } else {
+ die "query-savevm returned status '$stat->{status}'\n";
+ }
+ }
+};
+
sub snapshot_create {
my ($vmid, $snapname, $save_vmstate, $freezefs, $comment) = @_;
if ($running) {
if ($snap->{vmstate}) {
my $path = PVE::Storage::path($storecfg, $snap->{vmstate});
- vm_mon_cmd($vmid, "snapshot-start", statefile => $path);
+ vm_mon_cmd($vmid, "savevm-start", statefile => $path);
+ &$savevm_wait($vmid);
} else {
- vm_mon_cmd($vmid, "snapshot-start");
+ vm_mon_cmd($vmid, "savevm-start");
}
};
eval { gqa_unfreezefs($vmid) if $running && $freezefs; };
warn $@ if $@;
- eval { vm_mon_cmd($vmid, "snapshot-end") if $running; };
+ eval { vm_mon_cmd($vmid, "savevm-end") if $running; };
warn $@ if $@;
if ($err) {