all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code
@ 2021-02-04 12:52 Stefan Reiter
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress Stefan Reiter
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Stefan Reiter @ 2021-02-04 12:52 UTC (permalink / raw)
  To: pve-devel

CLIFormatter, though maybe not perfectly named, already has functions
doing the same task - use those.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---

Wanted to move these to a shared location to use in the next patch, found that
we already had functions doing pretty much the same stuff...

 PVE/VZDump/QemuServer.pm | 64 ++++++++--------------------------------
 1 file changed, 13 insertions(+), 51 deletions(-)

diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
index b5e74d3..a34bdf5 100644
--- a/PVE/VZDump/QemuServer.pm
+++ b/PVE/VZDump/QemuServer.pm
@@ -21,6 +21,7 @@ use PVE::Storage::PBSPlugin;
 use PVE::Storage;
 use PVE::Tools;
 use PVE::VZDump;
+use PVE::CLIFormatter qw(render_duration render_bytes);
 
 use PVE::QemuConfig;
 use PVE::QemuServer;
@@ -262,45 +263,6 @@ sub archive {
     }
 }
 
-# number, [precision=1]
-my $num2str = sub {
-    return sprintf( "%." . ( $_[1] || 1 ) . "f", $_[0] );
-};
-my sub bytes_to_human {
-    my ($bytes, $precission) = @_;
-
-    return $num2str->($bytes, $precission) . ' B' if $bytes < 1024;
-    my $kb = $bytes/1024;
-
-    return $num2str->($kb, $precission) . " KiB" if $kb < 1024;
-    my $mb = $kb/1024;
-
-    return $num2str->($mb, $precission) . " MiB" if $mb < 1024;
-    my $gb = $mb/1024;
-
-    return $num2str->($gb, $precission) . " GiB" if $gb < 1024;
-    my $tb = $gb/1024;
-
-    return $num2str->($tb, $precission) . " TiB";
-}
-my sub duration_to_human {
-    my ($seconds) = @_;
-
-    return sprintf('%2ds', $seconds) if $seconds < 60;
-    my $minutes = $seconds / 60;
-    $seconds = $seconds % 60;
-
-    return sprintf('%2dm %2ds', $minutes, $seconds) if $minutes < 60;
-    my $hours = $minutes / 60;
-    $minutes = $minutes % 60;
-
-    return sprintf('%2dh %2dm %2ds', $hours, $minutes, $seconds) if $hours < 24;
-    my $days = $hours / 24;
-    $hours = $hours % 24;
-
-    return sprintf('%2dd %2dh %2dm', $days, $hours, $minutes);
-}
-
 my $bitmap_action_to_human = sub {
     my ($self, $info) = @_;
 
@@ -316,8 +278,8 @@ my $bitmap_action_to_human = sub {
 	if ($info->{dirty} == 0) {
 	    return "OK (drive clean)";
 	} else {
-	    my $size = bytes_to_human($info->{size});
-	    my $dirty = bytes_to_human($info->{dirty});
+	    my $size = render_bytes($info->{size});
+	    my $dirty = render_bytes($info->{dirty});
 	    return "OK ($dirty of $size dirty)";
 	}
     } elsif ($action eq "invalid") {
@@ -339,7 +301,7 @@ my $query_backup_status_loop = sub {
 	my ($mb, $delta) = @_;
 	return "0 B/s" if $mb <= 0;
 	my $bw = int(($mb / $delta));
-	return bytes_to_human($bw) . "/s";
+	return render_bytes($bw) . "/s";
     };
 
     my $target = 0;
@@ -361,8 +323,8 @@ my $query_backup_status_loop = sub {
 	    $last_reused += $info->{size} - $info->{dirty};
 	}
 	if ($target < $total) {
-	    my $total_h = bytes_to_human($total);
-	    my $target_h = bytes_to_human($target);
+	    my $total_h = render_bytes($total);
+	    my $target_h = render_bytes($target);
 	    $self->loginfo("using fast incremental mode (dirty-bitmap), $target_h dirty of $total_h total");
 	}
     }
@@ -397,16 +359,16 @@ my $query_backup_status_loop = sub {
 	my $timediff = ($ctime - $last_time) || 1; # fixme
 	my $mbps_read = $get_mbps->($rbytes, $timediff);
 	my $mbps_write = $get_mbps->($wbytes, $timediff);
-	my $target_h = bytes_to_human($target);
-	my $transferred_h = bytes_to_human($transferred);
+	my $target_h = render_bytes($target);
+	my $transferred_h = render_bytes($transferred);
 
 	if (!$has_query_bitmap && $first_round && $target != $total) { # FIXME: remove with PVE 7.0
-	    my $total_h = bytes_to_human($total);
+	    my $total_h = render_bytes($total);
 	    $self->loginfo("using fast incremental mode (dirty-bitmap), $target_h dirty of $total_h total");
 	}
 
 	my $statusline = sprintf("%3d%% ($transferred_h of $target_h) in %s"
-	    .", read: $mbps_read, write: $mbps_write", $percent, duration_to_human($duration));
+	    .", read: $mbps_read, write: $mbps_write", $percent, render_duration($duration));
 
 	my $res = $status->{status} || 'unknown';
 	if ($res ne 'active') {
@@ -446,16 +408,16 @@ my $query_backup_status_loop = sub {
 
     if ($last_zero) {
 	my $zero_per = $last_target ? int(($last_zero * 100)/$last_target) : 0;
-	my $zero_h = bytes_to_human($last_zero, 2);
+	my $zero_h = render_bytes($last_zero);
 	$self->loginfo("backup is sparse: $zero_h (${zero_per}%) total zero data");
     }
     if ($reused) {
-	my $reused_h = bytes_to_human($reused, 2);
+	my $reused_h = render_bytes($reused);
 	my $reuse_per = int($reused * 100 / $last_total);
 	$self->loginfo("backup was done incrementally, reused $reused_h (${reuse_per}%)");
     }
     if ($transferred) {
-	my $transferred_h = bytes_to_human($transferred, 2);
+	my $transferred_h = render_bytes($transferred);
 	if ($duration) {
 	    my $mbps = $get_mbps->($transferred, $duration);
 	    $self->loginfo("transferred $transferred_h in $duration seconds ($mbps)");
-- 
2.20.1





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress
  2021-02-04 12:52 [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Stefan Reiter
@ 2021-02-04 12:52 ` Stefan Reiter
  2021-02-05 13:21   ` Thomas Lamprecht
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 3/4] savevm: show information about drives during snapshot Stefan Reiter
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Stefan Reiter @ 2021-02-04 12:52 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---
 PVE/QemuConfig.pm | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index 3f4605f..37db347 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -14,6 +14,7 @@ use PVE::QemuServer;
 use PVE::QemuServer::Machine;
 use PVE::Storage;
 use PVE::Tools;
+use PVE::CLIFormatter;
 
 use base qw(PVE::AbstractConfig);
 
@@ -280,14 +281,26 @@ sub __snapshot_create_vol_snapshots_hook {
 		PVE::Storage::activate_volumes($storecfg, [$snap->{vmstate}]);
 
 		mon_cmd($vmid, "savevm-start", statefile => $path);
+		print "saving VM state and RAM\n";
+		my $start = time();
+		my $state = sub {
+		    my ($bytes) = @_;
+		    my $b = PVE::CLIFormatter::render_bytes($bytes);
+		    my $t = PVE::CLIFormatter::render_duration(time() - $start);
+		    return "$b in $t";
+		};
 		for(;;) {
 		    my $stat = mon_cmd($vmid, "query-savevm");
 		    if (!$stat->{status}) {
 			die "savevm not active\n";
 		    } elsif ($stat->{status} eq 'active') {
 			sleep(1);
+			my $s = $state->($stat->{bytes});
+			print "progress: $s\n";
 			next;
 		    } elsif ($stat->{status} eq 'completed') {
+			my $s = $state->($stat->{bytes});
+			print "saved $s\n";
 			last;
 		    } else {
 			die "query-savevm returned status '$stat->{status}'\n";
-- 
2.20.1





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH qemu-server 3/4] savevm: show information about drives during snapshot
  2021-02-04 12:52 [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Stefan Reiter
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress Stefan Reiter
@ 2021-02-04 12:52 ` Stefan Reiter
  2021-02-04 13:51   ` [pve-devel] [PATCH v2 " Stefan Reiter
  2021-02-04 12:52 ` [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log Stefan Reiter
  2021-02-05 13:05 ` [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Thomas Lamprecht
  3 siblings, 1 reply; 8+ messages in thread
From: Stefan Reiter @ 2021-02-04 12:52 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---

I personally like this as well since it shows the order of operations, but might
be too verbose...

 PVE/QemuConfig.pm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index 37db347..ae5f561 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -340,6 +340,8 @@ sub __snapshot_create_vol_snapshot {
     my $device = "drive-$ds";
     my $storecfg = PVE::Storage::config();
 
+    print "snapshotting '$drive' ($drive->{file})\n";
+
     PVE::QemuServer::qemu_volume_snapshot($vmid, $device, $storecfg, $volid, $snapname);
 }
 
-- 
2.20.1





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log
  2021-02-04 12:52 [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Stefan Reiter
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress Stefan Reiter
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 3/4] savevm: show information about drives during snapshot Stefan Reiter
@ 2021-02-04 12:52 ` Stefan Reiter
  2021-02-05  8:42   ` Fabian Ebner
  2021-02-05 13:05 ` [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Thomas Lamprecht
  3 siblings, 1 reply; 8+ messages in thread
From: Stefan Reiter @ 2021-02-04 12:52 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---
 www/manager6/window/Snapshot.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/www/manager6/window/Snapshot.js b/www/manager6/window/Snapshot.js
index 2fa97041..a5fddd0f 100644
--- a/www/manager6/window/Snapshot.js
+++ b/www/manager6/window/Snapshot.js
@@ -139,7 +139,8 @@ Ext.define('PVE.window.Snapshot', {
 	if (me.isCreate) {
 	    subject = (me.type === 'qemu' ? 'VM' : 'CT') + me.vmid + ' ' + gettext('Snapshot');
 	    me.method = 'POST';
-	    me.showProgress = true;
+	    me.showProgress = !me.running;
+	    me.showTaskViewer = me.running;
 	} else {
 	    subject = `${gettext('Snapshot')} ${me.snapname}`;
 	    me.url += `/${me.snapname}/config`;
-- 
2.20.1





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v2 qemu-server 3/4] savevm: show information about drives during snapshot
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 3/4] savevm: show information about drives during snapshot Stefan Reiter
@ 2021-02-04 13:51   ` Stefan Reiter
  0 siblings, 0 replies; 8+ messages in thread
From: Stefan Reiter @ 2021-02-04 13:51 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---

v2:
* use $device of course, really shouldn't do last-minute formatting without
  testing

 PVE/QemuConfig.pm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index 37db347..ae5f561 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -340,6 +340,8 @@ sub __snapshot_create_vol_snapshot {
     my $device = "drive-$ds";
     my $storecfg = PVE::Storage::config();
 
+    print "snapshotting '$device' ($drive->{file})\n";
+
     PVE::QemuServer::qemu_volume_snapshot($vmid, $device, $storecfg, $volid, $snapname);
 }
 
-- 
2.20.1





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log
  2021-02-04 12:52 ` [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log Stefan Reiter
@ 2021-02-05  8:42   ` Fabian Ebner
  0 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2021-02-05  8:42 UTC (permalink / raw)
  To: pve-devel, s.reiter

Am 04.02.21 um 13:52 schrieb Stefan Reiter:
> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
> ---
>   www/manager6/window/Snapshot.js | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/www/manager6/window/Snapshot.js b/www/manager6/window/Snapshot.js
> index 2fa97041..a5fddd0f 100644
> --- a/www/manager6/window/Snapshot.js
> +++ b/www/manager6/window/Snapshot.js
> @@ -139,7 +139,8 @@ Ext.define('PVE.window.Snapshot', {
>   	if (me.isCreate) {
>   	    subject = (me.type === 'qemu' ? 'VM' : 'CT') + me.vmid + ' ' + gettext('Snapshot');
>   	    me.method = 'POST';
> -	    me.showProgress = true;
> +	    me.showProgress = !me.running;
> +	    me.showTaskViewer = me.running;

Nit: Should this be based on the 'vmstate' parameter instead? The task 
log for a running VM without including the state contains the same lines 
as for a shut down VM (those about the drives), so it feels a little 
inconsistent to show it in one situation, but not in the other.

>   	} else {
>   	    subject = `${gettext('Snapshot')} ${me.snapname}`;
>   	    me.url += `/${me.snapname}/config`;
> 




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code
  2021-02-04 12:52 [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Stefan Reiter
                   ` (2 preceding siblings ...)
  2021-02-04 12:52 ` [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log Stefan Reiter
@ 2021-02-05 13:05 ` Thomas Lamprecht
  3 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2021-02-05 13:05 UTC (permalink / raw)
  To: Proxmox VE development discussion, Stefan Reiter

On 04.02.21 13:52, Stefan Reiter wrote:
> CLIFormatter, though maybe not perfectly named, already has functions
> doing the same task - use those.
> 
> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
> ---
> 
> Wanted to move these to a shared location to use in the next patch, found that
> we already had functions doing pretty much the same stuff...
> 

NAK, the result needs to be a 1:1 CC of the current rendering which we spent
some time fine-tuning.

render_bytes misses a precision parameter for that and hard codes it to 2.

Adding that and moving those two plus the render_timestamp* helpers to a
separate module in common (e.g., PVE::Format ?), only having POSIX strftime
as single usage would be OK for me.

>  PVE/VZDump/QemuServer.pm | 64 ++++++++--------------------------------
>  1 file changed, 13 insertions(+), 51 deletions(-)
> 
> diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm
> index b5e74d3..a34bdf5 100644
> --- a/PVE/VZDump/QemuServer.pm
> +++ b/PVE/VZDump/QemuServer.pm
> @@ -21,6 +21,7 @@ use PVE::Storage::PBSPlugin;
>  use PVE::Storage;
>  use PVE::Tools;
>  use PVE::VZDump;
> +use PVE::CLIFormatter qw(render_duration render_bytes);
>  
>  use PVE::QemuConfig;
>  use PVE::QemuServer;
> @@ -262,45 +263,6 @@ sub archive {
>      }
>  }
>  
> -# number, [precision=1]
> -my $num2str = sub {
> -    return sprintf( "%." . ( $_[1] || 1 ) . "f", $_[0] );
> -};
> -my sub bytes_to_human {
> -    my ($bytes, $precission) = @_;
> -
> -    return $num2str->($bytes, $precission) . ' B' if $bytes < 1024;
> -    my $kb = $bytes/1024;
> -
> -    return $num2str->($kb, $precission) . " KiB" if $kb < 1024;
> -    my $mb = $kb/1024;
> -
> -    return $num2str->($mb, $precission) . " MiB" if $mb < 1024;
> -    my $gb = $mb/1024;
> -
> -    return $num2str->($gb, $precission) . " GiB" if $gb < 1024;
> -    my $tb = $gb/1024;
> -
> -    return $num2str->($tb, $precission) . " TiB";
> -}
> -my sub duration_to_human {
> -    my ($seconds) = @_;
> -
> -    return sprintf('%2ds', $seconds) if $seconds < 60;
> -    my $minutes = $seconds / 60;
> -    $seconds = $seconds % 60;
> -
> -    return sprintf('%2dm %2ds', $minutes, $seconds) if $minutes < 60;
> -    my $hours = $minutes / 60;
> -    $minutes = $minutes % 60;
> -
> -    return sprintf('%2dh %2dm %2ds', $hours, $minutes, $seconds) if $hours < 24;
> -    my $days = $hours / 24;
> -    $hours = $hours % 24;
> -
> -    return sprintf('%2dd %2dh %2dm', $days, $hours, $minutes);
> -}
> -
>  my $bitmap_action_to_human = sub {
>      my ($self, $info) = @_;
>  
> @@ -316,8 +278,8 @@ my $bitmap_action_to_human = sub {
>  	if ($info->{dirty} == 0) {
>  	    return "OK (drive clean)";
>  	} else {
> -	    my $size = bytes_to_human($info->{size});
> -	    my $dirty = bytes_to_human($info->{dirty});
> +	    my $size = render_bytes($info->{size});
> +	    my $dirty = render_bytes($info->{dirty});
>  	    return "OK ($dirty of $size dirty)";
>  	}
>      } elsif ($action eq "invalid") {
> @@ -339,7 +301,7 @@ my $query_backup_status_loop = sub {
>  	my ($mb, $delta) = @_;
>  	return "0 B/s" if $mb <= 0;
>  	my $bw = int(($mb / $delta));
> -	return bytes_to_human($bw) . "/s";
> +	return render_bytes($bw) . "/s";
>      };
>  
>      my $target = 0;
> @@ -361,8 +323,8 @@ my $query_backup_status_loop = sub {
>  	    $last_reused += $info->{size} - $info->{dirty};
>  	}
>  	if ($target < $total) {
> -	    my $total_h = bytes_to_human($total);
> -	    my $target_h = bytes_to_human($target);
> +	    my $total_h = render_bytes($total);
> +	    my $target_h = render_bytes($target);
>  	    $self->loginfo("using fast incremental mode (dirty-bitmap), $target_h dirty of $total_h total");
>  	}
>      }
> @@ -397,16 +359,16 @@ my $query_backup_status_loop = sub {
>  	my $timediff = ($ctime - $last_time) || 1; # fixme
>  	my $mbps_read = $get_mbps->($rbytes, $timediff);
>  	my $mbps_write = $get_mbps->($wbytes, $timediff);
> -	my $target_h = bytes_to_human($target);
> -	my $transferred_h = bytes_to_human($transferred);
> +	my $target_h = render_bytes($target);
> +	my $transferred_h = render_bytes($transferred);
>  
>  	if (!$has_query_bitmap && $first_round && $target != $total) { # FIXME: remove with PVE 7.0
> -	    my $total_h = bytes_to_human($total);
> +	    my $total_h = render_bytes($total);
>  	    $self->loginfo("using fast incremental mode (dirty-bitmap), $target_h dirty of $total_h total");
>  	}
>  
>  	my $statusline = sprintf("%3d%% ($transferred_h of $target_h) in %s"
> -	    .", read: $mbps_read, write: $mbps_write", $percent, duration_to_human($duration));
> +	    .", read: $mbps_read, write: $mbps_write", $percent, render_duration($duration));
>  
>  	my $res = $status->{status} || 'unknown';
>  	if ($res ne 'active') {
> @@ -446,16 +408,16 @@ my $query_backup_status_loop = sub {
>  
>      if ($last_zero) {
>  	my $zero_per = $last_target ? int(($last_zero * 100)/$last_target) : 0;
> -	my $zero_h = bytes_to_human($last_zero, 2);
> +	my $zero_h = render_bytes($last_zero);
>  	$self->loginfo("backup is sparse: $zero_h (${zero_per}%) total zero data");
>      }
>      if ($reused) {
> -	my $reused_h = bytes_to_human($reused, 2);
> +	my $reused_h = render_bytes($reused);
>  	my $reuse_per = int($reused * 100 / $last_total);
>  	$self->loginfo("backup was done incrementally, reused $reused_h (${reuse_per}%)");
>      }
>      if ($transferred) {
> -	my $transferred_h = bytes_to_human($transferred, 2);
> +	my $transferred_h = render_bytes($transferred);
>  	if ($duration) {
>  	    my $mbps = $get_mbps->($transferred, $duration);
>  	    $self->loginfo("transferred $transferred_h in $duration seconds ($mbps)");
> 





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress
  2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress Stefan Reiter
@ 2021-02-05 13:21   ` Thomas Lamprecht
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2021-02-05 13:21 UTC (permalink / raw)
  To: Proxmox VE development discussion, Stefan Reiter

much thanks in general for following up on my request, this irked
me since almost ever.

a few nits inline.

On 04.02.21 13:52, Stefan Reiter wrote:
> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
> ---
>  PVE/QemuConfig.pm | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
> 
> diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
> index 3f4605f..37db347 100644
> --- a/PVE/QemuConfig.pm
> +++ b/PVE/QemuConfig.pm
> @@ -14,6 +14,7 @@ use PVE::QemuServer;
>  use PVE::QemuServer::Machine;
>  use PVE::Storage;
>  use PVE::Tools;
> +use PVE::CLIFormatter;
>  
>  use base qw(PVE::AbstractConfig);
>  
> @@ -280,14 +281,26 @@ sub __snapshot_create_vol_snapshots_hook {
>  		PVE::Storage::activate_volumes($storecfg, [$snap->{vmstate}]);
>  
>  		mon_cmd($vmid, "savevm-start", statefile => $path);
> +		print "saving VM state and RAM\n";
> +		my $start = time();

The SaveVMInfo struct returned by 'query-savevm' would have a 'total-time' field,
why not use that?

> +		my $state = sub {

over general helper name

> +		    my ($bytes) = @_;
> +		    my $b = PVE::CLIFormatter::render_bytes($bytes);
> +		    my $t = PVE::CLIFormatter::render_duration(time() - $start);
> +		    return "$b in $t";

could return a ($b, $t) tuple here, just an idea, this is totally fine to
with the current usage.

> +		};
>  		for(;;) {
>  		    my $stat = mon_cmd($vmid, "query-savevm");
>  		    if (!$stat->{status}) {
>  			die "savevm not active\n";
>  		    } elsif ($stat->{status} eq 'active') {
>  			sleep(1);
> +			my $s = $state->($stat->{bytes});
> +			print "progress: $s\n";

I'd drop the "progress", IMO just noise.

>  			next;
>  		    } elsif ($stat->{status} eq 'completed') {
> +			my $s = $state->($stat->{bytes});


> +			print "saved $s\n";

I'd explicitly out put that we're done:

"completed, saved $s\n";

>  			last;
>  		    } else {
>  			die "query-savevm returned status '$stat->{status}'\n";
> 





^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-02-05 13:21 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-04 12:52 [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Stefan Reiter
2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 2/4] savevm: periodically print progress Stefan Reiter
2021-02-05 13:21   ` Thomas Lamprecht
2021-02-04 12:52 ` [pve-devel] [PATCH qemu-server 3/4] savevm: show information about drives during snapshot Stefan Reiter
2021-02-04 13:51   ` [pve-devel] [PATCH v2 " Stefan Reiter
2021-02-04 12:52 ` [pve-devel] [PATCH manager 4/4] ui: snapshot: show task viewer for progress log Stefan Reiter
2021-02-05  8:42   ` Fabian Ebner
2021-02-05 13:05 ` [pve-devel] [PATCH qemu-server 1/4] vzdump: use renderers from Tools instead of duplicating code Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal