public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Markus Ebner <info@ebner-markus.de>
To: pve-devel@lists.proxmox.com
Cc: Markus Ebner <info@ebner-markus.de>
Subject: [PATCH qemu-server v3 1/3] agent: file-read: Allow specifying max number of bytes to read
Date: Thu, 26 Feb 2026 13:31:17 +0100	[thread overview]
Message-ID: <20260226123122.60418-2-info@ebner-markus.de> (raw)
In-Reply-To: <20260226123122.60418-1-info@ebner-markus.de>

The previous file-read implementation in the Proxmox API always
attempted to read a fixed 16 MiB. On busy or resource-constrainted
hosts, that often caused request timeouts, with no option to
reduce the number of read bytes to at least read something.

The new parameter count now allows specifying the exact number of
bytes that should be read from the given file. To be backwards
compatible with the previous behavior, it defaults to 16 MiB.
These 16 MiB are further also the maximum allowed value.

Signed-off-by: Markus Ebner <info@ebner-markus.de>
---
 src/PVE/API2/Qemu/Agent.pm | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/PVE/API2/Qemu/Agent.pm b/src/PVE/API2/Qemu/Agent.pm
index de36ce1e..c6155f02 100644
--- a/src/PVE/API2/Qemu/Agent.pm
+++ b/src/PVE/API2/Qemu/Agent.pm
@@ -464,6 +464,14 @@ __PACKAGE__->register_method({
                 'pve-vmid',
                 { completion => \&PVE::QemuServer::complete_vmid_running },
             ),
+            count => {
+                type => 'integer',
+                optional => 1,
+                minimum => 1,
+                maximum => $MAX_READ_SIZE,
+                default => $MAX_READ_SIZE,
+                description => "Number of bytes to read.",
+            },
             file => {
                 type => 'string',
                 description => 'The path to the file',
@@ -481,12 +489,13 @@ __PACKAGE__->register_method({
             truncated => {
                 type => 'boolean',
                 optional => 1,
-                description => "If set to 1, the output is truncated and not complete",
+                description => "If set to 1, the read did not reach the end of the file.",
             },
         },
     },
     code => sub {
         my ($param) = @_;
+        my $count = $param->{count} // $MAX_READ_SIZE;
 
         my $vmid = $param->{vmid};
         my $conf = PVE::QemuConfig->load_config($vmid);
@@ -494,18 +503,20 @@ __PACKAGE__->register_method({
         my $qgafh =
             agent_cmd($vmid, $conf, "file-open", { path => $param->{file} }, "can't open file");
 
-        my $bytes_left = $MAX_READ_SIZE;
+        my $bytes_read = 0;
         my $eof = 0;
         my $read_size = 1024 * 1024;
         my $content = "";
 
-        while ($bytes_left > 0 && !$eof) {
+        while ($bytes_read < $count && !$eof) {
+            my $bytes_left = $count - $bytes_read;
+            my $chunk_size = $bytes_left < $read_size ? $bytes_left : $read_size;
             my $read =
-                mon_cmd($vmid, "guest-file-read", handle => $qgafh, count => int($read_size));
+                mon_cmd($vmid, "guest-file-read", handle => $qgafh, count => int($chunk_size));
             check_agent_error($read, "can't read from file");
 
             $content .= decode_base64($read->{'buf-b64'});
-            $bytes_left -= $read->{count};
+            $bytes_read += $read->{count};
             $eof = $read->{eof} // 0;
         }
 
@@ -514,12 +525,14 @@ __PACKAGE__->register_method({
 
         my $result = {
             content => $content,
-            'bytes-read' => ($MAX_READ_SIZE - $bytes_left),
+            'bytes-read' => $bytes_read,
         };
 
         if (!$eof) {
-            warn
-                "agent file-read: reached maximum read size: $MAX_READ_SIZE bytes. output might be truncated.\n";
+            if (!defined($param->{count})) {
+                warn "agent file-read: reached maximum read size: $MAX_READ_SIZE bytes."
+                    . " output might be truncated.\n";
+            }
             $result->{truncated} = 1;
         }
 
-- 
2.53.0




  reply	other threads:[~2026-02-26 12:32 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-26 12:31 [PATCH qemu-server v3 0/3] Extend qga file-read with chunked access for large files Markus Ebner
2026-02-26 12:31 ` Markus Ebner [this message]
2026-02-26 12:31 ` [PATCH qemu-server v3 2/3] agent: file-read: Allow maintaining base64-encoding of content Markus Ebner
2026-02-26 12:31 ` [PATCH qemu-server v3 3/3] agent: file-read: Allow specifying byte offset to start reading at Markus Ebner
2026-02-26 12:42 ` applied: [PATCH qemu-server v3 0/3] Extend qga file-read with chunked access for large files Fiona Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260226123122.60418-2-info@ebner-markus.de \
    --to=info@ebner-markus.de \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal