On slow storages there is a chance the 10 second timeout is triggered
when resizing a volume. If the timeout fires while the resize is in a
certain state near the end, the operation can still complete
successfully even though a timeout error is thrown. In that case the
config is never updated and keeps the old, wrong size.

Because the config is out of sync, the volume is then displayed with
the wrong size in the web interface.

Link: https://bugzilla.proxmox.com/show_bug.cgi?id=7598
Signed-off-by: Jakob Klocker <[email protected]>
---
 src/PVE/Storage/Common.pm | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/PVE/Storage/Common.pm b/src/PVE/Storage/Common.pm
index 3932aee..ee2ea00 100644
--- a/src/PVE/Storage/Common.pm
+++ b/src/PVE/Storage/Common.pm
@@ -277,7 +277,17 @@ sub qemu_img_resize {
     push $cmd->@*, '-f', $format, $path, $size;
 
     $timeout = 10 if !$timeout;
-    run_command($cmd, timeout => $timeout);
+    eval { run_command($cmd, timeout => $timeout); };
+    if (my $err = $@) {
+
+        die $err if $err !~ /got timeout/;
+
+        my $info = JSON::decode_json(qemu_img_info($path, $format));
+        die $err if !$info;
+
+        my $actual_size = $info->{'virtual-size'};
+        die $err if !defined($actual_size) || $actual_size < $size;
+    }
 }
 
 1;
-- 
2.47.3



Reply via email to