]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/VZDump/QemuServer.pm
partially fix #3056: try to cancel backup without uuid
[qemu-server.git] / PVE / VZDump / QemuServer.pm
index e9619602a63be2488953302d546ec614725e2727..8792e766f27b3c1573edd90245ce83aabf57aa4d 100644 (file)
@@ -337,14 +337,17 @@ my $query_backup_status_loop = sub {
     my $target = 0;
     my $last_reused = 0;
     my $has_query_bitmap = $qemu_support && $qemu_support->{'query-bitmap-info'};
+    my $is_template = PVE::QemuConfig->is_template($self->{vmlist}->{$vmid});
     if ($has_query_bitmap) {
        my $total = 0;
        my $bitmap_info = mon_cmd($vmid, 'query-pbs-bitmap-info');
-       foreach my $info (sort { $a->{drive} cmp $b->{drive} } @$bitmap_info) {
-           my $text = $bitmap_action_to_human->($self, $info);
-           my $drive = $info->{drive};
-           $drive =~ s/^drive-//; # for consistency
-           $self->loginfo("$drive: dirty-bitmap status: $text");
+       for my $info (sort { $a->{drive} cmp $b->{drive} } @$bitmap_info) {
+           if (!$is_template) {
+               my $text = $bitmap_action_to_human->($self, $info);
+               my $drive = $info->{drive};
+               $drive =~ s/^drive-//; # for consistency
+               $self->loginfo("$drive: dirty-bitmap status: $text");
+           }
            $target += $info->{dirty};
            $total += $info->{size};
            $last_reused += $info->{size} - $info->{dirty};
@@ -357,6 +360,7 @@ my $query_backup_status_loop = sub {
     }
 
     my $first_round = 1;
+    my $last_finishing = 0;
     while(1) {
        my $status = mon_cmd($vmid, 'query-backup');
 
@@ -398,7 +402,9 @@ my $query_backup_status_loop = sub {
 
        my $res = $status->{status} || 'unknown';
        if ($res ne 'active') {
-           $self->loginfo($statusline);
+           if ($last_percent < 100) {
+               $self->loginfo($statusline);
+           }
            if ($res ne 'done') {
                die (($status->{errmsg} || "unknown error") . "\n") if $res eq 'error';
                die "got unexpected status '$res'\n";
@@ -418,6 +424,11 @@ my $query_backup_status_loop = sub {
            $last_transferred = $transferred if $transferred;
            $last_time = $ctime;
            $last_reused = $reused;
+
+           if (!$last_finishing && $status->{finishing}) {
+               $self->loginfo("Waiting for server to finish backup validation...");
+           }
+           $last_finishing = $status->{finishing};
        }
        sleep(1);
        $first_round = 0 if $first_round;
@@ -472,20 +483,11 @@ sub archive_pbs {
     my $keyfile = PVE::Storage::PBSPlugin::pbs_encryption_key_file_name($scfg, $opts->{storage});
 
     my $diskcount = scalar(@{$task->{disks}});
-    if (PVE::QemuConfig->is_template($self->{vmlist}->{$vmid}) || !$diskcount) {
+    # proxmox-backup-client can only handle raw files and block devs
+    # only use it (directly) for disk-less VMs
+    if (!$diskcount) {
        my @pathlist;
-       # FIXME: accumulate disk sizes to use for backup job (email) log
-       foreach my $di (@{$task->{disks}}) {
-           if ($di->{type} eq 'block' || $di->{type} eq 'file') {
-               push @pathlist, "$di->{qmdevice}.img:$di->{path}";
-           } else {
-               die "implement me (type $di->{type})";
-           }
-       }
-
-       if (!$diskcount) {
-           $self->loginfo("backup contains no disks");
-       }
+       $self->loginfo("backup contains no disks");
 
        local $ENV{PBS_PASSWORD} = $password;
        local $ENV{PBS_FINGERPRINT} = $fingerprint if defined($fingerprint);
@@ -500,7 +502,6 @@ sub archive_pbs {
 
        push @$cmd, "qemu-server.conf:$conffile";
        push @$cmd, "fw.conf:$firewall" if -e $firewall;
-       push @$cmd, @pathlist if scalar(@pathlist);
 
        $self->loginfo("starting template backup");
        $self->loginfo(join(' ', @$cmd));
@@ -549,8 +550,9 @@ sub archive_pbs {
            $params->{encrypt} = JSON::false;
        }
 
+       my $is_template = PVE::QemuConfig->is_template($self->{vmlist}->{$vmid});
        $params->{'use-dirty-bitmap'} = JSON::true
-           if $qemu_support->{'pbs-dirty-bitmap'} && $self->{vm_was_running};
+           if $qemu_support->{'pbs-dirty-bitmap'} && $self->{vm_was_running} && !$is_template;
 
        $params->{timeout} = 60; # give some time to connect to the backup server
 
@@ -575,7 +577,7 @@ sub archive_pbs {
     my $err = $@;
     if ($err) {
        $self->logerr($err);
-       $self->mon_backup_cancel($vmid) if defined($backup_job_uuid);
+       $self->mon_backup_cancel($vmid);
     }
     $self->restore_vm_power_state($vmid);
 
@@ -752,7 +754,7 @@ sub archive_vma {
     my $err = $@;
     if ($err) {
        $self->logerr($err);
-       $self->mon_backup_cancel($vmid) if defined($backup_job_uuid);
+       $self->mon_backup_cancel($vmid);
     }
 
     $self->restore_vm_power_state($vmid);
@@ -831,6 +833,7 @@ sub enforce_vm_running_for_backup {
        # start with skiplock
        my $params = {
            skiplock => 1,
+           skiptemplate => 1,
            paused => 1,
        };
        PVE::QemuServer::vm_start($self->{storecfg}, $vmid, $params);