"Alexey Zayats" <alexey.zayats@gmail.com> writes:
> I've got next backtrace from core file:
> --------------------------
> Program received signal SIGPIPE, Broken pipe.
> [Switching to Thread 46912549615488 (LWP 28743)]
> 0x00002aaaad07ae32 in __write_nocancel () from /lib64/tls/libpthread.so.0
> (gdb) bt
> #0 Â 0x00002aaaad07ae32 in __write_nocancel () from
> /lib64/tls/libpthread.so.0
> #1 Â 0x00002aaaad9e2187 in BIO_sock_should_retry ()
> from /usr/lib64/libcrypto.so.0.9.7
> #2 Â 0x00002aaaad9e0751 in BIO_write () from /usr/lib64/libcrypto.so.0.9.7
> #3 Â 0x00002aaaad82b8a4 in ssl3_change_cipher_state ()
> from /usr/lib64/libssl.so.0.9.7
> #4 Â 0x00002aaaad82b9a2 in ssl3_dispatch_alert ()
> from /usr/lib64/libssl.so.0.9.7
> #5 Â 0x00002aaaad82a084 in ssl3_shutdown () from /usr/lib64/libssl.so.0.9.7
> #6 Â 0x00002aaaaaec4095 in close_SSL () from /usr/local/lib/libpq.so.4
> #7 Â 0x00002aaaaaebd408 in pqReadData () from /usr/local/lib/libpq.so.4
I would argue that this is an OpenSSL bug: it should not be trying to
write on a connection that it knows perfectly well is already dead.
(It should know that, anyway, because the only way that pqReadData would
be trying to close the connection is that it got an error indication
from OpenSSL.)
Possibly we could work around the problem by disabling SIGPIPE during
connection close, but I don't really see why we should have to do that.
> Before any queries send, i'm using isOpen method that looks like:
> --
> bool QPSQLDriver::isOpen() const
> {
> Â Â Â Â Â Â Â Â return PQstatus(d->connection) == CONNECTION_OK;
> }
That's pretty much a waste of time, because all it tells you is whether
the connection was good the last time a query was done. It is *not*
intended as an active "ping".
regards, tom lane