[pve-devel] [PATCH container] Fix #2124: restore: support external de-compressor
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon Jun 17 10:03:24 CEST 2019
On 6/14/19 3:37 PM, Alwin Antreich wrote:
> This patch adds support to restore archives that have been compressed
> with a compressor not natively supported by tar. This had to be added
> for zstd support.
yeah, tha's nice, but that's "what" not how/why...
I.e., no words about that the zstd support should come through
"decompressor_info". And why you do it now half/half adding effectively
two places the CT de-compressor info is hard coded? I don't want that
just complicates things, so either we have it here alone or there, but
not semi-mixed.
Why not just use decompressor_info alone? And the _info from that
method is misleading IMO, as it's currently it better should be called
_cmd, or (maybe better) have a return signature like:
return wantarray ? $cmd : ($cmd, $format, $comp);
>
> Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
> ---
> src/PVE/LXC/Create.pm | 31 +++++++++++++++++++++----------
> 1 file changed, 21 insertions(+), 10 deletions(-)
>
> diff --git a/src/PVE/LXC/Create.pm b/src/PVE/LXC/Create.pm
> index 029c940..a7aec9a 100644
> --- a/src/PVE/LXC/Create.pm
> +++ b/src/PVE/LXC/Create.pm
> @@ -71,21 +71,28 @@ sub restore_archive {
> my $archive_fh;
> my $tar_input = '<&STDIN';
> my @compression_opt;
> + my $decomp;
s/decomp/decompressor/
> if ($archive ne '-') {
> # GNU tar refuses to autodetect this... *sigh*
> my %compression_map = (
> - '.gz' => '-z',
> - '.bz2' => '-j',
> - '.xz' => '-J',
> - '.lzo' => '--lzop',
> + 'gz' => '-z',
> + 'bz2' => '-j',
> + 'xz' => '-J',
> + 'lzo' => '--lzop',
> );
> - if ($archive =~ /\.tar(\.[^.]+)?$/) {
> - if (defined($1)) {
> - die "unrecognized compression format: $1\n" if !defined($compression_map{$1});
> - @compression_opt = $compression_map{$1};
> +
> + $archive =~ /\.(tar)\.?([^.]+)?$/;
> + my $format = $1;
> + my $comp = $2;
my ($format, $compressor) = ($1, $2);
> +
> + if (defined($comp)) {
> + if (defined($compression_map{$comp})) {
> + @compression_opt = $compression_map{$comp};
> + } else {
> + $decomp = PVE::Storage::decompressor_info(undef, $comp);
> }
> } else {
> - die "file does not look like a template archive: $archive\n";
> + die "file does not look like a template archive: $archive\n" if ($format ne 'tar');
what? why is $format even introduced here? It has nothing to do
with zstd support?
Also _if_ we would something like this then please no post-if here,
if one would do this then by changing the else to an elsif, but as the
regex is fixed to tar anyway it makes no sense in this patch?
> }
> sysopen($archive_fh, $archive, O_RDONLY)
> or die "failed to open '$archive': $!\n";
> @@ -106,8 +113,12 @@ sub restore_archive {
> push @$cmd, '--anchored';
> push @$cmd, '--exclude' , './dev/*';
>
> + $cmd = [$decomp, $cmd] if defined($decomp);
> +
> if (defined($bwlimit)) {
> - $cmd = [ ['cstream', '-t', $bwlimit*1024], $cmd ];
> + my $cstream = ['cstream', '-t', $bwlimit*1024];
> + # unpack if $decomp, otherwise to many array levels
> + $cmd = defined($decomp) ? [ $cstream, @$cmd ] : [ $cstream, $cmd ];
just unshift $cstream into @$cmd? e.g.:
unsift @$cmd, [ 'cstream', '-t', $bwlimit*1024 ];
should work. And please keep spaces at start and end of such command array reference
declarations. /Most/ of the time it makes them easier to read.
> }
>
> if ($archive eq '-') {
>
More information about the pve-devel
mailing list