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 F40A169C34; Wed, 3 Mar 2021 10:57:58 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 64F42347B1; Wed, 3 Mar 2021 10:57:28 +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)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 9D8CE346F2; Wed, 3 Mar 2021 10:57:24 +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 38E444584C; Wed, 3 Mar 2021 10:57:24 +0100 (CET) From: Stefan Reiter To: pve-devel@lists.proxmox.com, pbs-devel@lists.proxmox.com Date: Wed, 3 Mar 2021 10:56:07 +0100 Message-Id: <20210303095612.7475-7-s.reiter@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210303095612.7475-1-s.reiter@proxmox.com> References: <20210303095612.7475-1-s.reiter@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.025 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. [qemuserver.pm] Subject: [pve-devel] [PATCH v2 qemu-server 06/11] make qemu_drive_mirror_monitor more generic X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Mar 2021 09:57:59 -0000 ...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 --- v2: * don't rename function, only add $op to the end and default to "mirror" PVE/QemuServer.pm | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index a498444..0c39a6b 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -6792,55 +6792,61 @@ sub qemu_drive_mirror { # '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 +# 'auto': wait until all jobs disappear, only use for jobs which complete automatically sub qemu_drive_mirror_monitor { - my ($vmid, $vmiddst, $jobs, $completion, $qga) = @_; + my ($vmid, $vmiddst, $jobs, $completion, $qga, $op) = @_; $completion //= 'complete'; + $op //= "mirror"; eval { 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); @@ -6896,7 +6902,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