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

Reply via email to