[pve-devel] applied: [PATCH storage] change file_size_info sub to use qemu-img info json decoding

Thomas Lamprecht t.lamprecht at proxmox.com
Fri Sep 20 14:02:50 CEST 2019


On 20.09.19 11:12, Tim Marx wrote:
> Using the json output, as suggested by Thomas, we now die if the decoding
> fails and, if not, all return values are set to the corresponding decoded
> values. That should prevent any unforeseen null size values, except if
> qemu-img info reports it, which we then consider as valid.
> 

applied, but I needed to add the "use JSON" statement, else decode_json wasn't
available. Also did some code refactoring, more indentation and such changes,
not really semantically ones. Thanks!

> Signed-off-by: Tim Marx <t.marx at proxmox.com>
> ---
>  PVE/Storage/Plugin.pm | 43 ++++++++++++++++---------------------------
>  1 file changed, 16 insertions(+), 27 deletions(-)
> 
> diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
> index 39622f3..741e889 100644
> --- a/PVE/Storage/Plugin.pm
> +++ b/PVE/Storage/Plugin.pm
> @@ -712,38 +712,27 @@ sub file_size_info {
>  	return wantarray ? (0, 'subvol', 0, undef) : 1;
>      }
>  
> -    my $format;
> -    my $parent;
> -    my $size = 0;
> -    my $used = 0;
> -
> -    my $parse_qemu_img_info = sub {
> -	my $line = shift;
> -	if ($line =~ m/^file format:\s+(\S+)\s*$/) {
> -	    $format = $1;
> -	} elsif ($line =~ m/^backing file:\s(\S+)\s/) {
> -	    $parent = $1;
> -	} elsif ($line =~ m/^virtual size:\s\S+\s+\((\d+)\s+bytes\)$/) {
> -	    $size = int($1);
> -	} elsif ($line =~ m/^disk size:\s+(\d+(.\d+)?)([KMGT])\s*$/) {
> -	    $used = $1;
> -	    my $u = $3;
> -
> -	    $used *= 1024 if $u eq 'K';
> -	    $used *= (1024*1024) if $u eq 'M';
> -	    $used *= (1024*1024*1024) if $u eq 'G';
> -	    $used *= (1024*1024*1024*1024) if $u eq 'T';
> -
> -	    $used = int($used);
> -	}
> -    };
> +    my $cmd = ['/usr/bin/qemu-img', 'info', '--output=json', $filename];
> +    my $json = '';
>  
> -    my $cmd = ['/usr/bin/qemu-img', 'info', $filename];
>      eval {
> -	run_command($cmd, timeout => $timeout, outfunc => $parse_qemu_img_info );
> +	run_command($cmd, timeout => $timeout, outfunc => sub { $json .= shift },
> +	errfunc => sub {
> +	    my $line = shift;
> +	    warn $line;
> +	});
> +
>      };
> +
>      warn $@ if $@;
>  
> +    my $decoded = decode_json($json);
> +
> +    my $format = $decoded->{format};
> +    my $parent = $decoded->{'backing-filename'};
> +    my $size = $decoded->{'virtual-size'};
> +    my $used = $decoded->{'actual-size'};
> +
>      return wantarray ? ($size, $format, $used, $parent) : $size;
>  }
>  
> 





More information about the pve-devel mailing list