From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id D01166757E; Tue, 12 Jan 2021 14:19:42 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BEB7A256FE; Tue, 12 Jan 2021 14:19:12 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id EEB6E256F1; Tue, 12 Jan 2021 14:19:10 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id BE311453BC; Tue, 12 Jan 2021 14:19:10 +0100 (CET) Date: Tue, 12 Jan 2021 14:19:09 +0100 From: Wolfgang Bumiller To: Stefan Reiter Cc: pve-devel@lists.proxmox.com, pbs-devel@lists.proxmox.com Message-ID: <20210112131909.tjsfelgqdtursso4@wobu-vie.proxmox.com> References: <20210111111409.32385-1-s.reiter@proxmox.com> <20210111111409.32385-7-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210111111409.32385-7-s.reiter@proxmox.com> User-Agent: NeoMutt/20180716 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.048 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com, qemuserver.pm] Subject: Re: [pbs-devel] [pve-devel] [PATCH qemu-server 06/11] make qemu_drive_mirror_monitor more generic X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jan 2021 13:19:42 -0000 On Mon, Jan 11, 2021 at 12:14:04PM +0100, Stefan Reiter wrote: > ...so it works with other block jobs as well. Intended use case is > block-stream, which also requires a new "auto" (wait only) completion > mode, since it finishes automatically anyway. > > Signed-off-by: Stefan Reiter > --- > PVE/QemuServer.pm | 41 +++++++++++++++++++++++------------------ > 1 file changed, 23 insertions(+), 18 deletions(-) > > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index bca5669..d517dae 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -6777,15 +6777,16 @@ sub qemu_drive_mirror { > die "mirroring error: $err\n"; > } > > - qemu_drive_mirror_monitor ($vmid, $vmiddst, $jobs, $completion, $qga); > + qemu_drive_job_monitor("mirror", $vmid, $vmiddst, $jobs, $completion, $qga); > } > > # $completion can be either > # 'complete': wait until all jobs are ready, block-job-complete them (default) > # 'cancel': wait until all jobs are ready, block-job-cancel them > # 'skip': wait until all jobs are ready, return with block jobs in ready state > -sub qemu_drive_mirror_monitor { > - my ($vmid, $vmiddst, $jobs, $completion, $qga) = @_; > +# 'auto': wait until all jobs disappear, only use for jobs which complete automatically > +sub qemu_drive_job_monitor { > + my ($op, $vmid, $vmiddst, $jobs, $completion, $qga) = @_; I'd feel *much* safer if $op was added to the end and initialized with $op //= 'mirror'; > > $completion //= 'complete'; > > @@ -6793,46 +6794,50 @@ sub qemu_drive_mirror_monitor { > my $err_complete = 0; > > while (1) { > - die "storage migration timed out\n" if $err_complete > 300; > + die "block job ('$op') timed out\n" if $err_complete > 300; > > my $stats = mon_cmd($vmid, "query-block-jobs"); > > - my $running_mirror_jobs = {}; > + my $running_jobs = {}; > foreach my $stat (@$stats) { > - next if $stat->{type} ne 'mirror'; > - $running_mirror_jobs->{$stat->{device}} = $stat; > + next if $stat->{type} ne $op; > + $running_jobs->{$stat->{device}} = $stat; > } > > my $readycounter = 0; > > foreach my $job (keys %$jobs) { > > - if(defined($jobs->{$job}->{complete}) && !defined($running_mirror_jobs->{$job})) { > - print "$job : finished\n"; > + my $vanished = !defined($running_jobs->{$job}); > + my $complete = defined($jobs->{$job}->{complete}) && $vanished; > + if($complete || ($vanished && $completion eq 'auto')) { > + print "$job: finished\n"; > delete $jobs->{$job}; > next; > } > > - die "$job: mirroring has been cancelled\n" if !defined($running_mirror_jobs->{$job}); > + die "$job: '$op' has been cancelled\n" if !defined($running_jobs->{$job}); > > - my $busy = $running_mirror_jobs->{$job}->{busy}; > - my $ready = $running_mirror_jobs->{$job}->{ready}; > - if (my $total = $running_mirror_jobs->{$job}->{len}) { > - my $transferred = $running_mirror_jobs->{$job}->{offset} || 0; > + my $busy = $running_jobs->{$job}->{busy}; > + my $ready = $running_jobs->{$job}->{ready}; > + if (my $total = $running_jobs->{$job}->{len}) { > + my $transferred = $running_jobs->{$job}->{offset} || 0; > my $remaining = $total - $transferred; > my $percent = sprintf "%.2f", ($transferred * 100 / $total); > > print "$job: transferred: $transferred bytes remaining: $remaining bytes total: $total bytes progression: $percent % busy: $busy ready: $ready \n"; > } > > - $readycounter++ if $running_mirror_jobs->{$job}->{ready}; > + $readycounter++ if $running_jobs->{$job}->{ready}; > } > > last if scalar(keys %$jobs) == 0; > > if ($readycounter == scalar(keys %$jobs)) { > - print "all mirroring jobs are ready \n"; > - last if $completion eq 'skip'; #do the complete later > + print "all '$op' jobs are ready\n"; > + > + # do the complete later (or has already been done) > + last if $completion eq 'skip' || $completion eq 'auto'; > > if ($vmiddst && $vmiddst != $vmid) { > my $agent_running = $qga && qga_check_running($vmid); > @@ -6888,7 +6893,7 @@ sub qemu_drive_mirror_monitor { > > if ($err) { > eval { PVE::QemuServer::qemu_blockjobs_cancel($vmid, $jobs) }; > - die "mirroring error: $err"; > + die "block job ('$op') error: $err"; > } > > } > -- > 2.20.1 > > > > _______________________________________________ > pve-devel mailing list > pve-devel@lists.proxmox.com > https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > >