Received: from localhost (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id 825AF47655B for ; Thu, 5 Sep 2002 08:44:35 -0400 (EDT) Received: from nereid.aersoft.ie (nereid.aersoft.ie [194.125.107.131]) by postgresql.org (Postfix) with ESMTP id 733524764E4 for ; Thu, 5 Sep 2002 08:44:34 -0400 (EDT) Received: from aersoft.com (saturn [192.168.0.7]) by nereid.aersoft.ie (Sun Internet Mail Server sims.4.0.2000.10.12.16.25.p8) with ESMTP id <0H1Y00JJ3U2DPG@nereid.aersoft.ie> for pgsql-interfaces@postgresql.org; Thu, 5 Sep 2002 13:44:37 +0100 (BST) Date: Thu, 05 Sep 2002 13:44:37 +0100 From: Joe Murphy Subject: libpq, threads and connection reset To: "pgsql-interfaces@postgresql.org" Message-id: <3D7751B5.CE431206@aersoft.com> MIME-version: 1.0 X-Mailer: Mozilla 4.79 [en] (X11; U; SunOS 5.6 sun4u) Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7BIT X-Accept-Language: en References: <20020828025202.C74E81D1943C8@bjapp2.163.net> X-Virus-Scanned: by AMaViS new-20020517 X-Archive-Number: 200209/41 X-Sequence-Number: 3102 I'm having some problems with a multi-threaded application using libpq: Some details: OS: Solaris 2.6 Postgres version 7.2.1 When my application starts up the main thread (1) connects using PQsetdbLogin() which is successful Another thread (5 for example) issues queries over this connection. My test is stopping postgres (KILL -INT) and testing if my application detects the backend failure and tries to re-connect. Thread 5 issues a PQexec and discovers the error upon which thread 5 tries to reconnect (after calling PQfinish) This reconnection HANGS, here is a stack trace: ee037438 poll (ed906e48, 1, ffffffff) ee04cc74 select (ed906e50, ed908ea8, ed908f28, ed908eac, ed908f2c, 4) + 280 ee69e010 pqWait (0, 1, 485e8, 1, 81010100, ee0882cc) + 1d8 ee695178 connectDBComplete (485e8, 0, ee0a3180, 0, efffebc0, ee086858) + f8 ee69484c PQsetdbLogin (45e28, ed9091a2, 0, 0, 45d68, 45e40) + 558 All access using the connection is serialized using a mutex. I've tried the same test but with everything running in thread 1 and it works OK. I've managed to spot some differences between the two tests: Multi Threaded test: The re-connect underlying call to connect returns -1 and sets errno to 146 (connection refused) Single Threaded test: The re-connect underlying call to connect returns -1 and errno = 0, so it thinks the connection is "in progress" and tries to complete the connection - but hangs on the select (poll) Any help or ideas greatly appreciated, Joe