On Wed, Feb 17, 2010 at 2:36 AM, Taru Karttunen <span dir="ltr">&lt;<a href="mailto:taruti@taruti.net">taruti@taruti.net</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Excerpts from Bardur Arantsson&#39;s message of Tue Feb 16 23:48:14 +0200 2010:<br>
<div class="im">&gt; &gt; This cannot be fixed in the sendfile library, it is a<br>
&gt; &gt; feature of TCP that connections may linger for a long<br>
&gt; &gt; time unless explicit timeouts are used.<br>
&gt;<br>
&gt; The problem is that the sendfile library *doesn&#39;t* wake<br>
&gt; up when the connection is terminated (because of threadWaitWrite)<br>
&gt; -- it doesn&#39;t matter what the timeout is.<br>
<br>
</div>Even server code without sendfile has the same issue since<br>
all writing to sockets ends up using threadWaitWrite.<br></blockquote><div><br></div><div>Right, this is my concern -- I want to make sure that all of happstack is fixed, not just sendfile.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

System.Timeout.timeout terminates a threadWaitWrite using<br>
asynchronous exceptions.<br></blockquote><div><br></div><div>So for sendfile, instead of threadWaitWrite we could do:</div><div><br></div><div> r &lt;- timeout (60 * 10^6) threadWaitWrite</div><div> case r of</div><div>   Nothing -&gt; ... -- timed out</div>
<div>   (Just ()) -&gt; ... -- keep going</div><div><br></div><div>It seems tricky to use timeout at a higher level in the code, because some requests may take a very long time to finish. For example, when serving a long video, or streaming music it could be hours or days before the IO request finishes.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
If you want to detect dead sockets somewhat reliably<br>
without a timeout then there is SO_KEEPALIVE combined<br>
with polling SO_ERROR every few minutes.</blockquote><div><br></div><div> This approach sounds promising because it seems like it could be incorporated into the guts of happstack-server. The timeout period could be a Config option with a reasonable default. I would be surprised if *any* happstack programs today are handling this correctly, so updating the core to do something reasonable would be a big improvement... And if someone has a special need where it is not ok, they can just change the config to use an infinite timeout...</div>
<div><br></div><div>Does that sound like the right fix to you? (Obviously, if people are using sendfile with something other than happstack, it does not help them, but it sounds like trying to fix things in sendfile is misguided anyway.)</div>
<div><br></div><div>- jeremy</div></div>