<div dir="ltr">Thank you for taking a look.<div><br></div><div>For my scenario, your fix is great for me. It is a rare occurrence when this problem occurs, and the end result is that a user of my websites has to hit the refresh button once. </div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jun 12, 2014 at 7:02 PM, Ryan Culpepper <span dir="ltr"><<a href="mailto:ryanc@ccs.neu.edu" target="_blank">ryanc@ccs.neu.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 06/11/2014 11:40 AM, Curtis Dutton wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I ran into a problem while using virtual-connections with<br>
connection-pooling in my webserver.<br>
<br>
With a postgres database. If the database itself gets restarted after a<br>
connection is formed from the webserver, then I cannot re-establish a<br>
connection afterword.<br>
<br>
In production the database and webserver are on different hosts, but my<br>
development box those the same symptoms.<br>
<br>
<br>
So here is what I see....<br>
<br>
(require db)<br>
<br>
(define conn #f)<br>
<br>
(define (reset)<br>
   (set! conn (virtual-connection (connection-pool (λ ()<br>
                                                     (postgresql-connect<br>
#:server "localhost"<br>
#:user "postgres"<br>
#:password "postgres"<br>
#:database "test"))<br>
#:max-idle-connections 5))))<br>
<br>
(define (go)<br>
   (query conn "SELECT * FROM test"))<br>
<br>
(reset)<br>
<br>
(go)<br>
;get results<br>
<br>
;now restart my postgres server<br>
<br>
(go)<br>
. . tcp-write: error writing<br>
   system error: Unknown error; errno=10054<br>
<br>
;ok what now?<br>
(disconnect conn)<br>
(go)<br>
. . tcp-write: error writing<br>
   system error: Unknown error; errno=10054<br>
<br>
;now what<br>
(reset)<br>
(go)<br>
;I get my results again<br>
<br>
<br>
I think what I expect is that the connection would be renegotiated for<br>
me. Or maybe at least renegotiated if I run disconnect afterword. If<br>
that isn't the case, that is fine... How should I handle this case?<br>
</blockquote>
<br></div></div>
I've just pushed a partial fix for this issue. The main problem was that the internal client connection didn't realize that the server had disconnected after a fatal error.<br>
<br>
After the change, you will see an interaction like this instead:<br>
<br>
(go)<br>
;; => results<br>
;; Restart the server<br>
(go)<br>
;; => query: terminating connection due to administrator command<br>
;;      SQLSTATE: 57P01<br>
(go)<br>
;; => results<br>
<br>
That is, the virtual connection will raise a "fatal" error, but then when you use it again, it will create a new internal connection and work fine.<br>
<br>
(At least, that's what I see on postgresql 9.1.13; I was never able to reproduce the precise interaction you included in your email.)<br>
<br>
Unfortunately, getting rid of that error in the middle seems difficult. The problem is that the server takes the time to say goodbye. Since there's input pending, the internal connection is still considered connected, so the virtual connection commits to using that internal connection rather than creating a new one.<br>

<br>
Thanks for reporting this problem!<span class="HOEnZb"><font color="#888888"><br>
<br>
Ryan<br>
</font></span></blockquote></div><br></div>