I've got a bit of a problem. I added a fast SIGALRM handler in my project to do various maintenance and this broke PQconnectStart().
Oct 23 21:56:36 james BlueList: connectDBStart() -- connect() failed: Interrupted system call ^IIs the postmaster running (with -i) at 'archives.blue-labs.org' ^Iand accepting connections on TCP/IP port 5432? PQstatus() returns CONNECTION_BAD, how can I reenter the connection cycle or delay, more like, how do I differentiate between an actual failure to connect and an interruption by signal? My alarm timer happens much too frequently for this code to make a connection and unfortunately I can't disable the alarm because it's used for bean counting and other maintenance. Thanks, David Code snippet: ... /* * play some tricks now, use async connect mode to find if the server * is alive. once we've figured that out, disconnect and immediately * reconnect in blocking mode. this mitigates the annoying hangs from * using PQconnectdb which has no support for a timeout. */ conn=PQconnectStart(cstr); if(!conn) { dlog(_LOG_debug, "SQL conn is NULL, aborting"); return NULL; } do { c++; pgstat=PQstatus(conn); switch (pgstat) { case CONNECTION_STARTED: dlog(_LOG_debug, "Connecting to SQL server..."); break; case CONNECTION_MADE: case CONNECTION_OK: dlog(_LOG_debug, "Connected to SQL server in asynchronous mode..."); break; case CONNECTION_BAD: dlog(_LOG_debug, PQerrorMessage(conn)); if(conn) PQfinish(conn); dlog(_LOG_warning, "failed to connect to server"); return NULL; break; default: dlog(_LOG_debug, "pg conx state = %i", pgstat); break; } if(pgstat==CONNECTION_MADE||CONNECTION_OK) break; if(c>15) { if(conn) PQfinish(conn); dlog(_LOG_warning, "failed to connect to server, timed out"); return NULL; } req.tv_sec=1; req.tv_nsec=0; sleep(&req); } while(1); /* * close it and reopen it in normal blocking mode */ PQfinish(conn); conn=PQconnectdb(cstr); ... ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster