From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 1AC191FF15F for ; Mon, 26 Aug 2024 13:00:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id B2EFD10D1E; Mon, 26 Aug 2024 13:00:43 +0200 (CEST) To: pve-devel@lists.proxmox.com Date: Mon, 26 Aug 2024 13:00:22 +0200 In-Reply-To: <20240826110030.1744732-1-alexandre.derumier@groupe-cyllene.com> References: <20240826110030.1744732-1-alexandre.derumier@groupe-cyllene.com> MIME-Version: 1.0 Message-ID: List-Id: Proxmox VE development discussion List-Post: From: Alexandre Derumier via pve-devel Precedence: list Cc: Alexandre Derumier X-Mailman-Version: 2.1.29 X-BeenThere: pve-devel@lists.proxmox.com List-Subscribe: , List-Unsubscribe: , List-Archive: Reply-To: Proxmox VE development discussion List-Help: Subject: [pve-devel] [PATCH qemu-server 2/6] qm cli: add blockextend Content-Type: multipart/mixed; boundary="===============5613774508116790389==" Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" --===============5613774508116790389== Content-Type: message/rfc822 Content-Disposition: inline Return-Path: X-Original-To: pve-devel@lists.proxmox.com Delivered-To: pve-devel@lists.proxmox.com 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 307B8C68AE for ; Mon, 26 Aug 2024 13:00:42 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BF4A010CC3 for ; Mon, 26 Aug 2024 13:00:41 +0200 (CEST) Received: from bastiontest.odiso.net (unknown [IPv6:2a0a:1580:2000:6700::14]) (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 for ; Mon, 26 Aug 2024 13:00:40 +0200 (CEST) Received: from formationkvm1.odiso.net (unknown [10.11.201.57]) by bastiontest.odiso.net (Postfix) with ESMTP id 371738267D4; Mon, 26 Aug 2024 13:00:33 +0200 (CEST) Received: by formationkvm1.odiso.net (Postfix, from userid 0) id 05D6D102037B; Mon, 26 Aug 2024 13:00:32 +0200 (CEST) From: Alexandre Derumier To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server 2/6] qm cli: add blockextend Date: Mon, 26 Aug 2024 13:00:22 +0200 Message-Id: <20240826110030.1744732-5-alexandre.derumier@groupe-cyllene.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240826110030.1744732-1-alexandre.derumier@groupe-cyllene.com> References: <20240826110030.1744732-1-alexandre.derumier@groupe-cyllene.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.006 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_NONE 0.1 DMARC none policy HEADER_FROM_DIFFERENT_DOMAINS 0.249 From and EnvelopeFrom 2nd level mail domains are different KAM_DMARC_NONE 0.25 DKIM has Failed or SPF has failed on the message and the domain has no DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record T_SCC_BODY_TEXT_LINE -0.01 - Increase the underlay storage size to an higher value than current max offset or 1 chunk bigger we max write offset is 0 Signed-off-by: Alexandre Derumier --- PVE/CLI/qm.pm | 31 ++++++++++++++++++++++++++++ PVE/QemuServer.pm | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm index d3dbf7b..1410ad5 100755 --- a/PVE/CLI/qm.pm +++ b/PVE/CLI/qm.pm @@ -608,6 +608,36 @@ __PACKAGE__->register_method ({ return; }}); +__PACKAGE__->register_method({ + name => 'blockextend', + path => 'blockextend', + method => 'POST', + protected => 1, + description => "Extend underlay storage to higher value than write threshold.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + vmid => get_standard_option('pve-vmid', { + completion => \&PVE::QemuServer::complete_vmid_running }), + disk => { + type => 'string', + description => 'underlay blocknodeid or drive', + }, + }, + }, + returns => { type => 'null', }, + code => sub { + my ($param) = @_; + + my $vmid = PVE::Tools::extract_param($param, 'vmid'); + my $disk = PVE::Tools::extract_param($param, 'disk'); + PVE::QemuServer::block_extend($vmid, $disk); + + return; + } +}); + __PACKAGE__->register_method ({ name => 'terminal', path => 'terminal', @@ -1171,6 +1201,7 @@ our $cmddef = { rescan => [ __PACKAGE__, 'rescan', []], resize => [ "PVE::API2::Qemu", 'resize_vm', ['vmid', 'disk', 'size'], { %node } ], unlink => [ "PVE::API2::Qemu", 'unlink', ['vmid'], { %node } ], + blockextend => [ __PACKAGE__, 'blockextend', ['vmid', 'disk'], { %node }], }, monitor => [ __PACKAGE__, 'monitor', ['vmid']], diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 3acb32e..fb67ac9 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -8926,4 +8926,56 @@ sub set_disks_write_threshold { }); } +sub lock_blockextend { + my ($vmid, $timeout, $sub) = @_; + + my $filename = "/var/lock/qemu-server/blockextend-$vmid.lck"; + + my $res = PVE::Tools::lock_file($filename, $timeout, $sub); + die $@ if $@; + + return $res; +} + +sub block_extend { + my ($vmid, $disk) = @_; + + return if !PVE::QemuServer::check_running($vmid); + + my $storecfg = PVE::Storage::config(); + + my $blockstats = mon_cmd($vmid, "query-blockstats"); + $blockstats = { map { $_->{device} => $_ } $blockstats->@* }; + + lock_blockextend($vmid, 60, sub { + + # return if we do not have the config anymore + return if !-f PVE::QemuConfig->config_file($vmid); + + my $conf = PVE::QemuConfig->load_config($vmid); + + my $blockinfo = get_block_info($vmid, $disk, $blockstats); + my $deviceid = $blockinfo->{deviceid}; + my $drive = PVE::QemuServer::parse_drive($deviceid, $conf->{$deviceid}); + my $volid = $drive->{file}; + + die "can't find volid" if !$volid; + my ($sid, $volname) = PVE::Storage::parse_volume_id($volid, 1); + die "can't find sid" if !$sid; + my $scfg = PVE::Storage::storage_config($storecfg, $sid); + + my $size = PVE::Storage::volume_size_info($storecfg, $volid, 5); + my $chunksize = $scfg->{chunksize} // 1024 * 1024 * 1024; + my $newsize = $size + $chunksize; + + #if write are really fast, wr_highest_offset could be already higher than the increment + if ($blockinfo->{wr_highest_offset} > $newsize) { + $newsize = $blockinfo->{wr_highest_offset} + $chunksize; + } + + PVE::Storage::volume_underlay_resize($storecfg, $volid, $newsize); + my $threshold = compute_write_threshold($newsize); + qemu_block_set_write_threshold($vmid, $blockinfo->{blocknodeid}, $threshold); + }); +} 1; -- 2.39.2 --===============5613774508116790389== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel --===============5613774508116790389==--