[pve-devel] [RFC_V2 pve-storage 1/8] Include new storage function volume_send.

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Apr 20 14:47:33 CEST 2017


On Wed, Apr 19, 2017 at 11:52:02AM +0200, Wolfgang Link wrote:
> If the storage backend support import and export
> we can send the contend to a remote host.
> ---
>  PVE/Storage.pm               | 18 ++++++++++++++++
>  PVE/Storage/Plugin.pm        |  8 ++++++++
>  PVE/Storage/ZFSPlugin.pm     |  7 +++++++
>  PVE/Storage/ZFSPoolPlugin.pm | 49 ++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 82 insertions(+)
> 
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index 50c2f3f..4794818 100755
> --- a/PVE/Storage.pm
> +++ b/PVE/Storage.pm
> @@ -216,6 +216,24 @@ sub volume_snapshot {
>      }
>  }
>  
> +sub volume_send {
> +    my ($cfg, $volid, $snap, $ip, $incremental_snap, $verbose, $limit,
> +	$target_path) = @_;
> +
> +    my ($storeid, $volname) = parse_volume_id($volid, 1);
> +    if ($storeid) {
> +	my $scfg = storage_config($cfg, $storeid);
> +	my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> +	return $plugin->volume_send($scfg, $storeid, $volname, $ip, $snap,
> +				    $incremental_snap, $verbose, $limit, $target_path);
> +
> +    } elsif ($volid =~ m|^(/.+)$| && -e $volid) {
> +	die "send file/device '$volid' is not possible\n";
> +    } else {
> +	die "unable to parse volume ID '$volid'\n";
> +    }
> +}
> +
>  sub volume_snapshot_rollback {
>      my ($cfg, $volid, $snap) = @_;
>  
> diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
> index 31b8541..d0df1f9 100644
> --- a/PVE/Storage/Plugin.pm
> +++ b/PVE/Storage/Plugin.pm
> @@ -697,6 +697,14 @@ sub volume_snapshot {
>      return undef;
>  }
>  
> +sub volume_send {
> +    my ($class, $scfg, $storeid, $volname, $ip, $snap,
> +	$incremental_snap, $verbose, $limit, $target_path) = @_;
> +
> +    # implement in subclass
> +    die "Volume_send is not implemented for $class";
> +}
> +
>  sub volume_rollback_is_possible {
>      my ($class, $scfg, $storeid, $volname, $snap) = @_; 
>  
> diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm
> index 9072205..9007193 100644
> --- a/PVE/Storage/ZFSPlugin.pm
> +++ b/PVE/Storage/ZFSPlugin.pm
> @@ -336,6 +336,13 @@ sub volume_snapshot_rollback {
>      $class->zfs_add_lun_mapping_entry($scfg, $volname);
>  }
>  
> +sub volume_send {
> +    my ($class, $scfg, $storeid, $volname, $ip, $snap,
> +	$incremental_snap, $verbose, $limit, $target_path) = @_;
> +
> +    die "Volume_send is not implemented for ZFS over iSCSI.\n";
> +}
> +
>  sub volume_has_feature {
>      my ($class, $scfg, $feature, $storeid, $volname, $snapname, $running) = @_;
>  
> diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm
> index ca0a2cf..a7ba03b 100644
> --- a/PVE/Storage/ZFSPoolPlugin.pm
> +++ b/PVE/Storage/ZFSPoolPlugin.pm
> @@ -465,6 +465,55 @@ sub volume_snapshot {
>      $class->zfs_request($scfg, undef, 'snapshot', "$scfg->{pool}/$vname\@$snap");
>  }
>  
> +sub volume_send {
> +    my ($class, $scfg, $storeid, $volname, $ip, $snap,
> +	$incremental_snap, $verbose, $limit, $target_path) = @_;
> +
> +    my ($vtype, $name, $vmid) = $class->parse_volname($volname);
> +
> +    my $zpath = "$scfg->{pool}/$name";
> +
> +    die "$vtype is not allowed in ZFSPool!" if ($vtype ne "images");
> +
> +    my $cmdsend = [];
> +    my $cmdlimit = [];
> +
> +    push @$cmdsend, 'zfs', 'send', '-R';
> +    push @$cmdsend, '-v' if defined($verbose);
> +
> +    #undefined or 0 no snapshot exists

The comment is wrong, shouldn't be 0 anymore?
(Otherwise the code is code is wrong and shouldn't call defined())

> +    if( defined($incremental_snap)) {
> +	push @$cmdsend, '-I', "$zpath\@${incremental_snap}";
> +    }
> +
> +    push @$cmdsend, '--', "$zpath\@${snap}";
> +
> +    # limit in kByte/s
> +    if ($limit){
> +	my $bwl = $limit * 1024;
> +	push @$cmdlimit, 'cstream', '-t', $bwl;
> +    }
> +
> +    my $cmdrecv = [];
> +
> +    push @$cmdrecv, 'ssh', '-o', 'BatchMode=yes', "root\@${ip}", '--' if $ip;
> +    push @$cmdrecv, 'zfs', 'recv', '-F', '--';
> +
> +    $zpath = $target_path if defined($target_path);
> +    push @$cmdrecv, $zpath;
> +
> +
> +    if ($limit) {
> +	eval { run_command([$cmdsend, $cmdlimit, $cmdrecv]) };
> +    } else {
> +	eval { run_command([$cmdsend, $cmdrecv]) };
> +    }
> +
> +    if (my $err = $@) {
> +	die $err;
> +    }
> +}
> +
>  sub volume_snapshot_delete {
>      my ($class, $scfg, $storeid, $volname, $snap, $running) = @_;
>  
> -- 
> 2.1.4
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel




More information about the pve-devel mailing list