Thread: active queries

active queries

From
Miklosi Attila
Date:
Hi!

Our company has a long last problem by using libpq in multi-threaded
programs. The libpq usually closes the programs without any error
message or rarely giving the 'Invalid frontend message type 87' error.
When asked you about this error message you gave the reply below. In the
reply there is only one thing which is not clear... What does an
'active' query mean? Or how can we detect active queries on a PGconn?
We have tried PQcancel() and PQreset() functions too, but they didn't
help solving the problem.
Our programs retrieve every result (PQgetResult() and PQclear()
functions) that is pending on the server before reusing a PGconn.

Thank you in advance
Attila Miklosi

P.S.: this is a copy of your reply to 'invalid frontend message type 87'
error message

>"Invalid frontend message" means the server got a message with an
>unexpected first byte, which usually means the server and libpq got
>out of sync about where the message boundaries are.  It's been quite
>a long time since we've seen an actual bug of that sort, though.
>The cases that I've heard of recently involve multiple threads in an
>application trying to use the same PGconn without any interlocking.
>You can't have multiple queries active on a single connection, but
>libpq itself doesn't contain any locking to prevent multiple threads
>from trying to use the PGconn at once.
>
>If you're getting this with a single-threaded client, please submit
>a test case to pgsql-bugs.
>
>                       regards, tom lane



Re: active queries

From
Martijn van Oosterhout
Date:
On Tue, May 27, 2008 at 11:35:49AM +0200, Miklosi Attila wrote:
> Hi!
>
> Our company has a long last problem by using libpq in multi-threaded
> programs. The libpq usually closes the programs without any error
> message or rarely giving the 'Invalid frontend message type 87' error.
> When asked you about this error message you gave the reply below. In the
> reply there is only one thing which is not clear... What does an
> 'active' query mean? Or how can we detect active queries on a PGconn?
> We have tried PQcancel() and PQreset() functions too, but they didn't
> help solving the problem.
> Our programs retrieve every result (PQgetResult() and PQclear()
> functions) that is pending on the server before reusing a PGconn.

The basic rule is: libpq is not reentrant. So you can't have two calls
referring to the same PGConn going at the same time. If you really are
serialising properly then it shouldn't be a problem. Are you doing
things like sending multiple queries in a single PQexec? Or something
else where the server might still be doing stuff?

Have a niec day,
--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> Please line up in a tree and maintain the heap invariant while
> boarding. Thank you for flying nlogn airlines.

Attachment