On Mar 25, 2012, at 7:19 AM, Júlio Hoffimann wrote:

> Dear Ralph,
> 
> Thank you for your prompt reply. I confirmed what you just said by reading 
> the mpirun man page at the sections Signal Propagation and Process 
> Termination / Signal Handling.
> 
> "During the run of an MPI  application,  if  any  rank  dies  abnormally 
> (either exiting before invoking MPI_FINALIZE, or dying as the result of a 
> signal), mpirun will print out an error message and kill the rest  of the MPI 
> application."
> 
> If i understood correctly, the SIGKILL signal is sent to every process on a 
> premature death.

Each process receives a SIGTERM, and then a SIGKILL if it doesn't exit within a 
specified time frame. I told you how to adjust that time period in the prior 
message.

> In my point of view, i consider this a bug. If OpenMPI allows handling 
> signals such as SIGTERM, the other processes in the communicator should also 
> have the opportunity to die prettily. Perhaps i'm missing something?

Yes, you are - you do get a SIGTERM first, but you are required to exit in a 
timely fashion. You are not allowed to continue running. This is required in 
order to ensure proper cleanup of the job, per the MPI standard.

> 
> Supposing the described behaviour in the last paragraph, i think would be 
> great to explicitly mention the SIGKILL in the man page, or even better, fix 
> the implementation to send SIGTERM instead, making possible for the user 
> cleanup all processes before exit.

We already do, as described above.

> 
> I solved my particular problem by adding another flag 
> unexpected_error_on_slave:
> 
> volatile sig_atomic_t unexpected_error_occurred = 0;
> int unexpected_error_on_slave = 0;
> enum tag { work_tag, die_tag }
> 
> void my_handler( int sig )
> {
>     unexpected_error_occurred = 1;
> }
> 
> //
> // somewhere in the code...
> //
> 
> signal(SIGTERM, my_handler);
> 
> if (root process) {
> 
>     // do stuff
> 
>     world.recv(mpi::any_source, die_tag, unexpected_error_on_slave);
>     if ( unexpected_error_occurred || unexpected_error_on_slave ) {
> 
>         // save something
> 
>         world.abort(SIGABRT);
>     }
> }
> else { // slave process
> 
>     // do different stuff
> 
>     if ( unexpected_error_occurred ) {
> 
>         // just communicate the problem to the root
>         world.send(root,die_tag,1);
>         signal(SIGTERM,SIG_DFL);
>         while(true)
>             ; // wait, master will take care of this
>     }
>     world.send(root,die_tag,0); // everything is fine
> }
> 
> signal(SIGTERM, SIG_DFL);                       // reassign default handler
> 
> // continues the code...
> 
> Note the slave must hang for the store operation get executed at the root, 
> otherwise we back for the previous scenario. It's theoretically unnecessary 
> send MPI messages to accomplish the desired cleanup, and in more complex 
> applications this can turn into a nightmare. As we know, asynchronous events 
> are insane to debug.
> 
> Best regards,
> Júlio.
> 
> P.S.: MPI 1.4.3 from Ubuntu 11.10 repositories.
> 
> 2012/3/23 Ralph Castain <r...@open-mpi.org>
> Well, yes and no. When a process abnormally terminates, OMPI will kill the 
> job - this is done by first hitting each process with a SIGTERM, followed 
> shortly thereafter by a SIGKILL. So you do have a short time on each process 
> to attempt to cleanup.
> 
> My guess is that your signal handler actually is getting called, but we then 
> kill the process before you can detect that it was called.
> 
> You might try adjusting the time between sigterm and sigkill using the 
> odls_base_sigkill_timeout MCA param:
> 
> mpirun -mca odls_base_sigkill_timeout N
> 
> should cause it to wait for N seconds before issuing the sigkill. Not sure if 
> that will help or not - it used to work for me, but I haven't tried it for 
> awhile. What versions of OMPI are you using?
> 
> 
> On Mar 22, 2012, at 4:49 PM, Júlio Hoffimann wrote:
> 
>> Dear all,
>> 
>> I'm trying to handle signals inside a MPI task farming model. Following is a 
>> pseudo-code of what i'm trying to achieve:
>> 
>> volatile sig_atomic_t unexpected_error_occurred = 0;
>> 
>> void my_handler( int sig )
>> {
>>     unexpected_error_occurred = 1;
>> }
>> 
>> //
>> // somewhere in the code...
>> //
>> 
>> signal(SIGTERM, my_handler);
>> 
>> if (root process) {
>> 
>>     // do stuff
>> 
>>     if ( unexpected_error_occurred ) {
>> 
>>         // save something
>> 
>>         // reraise the SIGTERM again, but now with the default handler
>>         signal(SIGTERM, SIG_DFL);
>>         raise(SIGTERM);
>>     }
>> }
>> else { // slave process
>> 
>>     // do different stuff
>> 
>>     if ( unexpected_error_occurred ) {
>> 
>>         // just propragate the signal to the root
>>         signal(SIGTERM, SIG_DFL);
>>         raise(SIGTERM);
>>     }
>> }
>> 
>> signal(SIGTERM, SIG_DFL);                       // reassign default handler
>> 
>> // continues the code...
>> 
>> As can be seen, the signal handling is required for implementing a restart 
>> feature. All the problem resides in the assumption i made that all processes 
>> in the communicator will receive a SIGTERM as a side effect. Is it a valid 
>> assumption? How the actual MPI implementation deals with such scenarios?
>> 
>> I also tried to replace all the raise() calls by MPI_Abort(), which 
>> according to the documentation 
>> (http://www.open-mpi.org/doc/v1.5/man3/MPI_Abort.3.php), sends a SIGTERM to 
>> all associated processes. The undesired behaviour persists: when killing a 
>> slave process, the save section in the root branch is not executed.
>> 
>> Appreciate any help,
>> Júlio.
>> _______________________________________________
>> users mailing list
>> us...@open-mpi.org
>> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users

Reply via email to