<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
 /* List Definitions */
 @list l0
        {mso-list-id:1310935395;
        mso-list-type:hybrid;
        mso-list-template-ids:-1658527160 1036547598 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:900;
        mso-level-number-format:bullet;
        mso-level-text:-;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Calibri","sans-serif";
        mso-fareast-font-family:"MS Mincho";}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=WordSection1>

<p class=MsoNormal>Using torque-2.6.0-snap.201008061539 and maui-3.3, I
encountered some strange behavior when scheduling jobs where the maui scheduler
would get &#8220;hung up&#8221; on communication with the server.&nbsp; I
finally tracked it down to this message in the maui log file:<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>INFO:&nbsp;&nbsp;&nbsp;&nbsp; starting iteration 50<o:p></o:p></p>

<p class=MsoNormal>MRMGetInfo()<o:p></o:p></p>

<p class=MsoNormal>MClusterClearUsage()<o:p></o:p></p>

<p class=MsoNormal>MRMClusterQuery()<o:p></o:p></p>

<p class=MsoNormal>MPBSClusterQuery(abc.xyz.com,RCount,SC)<o:p></o:p></p>

<p class=MsoNormal>ERROR:&nbsp;&nbsp;&nbsp; cannot get node info: NULL<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>The behavior observed is that after some length of time (several
minutes), finally maui is able to continue and then begins scheduling jobs
again.<o:p></o:p></p>

<p class=MsoNormal>I should mention that nscd is running on both machines, that
had solved an earlier problem.&nbsp; From previous Google searches I noticed a
few folks had encountered this problem, but my guess is it&#8217;s not usually
noticed as anyone with relatively long-running jobs would have no idea that the
scheduler had gotten hung up.&nbsp; The only way we noticed it was because we
were testing a fairly intensive set of short-running jobs that we expected to
finish soon.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I was able to reproduce this problem fairly regularly, so I
attached to maui with gdb and found some code that I believe is
responsible.&nbsp; It turns out this code is in torque&#8217;s src/lib/Libifl/pbsD_connect.c,
around line 900:<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp; if ((encode_DIS_ReqHdr(sock, PBS_BATCH_Disconnect,
pbs_current_user) == 0) &amp;&amp;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (DIS_tcp_wflush(sock) == 0))<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; int atime;<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; struct sigaction act;<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; struct sigaction oldact;<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; /* set alarm to break out of potentially
infinite read */<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; act.sa_handler = SIG_IGN;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; sigemptyset(&amp;act.sa_mask);<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; act.sa_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; sigaction(SIGALRM, &amp;act,
&amp;oldact);<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; atime = alarm(pbs_tcp_timeout);<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; /* NOTE:&nbsp; alarm will break out of
blocking read even with sigaction ignored */<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; while (1)<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* wait for server to close
connection */<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* NOTE:&nbsp; if read of
'sock' is blocking, request below may hang forever */<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (read(sock, &amp;x,
sizeof(x)) &lt; 1)<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; alarm(atime);<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; sigaction(SIGALRM, &amp;oldact, NULL);<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>close(sock);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>My understanding of this is, for
some reason the client is trying to disconnect from the server.&nbsp; To do so,
it expects to get a -1 on a read from the (blocking) socket to the server, i.e.
it expects the server to close it from its end.&nbsp; It sets a signal handler
to effect a timeout on the read.&nbsp; pbs_tcp_timeout was set to 9 (seconds)
when I was attached.<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>The comments suggesting that setting
SIG_IGN for the alarm handler will still result in the blocking read being
interrupted are incorrect, however.&nbsp; I believe this may be
implementation-specific, but it definitely is not the case on our version of
Linux (fc12).&nbsp; I also don&#8217;t see why it would ever be reasonable to
expect this to behave like this.&nbsp; A simple test program proves the point:<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;stdlib.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;stdio.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;unistd.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;stdint.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;sys/types.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;sys/stat.h&gt;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;#include &lt;fcntl.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>#include &lt;signal.h&gt;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>void handler(int signo)<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>{<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; fprintf(stderr,
&quot;Caught signal #%d\n&quot;, signo);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>}<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>int main(int argc_, char **argv_)<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>{<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; struct sigaction act;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; struct sigaction oldact;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>//&nbsp; act.sa_handler = SIG_IGN;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; act.sa_handler = handler;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp;
sigemptyset(&amp;act.sa_mask);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; act.sa_flags = 0;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; sigaction(SIGALRM,
&amp;act, &amp;oldact);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; int atime = alarm(10);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; char buf[10];<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; ssize_t br = read(0, buf,
10);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp;<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>&nbsp; fprintf(stderr, &quot;Broke
out of read with br = %ld\n&quot;, br);<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>}<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>Run this program as-is and the
read from stdin will get interrupted after 10 seconds, and the read will return
-1. &nbsp;However, switch the comment line to use SIG_IGN and the read will
block indefinitely.<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>I don&#8217;t understand
pbs_server well enough to know why takes so long to disconnect a client, but it
is not unreasonable for there to be a very long delay there as it is not a high
priority action.&nbsp; However, I believe the code as written is incorrect, and
leads to schedulers like maui which use torque&#8217;s client libraries to get
hung up unreasonably.&nbsp; Perhaps this is also the case for pbs_sched.<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'>I made a change to our local copy
of the source where I installed an empty signal handler (i.e. &#8220;void
foo(int signo) {}&#8221;, and set act.sa_handler = foo), along with some
debugging printouts. &nbsp;I recompiled torque and maui, and I was able to
verify from the maui logs that the timeout now gets properly handled, and maui
was able to continue gracefully.<o:p></o:p></p>

<p class=MsoNormal style='text-indent:4.5pt'><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>In any case, I&#8217;d like to solicit some feedback:<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>Do the developers agree with my assessment of the
problem?<o:p></o:p></p>

<p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>If so, are there other spots in the code that need to
be fixed as well?<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Many thanks,<o:p></o:p></p>

<p class=MsoNormal>William<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</body>

</html>