From af30308f36a7e64af05a13e401c3a44bbb389f8e Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Thu, 23 Aug 2012 10:28:41 +0200 Subject: [PATCH] we call vm_stop to target host, to be sure that kvm process is killed (but it should kill itself), and deactivate volumes I slightly modified this patch (orig. from Alexandre) so that it apply cleanly. --- PVE/API2/Qemu.pm | 8 +++++++- PVE/QemuMigrate.pm | 17 ++++++++++++++--- PVE/QemuServer.pm | 10 +++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 2087a753..71585a58 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -1277,6 +1277,7 @@ __PACKAGE__->register_method({ node => get_standard_option('pve-node'), vmid => get_standard_option('pve-vmid'), skiplock => get_standard_option('skiplock'), + migratedfrom => get_standard_option('pve-node',{ optional => 1 }), timeout => { description => "Wait maximal timeout seconds.", type => 'integer', @@ -1313,6 +1314,11 @@ __PACKAGE__->register_method({ raise_param_exc({ keepActive => "Only root may use this option." }) if $keepActive && $authuser ne 'root@pam'; + my $migratedfrom = extract_param($param, 'migratedfrom'); + raise_param_exc({ migratedfrom => "Only root may use this option." }) + if $migratedfrom && $authuser ne 'root@pam'; + + my $storecfg = PVE::Storage::config(); if (&$vm_is_ha_managed($vmid) && $rpcenv->{type} ne 'ha') { @@ -1340,7 +1346,7 @@ __PACKAGE__->register_method({ syslog('info', "stop VM $vmid: $upid\n"); PVE::QemuServer::vm_stop($storecfg, $vmid, $skiplock, 0, - $param->{timeout}, 0, 1, $keepActive); + $param->{timeout}, 0, 1, $keepActive, $migratedfrom); return; }; diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index 67c21af6..82eb61e7 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -382,6 +382,9 @@ sub phase2 { sub phase2_cleanup { my ($self, $vmid, $err) = @_; + return if !$self->{errors}; + $self->{phase2errors} = 1; + $self->log('info', "aborting phase 2 - cleanup resources"); my $conf = $self->{vmconf}; @@ -391,15 +394,22 @@ sub phase2_cleanup { $self->log('err', $err); } - ## fixme : vm_stop_cleanup on target vm - - + # cleanup ressources on target host + my $nodename = PVE::INotify::nodename(); + + my $cmd = [@{$self->{rem_ssh}}, 'qm', 'stop', $vmid, '--skiplock', '--migratedfrom', $nodename]; + eval{ PVE::Tools::run_command($cmd, outfunc => sub {}, errfunc => sub {}) }; + if (my $err = $@) { + $self->log('err', $err); + $self->{errors} = 1; + } } sub phase3 { my ($self, $vmid) = @_; my $volids = $self->{volumes}; + return if $self->{phase2errors}; # destroy local copies foreach my $volid (@$volids) { @@ -416,6 +426,7 @@ sub phase3_cleanup { my ($self, $vmid, $err) = @_; my $conf = $self->{vmconf}; + return if $self->{phase2errors}; # move config to remote node my $conffile = PVE::QemuServer::config_file($vmid); diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index f19d52b0..121e8c2c 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2910,10 +2910,18 @@ sub vm_stop_cleanup { # We need that when migration VMs to other nodes (files already moved) # Note: we set $keepActive in vzdump stop mode - volumes need to stay active sub vm_stop { - my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, $keepActive) = @_; + my ($storecfg, $vmid, $skiplock, $nocheck, $timeout, $shutdown, $force, $keepActive, $migratedfrom) = @_; $force = 1 if !defined($force) && !$shutdown; + if ($migratedfrom){ + my $pid = check_running($vmid, $nocheck, $migratedfrom); + kill 15, $pid if $pid; + my $conf = load_config($vmid, $migratedfrom); + vm_stop_cleanup($storecfg, $vmid, $conf, $keepActive); + return; + } + lock_config($vmid, sub { my $pid = check_running($vmid, $nocheck); -- 2.39.5