[pve-devel] [PATCH v2 storage 15/28] storage_migrate: return volume ID of migrated volume

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Feb 25 12:33:00 CET 2020


like discussed off-list, this would break replication and migration from 
new to old. one possible solution is to add a call to a new 'pvesm 
apiinfo' that returns APIVER and APIAGE to determine whether we can 
expect a volid and support for renaming, or the old behaviour.

On February 24, 2020 1:44 pm, Fabian Ebner wrote:
> In preparation to introduce an allow_rename parameter.
> 
> Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
> ---
>  PVE/CLI/pvesm.pm |  2 +-
>  PVE/Storage.pm   | 41 ++++++++++++++++++++++++++++++++---------
>  2 files changed, 33 insertions(+), 10 deletions(-)
> 
> diff --git a/PVE/CLI/pvesm.pm b/PVE/CLI/pvesm.pm
> index 7b83ec8..c55cdd0 100755
> --- a/PVE/CLI/pvesm.pm
> +++ b/PVE/CLI/pvesm.pm
> @@ -779,7 +779,7 @@ our $cmddef = {
>      export => [ __PACKAGE__, 'export', ['volume', 'format', 'filename']],
>      import => [ __PACKAGE__, 'import', ['volume', 'format', 'filename'], {}, sub  {
>  	my $volid = shift;
> -	print "successfully imported '$volid'\n";
> +	print PVE::Storage::volume_imported_message($volid);
>      }],
>  };
>  
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index 38341f6..cb07066 100755
> --- a/PVE/Storage.pm
> +++ b/PVE/Storage.pm
> @@ -571,7 +571,7 @@ sub storage_migrate {
>      my $scfg = storage_config($cfg, $storeid);
>  
>      # no need to migrate shared content
> -    return if $storeid eq $target_storeid && $scfg->{shared};
> +    return $volid if $storeid eq $target_storeid && $scfg->{shared};
>  
>      my $tcfg = storage_config($cfg, $target_storeid);
>  
> @@ -620,6 +620,19 @@ sub storage_migrate {
>  	push @$recv, '-base', $base_snapshot;
>      }
>  
> +    my $new_volid;
> +    my $pattern = volume_imported_message(undef, 1);
> +    my $match_volid_and_log = sub {
> +	my $line = shift;
> +
> +	$new_volid = $1 if ($line =~ m!$pattern!);
> +
> +	if ($logfunc) {
> +	    chomp($line);
> +	    $logfunc->($line);
> +	}
> +    };
> +
>      volume_snapshot($cfg, $volid, $snapshot) if $migration_snapshot;
>      eval {
>  	if ($insecure) {
> @@ -637,13 +650,8 @@ sub storage_migrate {
>  	    shutdown($socket, 1);
>  
>  	    # wait for the remote process to finish
> -	    if ($logfunc) {
> -		while (my $line = <$info>) {
> -		    chomp($line);
> -		    $logfunc->("[$target_sshinfo->{name}] $line");
> -		}
> -	    } else {
> -		1 while <$info>;
> +	    while (my $line = <$info>) {
> +		$match_volid_and_log->("[$target_sshinfo->{name}] $line");
>  	    }
>  
>  	    # now close the socket
> @@ -653,8 +661,11 @@ sub storage_migrate {
>  		die "import failed: exit code ".($?>>8)."\n";
>  	    }
>  	} else {
> -	    run_command([$send, @cstream, $recv], logfunc => $logfunc);
> +	    run_command([$send, @cstream, $recv], logfunc => $match_volid_and_log);
>  	}
> +
> +	die "unable to get ID of the migrated volume\n"
> +	    if !defined($new_volid);
>      };
>      my $err = $@;
>      warn "send/receive failed, cleaning up snapshot(s)..\n" if $err;
> @@ -663,6 +674,8 @@ sub storage_migrate {
>  	warn "could not remove source snapshot: $@\n" if $@;
>      }
>      die $err if $err;
> +
> +    return $new_volid;
>  }
>  
>  sub vdisk_clone {
> @@ -1461,6 +1474,16 @@ sub volume_transfer_formats {
>      return @common;
>  }
>  
> +sub volume_imported_message {
> +    my ($volid, $want_pattern) = @_;
> +
> +    if ($want_pattern) {
> +	return "successfully imported '([^']*)'\$";
> +    } else {
> +	return "successfully imported '$volid'\n";
> +    }
> +}
> +
>  # bash completion helper
>  
>  sub complete_storage {
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> 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