]> git.proxmox.com Git - qemu-server.git/commitdiff
we call vm_stop to target host,
authorDietmar Maurer <dietmar@proxmox.com>
Thu, 23 Aug 2012 08:28:41 +0000 (10:28 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 23 Aug 2012 08:28:41 +0000 (10:28 +0200)
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
PVE/QemuMigrate.pm
PVE/QemuServer.pm

index 2087a753446530c2c7f8ff2aca271563ef9c165c..71585a5838e7df578f12116e7408be779bbb4610 100644 (file)
@@ -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;
            };
index 67c21af648f739b72395e81c583668d2a4ef3f41..82eb61e7786600d895b772109abe43c06061c441 100644 (file)
@@ -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);
index f19d52b03a441e8dc695b2ff8b9a724f21db4679..121e8c2cca300f10c27df9a20ef72c398a1b0157 100644 (file)
@@ -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);