<div dir="ltr">Yes, that was it, thank you very much!</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 18, 2014 at 4:32 PM, Matthew Flatt <span dir="ltr"><<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Is the program reaching the calls to `close-output-port` and<br>
`close-input-port`?<br>
<br>
The output port created by `ssl-connect` doesn't send a shutdown<br>
message to the other end of the SSL connection when the port is closed,<br>
because that shutdown action tends to produce errors that have to be<br>
caught. So, my guess is that closing `to-dest` doesn't send a message<br>
that causes the server to close the connection, so `from-dest` never<br>
produces an EOF, and so open ports are accumulated.<br>
<br>
If I'm on the right track, you could use plain `tcp-accept` and<br>
`tcp-connect` to create network connections, and then use<br>
`ports->ssl-ports` and specify that closing an output port sends a<br>
shutdown. (Be sure to specify both `#:shutdown-on-close?` and<br>
`#:close-original?`.) You'll need to catch errors raised by<br>
`close-output-port`, though, and use `ssl-abandon-port` if closing an<br>
SSL output port fails.<br>
<div><div class="h5"><br>
At Thu, 18 Dec 2014 09:20:46 +0100, Snyder Pearson wrote:<br>
> I build this simple TLS upgrading proxy[2], which sits in front of a TLS<br>
> service and just accepts connections using any SSL/TLS version that Racket<br>
> supports and forwards the data to the service using the default TLS version<br>
> (why would I need this is a long story :)).<br>
><br>
> When stress testing this using boom [1], I see significant memory buildup.<br>
> This memory is not released when the test finishes.  It only gets reclaimed<br>
> when I kill the proxy process.  So I suspect there is some kind of memory<br>
> leak going on here.<br>
><br>
> In principle, the only values constructed on each iteration of the loop are<br>
> the SSL connection ports, which I'm closing when |pipe| exits.<br>
><br>
> Am I using copy-port wrong, or maybe it is itself leaking memory?<br>
><br>
> This is using Racket v6.1.1 on Ubuntu 14.10.<br>
><br>
> TIA!<br>
><br>
> [1] <a href="https://github.com/oxtoacart/boom" target="_blank">https://github.com/oxtoacart/boom</a><br>
><br>
> [2] Source:<br>
><br>
> #lang racket<br>
><br>
> (require openssl)<br>
><br>
> (define DEBUG #f)<br>
><br>
> (define (pipe in out)<br>
>   (thread (λ ()<br>
>              (if DEBUG<br>
>                (copy-port in (current-output-port) out)<br>
>                (copy-port in out))<br>
>              (close-output-port out)<br>
>              (close-input-port in))))<br>
><br>
> (define accept (if DEBUG ssl-accept/enable-break ssl-accept))<br>
> (define connect (if DEBUG ssl-connect/enable-break ssl-connect))<br>
><br>
> (define listener (ssl-listen 62445))<br>
> (ssl-load-private-key! listener "pk.pem")<br>
> (ssl-load-certificate-chain! listener "cert.pem")<br>
><br>
> (let loop ()<br>
>   (let-values (((from-src to-src) (accept listener)))<br>
>     (thread<br>
>       (λ ()<br>
>          (let-values (((from-dest to-dest)<br>
>                             (connect "localhost" 62444 'tls)))<br>
>            (pipe from-src to-dest)<br>
>            (pipe from-dest to-src)))))<br>
>   (loop))<br>
</div></div>> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div></div>