[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