[pve-devel] [PATCH storage] migrate: snapshot parameter for use with replication

Dietmar Maurer dietmar at proxmox.com
Mon May 22 12:47:58 CEST 2017


Can we use get_ssh_info() here?

> On May 22, 2017 at 10:16 AM Wolfgang Bumiller <w.bumiller at proxmox.com> wrote:
> 
> 
> ---
>  PVE/Storage.pm | 31 ++++++++++++++++++++++---------
>  1 file changed, 22 insertions(+), 9 deletions(-)
> 
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index 5819bde..73f2976 100755
> --- a/PVE/Storage.pm
> +++ b/PVE/Storage.pm
> @@ -525,7 +525,7 @@ sub abs_filesystem_path {
>  }
>  
>  sub storage_migrate {
> -    my ($cfg, $volid, $target_host, $target_storeid, $target_volname,
> $base_snapshot) = @_;
> +    my ($cfg, $volid, $target_host, $target_storeid, $target_volname,
> $base_snapshot, $snapshot) = @_;
>  
>      my ($storeid, $volname) = parse_volume_id($volid);
>      $target_volname = $volname if !$target_volname;
> @@ -551,10 +551,17 @@ sub storage_migrate {
>  	die "incremental migration not supported on storage type $type\n"
>  	    if defined($base_snapshot);
>      };
> +    my $no_snapshot = sub {
> +	my ($type) = @_;
> +	# $snapshot is currently only used by replication
> +	die "replicating storage migration not supported on storage type $type\n"
> +	    if defined($snapshot);
> +    };
>  
>      # only implemented for file system based storage
>      if ($scfg->{path}) {
>  	$no_incremental->($scfg->{type});
> +	$no_snapshot->($scfg->{type});
>  
>  	if ($tcfg->{path}) {
>  	    my $src_plugin = PVE::Storage::Plugin->lookup($scfg->{type});
> @@ -622,16 +629,19 @@ sub storage_migrate {
>  	    die "$errstr - pool on target does not have the same name as on source!"
>  		if $tcfg->{pool} ne $scfg->{pool};
>  
> +	    my $snapname = $snapshot // '__migration__';
> +
>  	    my (undef, $volname) = parse_volname($cfg, $volid);
>  	    my $zfspath = "$scfg->{pool}\/$volname";
>  
> -	    my @formats = volume_transfer_formats($cfg, $volid, $volid,
> '__migration__', $base_snapshot, 1);
> +	    my @formats = volume_transfer_formats($cfg, $volid, $volid, $snapname,
> $base_snapshot, 1);
>  	    die "cannot migrate from storage type '$scfg->{type}' to
> '$tcfg->{type}'\n" if !@formats;
>  	    my $format = $formats[0];
>  
> -	    my $send = ['pvesm', 'export', $volid, $format, '-', '-snapshot',
> '__migration__', '-with-snapshots', '1'];
> +	    my $send = ['pvesm', 'export', $volid, $format, '-', '-snapshot',
> $snapname, '-with-snapshots', '1'];
>  	    my $recv = ['ssh', "root\@$target_host", '--', 'pvesm', 'import',
> $volid, $format, '-', '-with-snapshots', '1'];
> -	    my $free = ['ssh', "root\@$target_host", '--', 'pvesm', 'free', $volid,
> '-snapshot', '__migration__'];
> +	    my $free = ['ssh', "root\@$target_host", '--', 'pvesm', 'free', $volid,
> '-snapshot', $snapname]
> +		if !defined($snapshot);
>  
>  	    if (defined($base_snapshot)) {
>  		# Check if the snapshot exists on the remote side:
> @@ -639,16 +649,18 @@ sub storage_migrate {
>  		push @$recv, '-base', $base_snapshot;
>  	    }
>  
> -	    volume_snapshot($cfg, $volid, '__migration__');
> +	    volume_snapshot($cfg, $volid, $snapname);
>  	    eval {
>  		run_command([$send, $recv]);
>  	    };
>  	    my $err = $@;
>  	    warn "send/receive failed, cleaning up snapshot(s)..\n" if $err;
> -	    eval { volume_snapshot_delete($cfg, $volid, '__migration__', 0) };
> -	    warn "could not remove source snapshot: $@\n" if $@;
> -	    eval { run_command($free) };
> -	    warn "could not remove target snapshot: $@\n" if $@;
> +	    if (defined($snapshot)) {
> +		eval { volume_snapshot_delete($cfg, $volid, $snapname, 0) };
> +		warn "could not remove source snapshot: $@\n" if $@;
> +		eval { run_command($free) };
> +		warn "could not remove target snapshot: $@\n" if $@;
> +	    }
>  	    die $err if $err;
>   	} else {
>   	    die "$errstr - target type $tcfg->{type} is not valid\n";
> @@ -656,6 +668,7 @@ sub storage_migrate {
>  
>      } elsif ($scfg->{type} eq 'lvmthin' || $scfg->{type} eq 'lvm') {
>  	$no_incremental->($scfg->{type});
> +	$no_snapshot->($scfg->{type});
>  
>  	if (($scfg->{type} eq $tcfg->{type}) &&
>  	    ($tcfg->{type} eq 'lvmthin' || $tcfg->{type} eq 'lvm')) {
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel




More information about the pve-devel mailing list