hmm, and I just realized this would also need another fixup to unbreak new -> old (we'd need to report back that we understood 'replicated_volume' input from the target to the source, and abort otherwise with proper cleanup). otherwise we blindly receive our delta on-top of a newly allocated disk, while leaving the actual base as unused, unreferenced disk. I'll send a v2 ;)
On March 26, 2020 10:10 am, Fabian Grünbichler wrote: > by only checking for replicatable volumes when a replication job is > defined, and passing only actually replicated volumes to the target node > via STDIN. > > otherwise this can pick up theoretically replicatable, but not actually > replicated volumes and treat them wrong. > > Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> > --- > > Notes: > this effectively makes qemu-server 6.1-10 and 6.1-11 very broken > qemu-server versions > > PVE/API2/Qemu.pm | 5 ++++- > PVE/QemuMigrate.pm | 12 ++++++++---- > PVE/QemuServer.pm | 6 ++---- > 3 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm > index ef8a7c3..8a7e98c 100644 > --- a/PVE/API2/Qemu.pm > +++ b/PVE/API2/Qemu.pm > @@ -2073,6 +2073,7 @@ __PACKAGE__->register_method({ > # read spice ticket from STDIN > my $spice_ticket; > my $nbd_protocol_version = 0; > + my $replicated_volumes = {}; > if ($stateuri && ($stateuri eq 'tcp' || $stateuri eq 'unix') && > $migratedfrom && ($rpcenv->{type} eq 'cli')) { > while (defined(my $line = <STDIN>)) { > chomp $line; > @@ -2080,6 +2081,8 @@ __PACKAGE__->register_method({ > $spice_ticket = $1; > } elsif ($line =~ m/^nbd_protocol_version: (\d+)$/) { > $nbd_protocol_version = $1; > + } elsif ($line =~ m/^replicated_volume: (.*)$/) { > + $replicated_volumes->{$1} = 1; > } else { > # fallback for old source node > $spice_ticket = $line; > @@ -2113,7 +2116,7 @@ __PACKAGE__->register_method({ > > PVE::QemuServer::vm_start($storecfg, $vmid, $stateuri, > $skiplock, $migratedfrom, undef, $machine, > $spice_ticket, $migration_network, > $migration_type, $targetstorage, $timeout, > - $nbd_protocol_version); > + $nbd_protocol_version, > $replicated_volumes); > return; > }; > > diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm > index 9cff64d..ef5f6fd 100644 > --- a/PVE/QemuMigrate.pm > +++ b/PVE/QemuMigrate.pm > @@ -330,7 +330,9 @@ sub sync_disks { > }); > } > > - my $replicatable_volumes = > PVE::QemuConfig->get_replicatable_volumes($self->{storecfg}, $self->{vmid}, > $conf, 0, 1); > + my $rep_cfg = PVE::ReplicationConfig->new(); > + my $replication_jobcfg = $rep_cfg->find_local_replication_job($vmid, > $self->{node}); > + my $replicatable_volumes = $replication_jobcfg ? > PVE::QemuConfig->get_replicatable_volumes($self->{storecfg}, $self->{vmid}, > $conf, 0, 1) : {}; > > my $test_volid = sub { > my ($volid, $attr) = @_; > @@ -449,8 +451,7 @@ sub sync_disks { > } > } > > - my $rep_cfg = PVE::ReplicationConfig->new(); > - if (my $jobcfg = $rep_cfg->find_local_replication_job($vmid, > $self->{node})) { > + if ($replication_jobcfg) { > if ($self->{running}) { > > my $version = PVE::QemuServer::kvm_user_version(); > @@ -484,7 +485,7 @@ sub sync_disks { > my $start_time = time(); > my $logfunc = sub { $self->log('info', shift) }; > $self->{replicated_volumes} = PVE::Replication::run_replication( > - 'PVE::QemuConfig', $jobcfg, $start_time, $start_time, $logfunc); > + 'PVE::QemuConfig', $replication_jobcfg, $start_time, > $start_time, $logfunc); > } > > # sizes in config have to be accurate for remote node to correctly > @@ -657,6 +658,9 @@ sub phase2 { > # TODO change to 'spice_ticket: <ticket>\n' in 7.0 > my $input = $spice_ticket ? "$spice_ticket\n" : "\n"; > $input .= "nbd_protocol_version: $nbd_protocol_version\n"; > + foreach my $volid (keys %{$self->{replicated_volumes}}) { > + $input .= "replicated_volume: $volid\n"; > + } > > # Note: We try to keep $spice_ticket secret (do not pass via command > line parameter) > # instead we pipe it through STDIN > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index a3e3269..f077915 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -4706,7 +4706,7 @@ sub vmconfig_update_disk { > sub vm_start { > my ($storecfg, $vmid, $statefile, $skiplock, $migratedfrom, $paused, > $forcemachine, $spice_ticket, $migration_network, $migration_type, > - $targetstorage, $timeout, $nbd_protocol_version) = @_; > + $targetstorage, $timeout, $nbd_protocol_version, $replicated_volumes) = > @_; > > PVE::QemuConfig->lock_config($vmid, sub { > my $conf = PVE::QemuConfig->load_config($vmid, $migratedfrom); > @@ -4755,14 +4755,12 @@ sub vm_start { > $local_volumes->{$ds} = [$volid, $storeid, $volname]; > }); > > - my $replicatable_volumes = > PVE::QemuConfig->get_replicatable_volumes($storecfg, $vmid, $conf, 0, 1); > - > my $format = undef; > > foreach my $opt (sort keys %$local_volumes) { > > my ($volid, $storeid, $volname) = @{$local_volumes->{$opt}}; > - if ($replicatable_volumes->{$volid}) { > + if ($replicated_volumes->{$volid}) { > # re-use existing, replicated volume with bitmap on source > side > $local_volumes->{$opt} = $conf->{${opt}}; > next; > -- > 2.20.1 > > > _______________________________________________ > pve-devel mailing list > pve-devel@pve.proxmox.com > https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel