[ 
https://issues.apache.org/jira/browse/MAPREDUCE-1119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12775200#action_12775200
 ] 

Aaron Kimball commented on MAPREDUCE-1119:
------------------------------------------

To address all three reviews above:

* I'll rename the constant to SIGQUIT_TASK_JVM; understandability overrides 
consistency. "CORE_DUMP_JVM" is also a misnomer; if anything, the proper 
alternative would be "STACK_DUMP_JVM".
* I'll adapt the logic to go SIGQUIT, SIGKILL instead of SIGQUIT, SIGTERM, 
SIGKILL. Use the same constant (sleepTimeBeforeSigkill) as already exists.
* ProcessTree and DefaultTaskController both contain a lot of redundant code 
clones; if people are okay with it, I'm +1 on condensing a lot of the logic. 
The initial version of this patch didn't modify anything extraneous, but since 
the earlier versions of this patch make its intent clear, I'll write a broader 
one that cleans up the other code "in the neighborhood."
* I'll rename the current logic in {{finishTask()}} to {{sendSignal()}}; we can 
preserve a method named {{finishTask()}} that specifically sends SIGKILL using 
{{sendSignal()}}


| This currently causes stack traces for all killed tasks, right? I don't 
personally have a problem with that, but the description of the JIRA indicates 
that only those due to failing to report status will dump their stack, and it's 
worth noting the difference.

I've tried tracing backwards through the code to figure out what triggers JVM 
kills, but it's a lengthy string of methods involved. What other operations are 
there (besides task timeout) which wind up killing the task? The 
{{TaskController.destroyTaskJVM()}} method is only called from 
{{JvmManager.kill()}}, which itself receives no information as to why it's 
killing the JVM in question. (There are no arguments to this method; there's no 
flag in there to determine that the jvm under management has experienced a 
timeout.)

I actually claim that actually receiving a SIGKILL implies that something has 
gone wrong in the process. Tasks that clean up "politely" do not get the 
SIGKILL, and thus also do not get the SIGQUIT/dump stacks.  So if something's 
gone wrong, then in my mind, we should capture the stack trace for debug 
purposes.

Otherwise, we will need to modify the JvmManager API to be more precise about 
the nature of kills. I suppose I could live with that, but someone else needs 
to point me to where the information about this lives. So this would add 
complexity, and in my mind, be less useful.

* As for sigQuitProcessGroup(), I modeled the logic in dumpTaskStack() after 
that of all the other signalling methods. It's conceivable that a user's task 
process hangs because it spawns subprocesses and then gets in a deadlock based 
on IPC between the task and its subprocesses. I think the better question is: 
Is there a good reason *not* to send SIGQUIT to the entire child process group? 
(e.g., substantial overhead, especially that which blocks the TT?) I don't 
think there's any more overhead here on the TT's side than sending SIGTERM to 
the process group, which we already do. If we maintain this same logical 
structure in dumpTaskStack as we do in killTask, etc, then we can refactor this 
code down into a considerably more condensed form involving better code 
sharing. Otherwise, dumpTaskStack will have to remain a special case.




> When tasks fail to report status, show tasks's stack dump before killing
> ------------------------------------------------------------------------
>
>                 Key: MAPREDUCE-1119
>                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-1119
>             Project: Hadoop Map/Reduce
>          Issue Type: Bug
>          Components: tasktracker
>    Affects Versions: 0.22.0
>            Reporter: Todd Lipcon
>            Assignee: Aaron Kimball
>         Attachments: MAPREDUCE-1119.2.patch, MAPREDUCE-1119.patch
>
>
> When the TT kills tasks that haven't reported status, it should somehow 
> gather a stack dump for the task. This could be done either by sending a 
> SIGQUIT (so the dump ends up in stdout) or perhaps something like JDI to 
> gather the stack directly from Java. This may be somewhat tricky since the 
> child may be running as another user (so the SIGQUIT would have to go through 
> LinuxTaskController). This feature would make debugging these kinds of 
> failures much easier, especially if we could somehow get it into the 
> TaskDiagnostic message

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to