[pve-devel] [PATCH access-control 3/4] add force option to kill_process_group

Fabian Grünbichler f.gruenbichler at proxmox.com
Thu Jul 28 15:32:43 CEST 2016


only kill -9 in force mode and only set force mode
when worker is done or it is not the first stop attempt.
---
 PVE/RPCEnvironment.pm | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/PVE/RPCEnvironment.pm b/PVE/RPCEnvironment.pm
index 95bb83f..a7e8a01 100644
--- a/PVE/RPCEnvironment.pm
+++ b/PVE/RPCEnvironment.pm
@@ -741,7 +741,7 @@ sub active_workers  {
 }
 
 my $kill_process_group = sub {
-    my ($pid, $pstart) = @_;
+    my ($pid, $pstart, $force) = @_;
 
     # send kill to process group (negative pid)
     my $kpid = -$pid;
@@ -749,6 +749,8 @@ my $kill_process_group = sub {
     # always send signal to all pgrp members
     kill(15, $kpid); # send TERM signal
 
+    return if !$force;
+
     # give max 5 seconds to shut down
     for (my $i = 0; $i < 5; $i++) {
 	return if !PVE::ProcFSTools::check_process_running($pid, $pstart);
@@ -769,7 +771,25 @@ sub check_worker {
     return 0 if !$running;
 
     if ($killit) {
-	&$kill_process_group($task->{pid}, $task->{pstart});
+	my $force = 1;
+	eval {
+	    my $stoptime = time();
+	    my $tlist = active_workers($upid, 1, $stoptime);
+	    PVE::Cluster::broadcast_tasklist($tlist);
+	    my $taskinfo;
+	    foreach my $t (@$tlist) {
+		if ($t->{upid} eq $upid) {
+		    $taskinfo = $t;
+		    last;
+		}
+	    }
+
+	    # first stop attempt
+	    $force = 0
+		if $taskinfo && $taskinfo->{stoptime} && $taskinfo->{stoptime} == $stoptime;
+	};
+	warn $@ if $@;
+	&$kill_process_group($task->{pid}, $task->{pstart}, $force);
 	return 0;
     }
 
@@ -1038,7 +1058,7 @@ sub fork_worker {
 	    }
 	}
 
-	&$kill_process_group($cpid, $pstart); # make sure it gets killed
+	&$kill_process_group($cpid, $pstart, 1); # make sure it gets killed
 
 	close($outfh);
 
-- 
2.1.4




More information about the pve-devel mailing list