<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi all,<div><br></div><div>I'm having a couple of issues with timeouts in the web server. This is kind of related to the&nbsp;"dynamic-wind &amp; kill-thread" thread.</div><div><br></div><div>I'm using a servlet and&nbsp;make-response/incremental to serve files from the file system to web users.&nbsp;I've attached simplified test code below (tested on PLT 4.1.4.1).</div><div><br></div><div>Three problems:</div><div><br></div><div>&nbsp;&nbsp;- large file downloads can take a long time,&nbsp;and can be killed by the web server's connection timeout (default 60 seconds);</div><div><br></div><div>&nbsp;&nbsp;-&nbsp;when the connection times out, the servlet thread is killed and&nbsp;leaves&nbsp;the file handle open permanently&nbsp;("lsof -p &lt;PID>").</div><div><br></div><div>&nbsp;&nbsp;- over time, the web server accrues open file handles until it hits the OS-imposed limit&nbsp;("ulimit -n")&nbsp;&nbsp;and stops working properly (connecting to Postgres in my case).</div><div><br></div><div>I remember back in the day we had the same problem with files served using dispatch-files.ss.&nbsp;The solution there was to insert a call to adjust-connection-timeout! to increase the connection&nbsp;timeout for large files.</div><div><br></div><div>Here it's not so simple because make-response/incremental can do more than just serve static files.</div><div><br></div><div>I'd like to be able to call adjust-connection-timeout! from servlet code, but I don't think that feature&nbsp;is available from inside a servlet (no access to the connection object).</div><div><br></div><div>Cheers,</div><div><br></div><div>-- Dave</div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">===== test-server.ss =====</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><div><font class="Apple-style-span" face="Monaco">#lang scheme/base</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">(require scheme/runtime-path</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; web-server/servlet-env</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; web-server/http)</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">; Plain text file of >60 bytes in length:</font></div><div><font class="Apple-style-span" face="Monaco">(define-runtime-path test-file "test-file.txt")</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">; Serve the text file at an artificiually slow rage (1 byte/sec):</font></div><div><font class="Apple-style-span" face="Monaco">(define (make-test-response)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp;(make-response/incremental</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; 200</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; "Okay"</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; (current-seconds)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; #"text/plain"</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; null</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; (lambda (write)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; ; This is 4096 in my actual production code:</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; (define BUFFER-SIZE 1)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; (define buffer (make-bytes BUFFER-SIZE))</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; (call-with-input-file test-file</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; (lambda (input)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; (let loop ([counter 0])</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (sleep 1)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (printf "... ~as~n" counter)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Send some data to the browser:</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (let ([num-read (read-bytes! buffer input)])</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (cond [(eof-object? num-read)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(void)]</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [(= num-read BUFFER-SIZE)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(write buffer)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(loop (add1 counter))]</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [else</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(write (subbytes buffer 0 num-read))</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(loop (add1 counter))]))))))))</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">; Main server loop:</font></div><div><font class="Apple-style-span" face="Monaco">(serve/servlet</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;(lambda (request)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; (printf "Serving file.~n")</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; (begin0 (make-test-response)</font></div><div><font class="Apple-style-span" face="Monaco">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (printf "Finished serving file.~n"))))</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">===== end test-server.ss =====</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">===== test-file.txt =====</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco">0123456789</font></div><div><font class="Apple-style-span" face="Monaco"><br></font></div><div><font class="Apple-style-span" face="Monaco">===== end test-file.txt =====</font></div></div></div><div><br></div></body></html>