From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id A546A1FF0E2 for ; Thu, 30 Jul 2026 15:18:42 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 706CE215D7; Thu, 30 Jul 2026 15:17:54 +0200 (CEST) From: Fiona Ebner To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server 7/8] block job: monitor: pass options as a hash Date: Thu, 30 Jul 2026 15:15:56 +0200 Message-ID: <20260730131613.157722-8-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260730131613.157722-1-f.ebner@proxmox.com> References: <20260730131613.157722-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1785417458480 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.846 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) KAM_MAILER 2 Automated Mailer Tag Left in Email RCVD_IN_DNSWL_LOW -0.7 Sender listed at https://www.dnswl.org/, low trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 6MYBGYPEYP3FCLV2L3ODBR7KGDAZPJTP X-Message-ID-Hash: 6MYBGYPEYP3FCLV2L3ODBR7KGDAZPJTP X-MailFrom: f.ebner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: No functional change intended. While the value of $completion is optional, all callers pass it as a parameter and most do pass a value. Don't include it in the options hash. Signed-off-by: Fiona Ebner --- src/PVE/QemuMigrate.pm | 10 ++-------- src/PVE/QemuServer.pm | 14 +++++++------- src/PVE/QemuServer/BlockJob.pm | 22 +++++++++++----------- src/PVE/QemuServer/VolumeChain.pm | 4 ++-- src/test/MigrationTest/QemuMigrateMock.pm | 2 +- 5 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/PVE/QemuMigrate.pm b/src/PVE/QemuMigrate.pm index 604eae82..dcf26a1c 100644 --- a/src/PVE/QemuMigrate.pm +++ b/src/PVE/QemuMigrate.pm @@ -1580,14 +1580,8 @@ sub phase2 { # to avoid it trying to re-establish it. We are in blockjob ready state, # thus, this command changes to it to blockjob complete (see qapi docs) eval { - PVE::QemuServer::BlockJob::monitor( - vm_qmp_peer($vmid), - undef, - $self->{storage_migration_jobs}, - 'cancel', - undef, - 'mirror', - ); + my $jobs = $self->{storage_migration_jobs}; + PVE::QemuServer::BlockJob::monitor(vm_qmp_peer($vmid), $jobs, 'cancel', 'mirror'); }; if (my $err = $@) { die "Failed to complete storage migration: $err\n"; diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index 1be89be9..aad0e323 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -7367,9 +7367,7 @@ sub pbs_live_restore { } mon_cmd($vmid, 'cont'); - PVE::QemuServer::BlockJob::monitor( - vm_qmp_peer($vmid), undef, $jobs, 'auto', 0, 'stream', - ); + PVE::QemuServer::BlockJob::monitor(vm_qmp_peer($vmid), $jobs, 'auto', 'stream'); print "restore-drive jobs finished successfully, removing all tracking block devices" . " to disconnect from Proxmox Backup Server\n"; @@ -7489,9 +7487,7 @@ sub live_import_from_files { } mon_cmd($vmid, 'cont'); - PVE::QemuServer::BlockJob::monitor( - vm_qmp_peer($vmid), undef, $jobs, 'auto', 0, 'stream', - ); + PVE::QemuServer::BlockJob::monitor(vm_qmp_peer($vmid), $jobs, 'auto', 'stream'); print "restore-drive jobs finished successfully, removing all tracking block devices\n"; @@ -8010,7 +8006,11 @@ sub clone_disk { # previous drive-mirrors if (($completion && $completion eq 'complete') && (scalar(keys %$jobs) > 0)) { PVE::QemuServer::BlockJob::monitor( - vm_qmp_peer($vmid), $newvmid, $jobs, $completion, $qga, 'mirror', + vm_qmp_peer($vmid), + $jobs, + $completion, + 'mirror', + { 'dest-vmid' => $newvmid, qga => $qga }, ); } goto no_data_clone; diff --git a/src/PVE/QemuServer/BlockJob.pm b/src/PVE/QemuServer/BlockJob.pm index d4998370..5fbc311e 100644 --- a/src/PVE/QemuServer/BlockJob.pm +++ b/src/PVE/QemuServer/BlockJob.pm @@ -114,7 +114,9 @@ my sub print_job_status { # '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 monitor { - my ($qmp_peer, $vmiddst, $jobs, $completion, $qga, $operation) = @_; + my ($qmp_peer, $jobs, $completion, $operation, $options) = @_; + + my $vmiddst = $options->{'dest-vmid'}; die "drive mirror: different destination is only supported when peer is main QEMU instance\n" if $vmiddst && $qmp_peer->{type} ne 'qmp'; @@ -182,7 +184,7 @@ sub monitor { if ($qmp_peer->{type} eq 'qmp' && $vmiddst && $vmiddst != $qmp_peer->{id}) { my $vmid = $qmp_peer->{id}; my $should_fsfreeze = - PVE::QemuServer::Agent::guest_fs_freeze_applicable($qga, $vmid); + PVE::QemuServer::Agent::guest_fs_freeze_applicable($options->{qga}, $vmid); if ($should_fsfreeze) { print "issuing guest agent 'guest-fsfreeze-freeze' command\n"; eval { PVE::QemuServer::Agent::guest_fs_freeze($vmid); }; @@ -340,7 +342,8 @@ sub qemu_drive_mirror { die "mirroring error: $err\n"; } - monitor(vm_qmp_peer($vmid), $vmiddst, $jobs, $completion, $qga, 'mirror'); + my $monitor_options = { 'dest-vmid' => $vmiddst, qga => $qga }; + monitor(vm_qmp_peer($vmid), $jobs, $completion, 'mirror', $monitor_options); } # Callers should version guard this (only available with a binary >= QEMU 8.2) @@ -537,14 +540,11 @@ sub blockdev_mirror { log_warn("unable to delete blockdev '$target_node_name' - $@"); die "error starting blockdev mirrror - $err"; } - monitor( - vm_qmp_peer($vmid), - $dest->{vmid}, - $jobs, - $completion, - $options->{'guest-agent'}, - 'mirror', - ); + my $monitor_options = { + 'dest-vmid' => $dest->{vmid}, + qga => $options->{'guest-agent'}, + }; + monitor(vm_qmp_peer($vmid), $jobs, $completion, 'mirror', $monitor_options); } sub mirror { diff --git a/src/PVE/QemuServer/VolumeChain.pm b/src/PVE/QemuServer/VolumeChain.pm index 1572450b..a67ec247 100644 --- a/src/PVE/QemuServer/VolumeChain.pm +++ b/src/PVE/QemuServer/VolumeChain.pm @@ -255,7 +255,7 @@ sub blockdev_commit { # 'block-commit' will complete automatically. my $complete = $src_snap && $src_snap ne 'current' ? 'auto' : 'complete'; - PVE::QemuServer::BlockJob::monitor($qmp_peer, undef, $jobs, $complete, 0, 'commit'); + PVE::QemuServer::BlockJob::monitor($qmp_peer, $jobs, $complete, 'commit'); blockdev_delete( $storecfg, $qmp_peer, $drive, $src_file_blockdev, $src_fmt_blockdev, $src_snap, @@ -337,7 +337,7 @@ sub blockdev_stream { qmp_cmd($qmp_peer, 'block-stream', %$options); $jobs->{$job_id} = {}; - PVE::QemuServer::BlockJob::monitor($qmp_peer, undef, $jobs, 'auto', 0, 'stream'); + PVE::QemuServer::BlockJob::monitor($qmp_peer, $jobs, 'auto', 'stream'); blockdev_delete( $storecfg, $qmp_peer, $drive, $snap_file_blockdev, $snap_fmt_blockdev, $snap, diff --git a/src/test/MigrationTest/QemuMigrateMock.pm b/src/test/MigrationTest/QemuMigrateMock.pm index 3a483817..079d1a0f 100644 --- a/src/test/MigrationTest/QemuMigrateMock.pm +++ b/src/test/MigrationTest/QemuMigrateMock.pm @@ -173,7 +173,7 @@ $qemu_server_blockjob_module->mock( common_mirror_mock($source->{vmid}, $drive_id); }, monitor => sub { - my ($qmp_peer, $vmiddst, $jobs, $completion, $qga, $op) = @_; + my ($qmp_peer, $jobs, $completion, $operation, $options) = @_; if ( $fail_config->{block_job_monitor} -- 2.47.3