Bug 1325937

Summary: Regression: killproc ignores -d
Product: Red Hat Enterprise Linux 6 Reporter: Leos Pol <lpol>
Component: initscriptsAssignee: Lukáš Nykrýn <lnykryn>
Status: CLOSED ERRATA QA Contact: qe-baseos-daemons
Severity: urgent Docs Contact:
Priority: unspecified    
Version: 6.8CC: psklenar, tlavigne
Target Milestone: rcKeywords: Regression
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: initscripts-9.03.53-1.el6 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2016-05-11 01:08:13 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:

Description Leos Pol 2016-04-11 12:54:44 UTC
Description of problem:
Regression in the /CoreOS/initscripts/Sanity/bz843386-killproc-function-should-check-if-program-has-exited-several-times-during-delay

Version-Release number of selected component (if applicable):
initscripts-9.03.51-1.el6

How reproducible:
Always

Steps to Reproduce:
1. execute tc#268929

Actual results:
fail

Expected results:
pass

Additional info:
original bug bz843386, works with initscripts-9.03.49-1.el6

Comment 1 Lukáš Nykrýn 2016-04-11 13:00:10 UTC
Possible fix:

diff --git a/rc.d/init.d/functions b/rc.d/init.d/functions
index a72a8b8..3a134ca 100644
--- a/rc.d/init.d/functions
+++ b/rc.d/init.d/functions
@@ -115,6 +115,11 @@ __kill_pids_term_kill() {
     local stat=($(< /proc/self/stat))
     local base_stime=${stat[21]}
 
+    if [ "$1" = "-d" ]; then
+        delay=$2
+        shift 2
+    fi
+
     kill_list=$(__kill_pids_term_kill_checkpids $base_stime $kill_list)
 
     [ -z "$kill_list" ] && return 0
@@ -491,7 +496,7 @@ killproc() {
         if [ -n "$pid" ] ; then
                 [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
                if [ -z "$killlevel" ] ; then
-                   __kill_pids_term_kill $pid
+                   __kill_pids_term_kill -d $delay $pid
                        RC=$?
                        [ "$RC" -eq 0 ] && success $"$base shutdown" || failure $"$base shutdown"
                # use specified level only

Comment 5 Leos Pol 2016-04-12 08:00:25 UTC
Lukas, I've found terrible bug in this patch. 
__kill_pids_term_kill() {
    local try=0
    local delay=3;
    local pid=
    local kill_list=$*    <==== in the kill_list can be also something like -d 60
    local stat=($(< /proc/self/stat))
    local base_stime=${stat[21]}

    if [ "$1" = "-d" ]; then
        delay=$2
        shift 2
    fi

after this __kill_pids_term_kill_checkpids filter out from kill_list "-d", but if a process with pid 60 exists, it stays in the kill_list.

Example:
# ps -p60
  PID TTY          TIME CMD
   60 ?        00:00:00 md/2

# sleep 100 &
[1] 24658
# echo $! > /tmp/pid
# killproc -p /tmp/pid -d 60 sleep
kill_list 60 24658 <==== i've put echo "kill_list $kill_list" just before signaling TERM
[1]+  Terminated              sleep 100

It terms the sleep, but cannot terminate md/2 (thankfully) and waits for 60s because of delay.

Comment 7 Leos Pol 2016-04-12 09:52:38 UTC
Example from comment 5:

initscripts-9.03.52-1.el6: fail
initscripts-9.03.53-1.el6: pass

Comment 9 Leos Pol 2016-04-13 07:51:14 UTC
TestCase passes on all arch with initscripts-9.03.53-1.el6.

Comment 11 errata-xmlrpc 2016-05-11 01:08:13 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://rhn.redhat.com/errata/RHBA-2016-0951.html