[pve-devel] [RFC qemu-server 2/3] Integrate replica in the qemu migration.
Wolfgang Link
w.link at proxmox.com
Wed Apr 12 12:41:17 CEST 2017
Now it is possible to migrate a VM offline when replica is enabled.
It will reduce replication to an minimal amount.
---
PVE/QemuMigrate.pm | 34 +++++++++++++++++++++++++++++-----
1 file changed, 29 insertions(+), 5 deletions(-)
diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
index e6f147e..abbe487 100644
--- a/PVE/QemuMigrate.pm
+++ b/PVE/QemuMigrate.pm
@@ -10,6 +10,7 @@ use PVE::INotify;
use PVE::Tools;
use PVE::Cluster;
use PVE::Storage;
+use PVE::ReplicationTools;
use PVE::QemuServer;
use Time::HiRes qw( usleep );
use PVE::RPCEnvironment;
@@ -435,6 +436,16 @@ sub phase1 {
sync_disks($self, $vmid);
+ # set new replica_target if we migrate to replica target.
+ if ($conf->{replica}) {
+ $self->log('info', "change replica target to Node: $self->{opts}->{node}");
+ if ($conf->{replica_target} eq $self->{node}) {
+ $conf->{replica_target} = $self->{opts}->{node};
+ }
+
+ PVE::ReplicationTools::job_remove($vmid);
+ PVE::QemuConfig->write_config($vmid, $conf);
+ }
};
sub phase1_cleanup {
@@ -842,13 +853,21 @@ sub phase3 {
my $volids = $self->{volumes};
return if $self->{phase2errors};
+ my $synced_volumes = PVE::ReplicationTools::get_syncable_guestdisks($self->{vmconf}, 'qemu')
+ if $self->{vmconf}->{replica};
+
+
# destroy local copies
foreach my $volid (@$volids) {
- eval { PVE::Storage::vdisk_free($self->{storecfg}, $volid); };
- if (my $err = $@) {
- $self->log('err', "removing local copy of '$volid' failed - $err");
- $self->{errors} = 1;
- last if $err =~ /^interrupted by signal$/;
+
+ # do not destroy if new target is local_host
+ if (!($self->{vmconf}->{replica} && defined($synced_volumes->{$volid}))) {
+ eval { PVE::Storage::vdisk_free($self->{storecfg}, $volid); };
+ if (my $err = $@) {
+ $self->log('err', "removing local copy of '$volid' failed - $err");
+ $self->{errors} = 1;
+ last if $err =~ /^interrupted by signal$/;
+ }
}
}
}
@@ -955,6 +974,11 @@ sub phase3_cleanup {
# clear migrate lock
my $cmd = [ @{$self->{rem_ssh}}, 'qm', 'unlock', $vmid ];
$self->cmd_logerr($cmd, errmsg => "failed to clear migrate lock");
+
+ if ($self->{vmconf}->{replica}) {
+ my $cmd = [ @{$self->{rem_ssh}}, 'qm', 'set', $vmid, '--replica'];
+ $self->cmd_logerr($cmd, errmsg => "failed to activate replica");
+ }
}
sub final_cleanup {
--
2.1.4
More information about the pve-devel
mailing list