> The following listening worker thread behaves as expected if I insert/delete 
> rows into/from table "t1" in psql prompt.
> 
> My trouble is when the SQL execution worker thread inserts/ deletes rows 
> into/from table "t1", the listening worker thread then goes crazy: 
> PQnotifies() always returns NULL which pushes the listening thread to grab 
> all CPU power because select() returns immediately in every iteration. The 
> weird part is that select() says that there is something available but 
> PQnotifies() returns NULL.
> 
> ---------
> PGconn *c=/* Take one connection from connection pool */;
> PGresult *result=PQexec(c,"LISTEN NotifyMe");
> PQclear(result);
> fd_set InputMask;
> int sock=PQsocket(c);
> struct timeval TimeOut={1,200000};
> int SelectResult;
> PGnotify *notify;
> int terminated=0;
> while(!terminated){
>       FD_ZERO(&InputMask);
>       FD_SET((unsigned int)sock,&InputMask);
>       SelectResult=select(sock+1,&InputMask,NULL,NULL,&TimeOut);
>       if(SelectResult == SOCKET_ERROR){
>               puts("select() failed:");
>               break;
>       }
>       if(SelectResult == 0)
>               continue;
>       if(!FD_ISSET(sock,&InputMask))
>               continue;
>       PQconsumeInput(c);
>       while((notify=PQnotifies(c)) != NULL){ //here: unstable!
>               if(stricmp(notify->relname,"NotifyMe") == 0)
>                       puts("Got notification");
>               PQfreemem(notify);
>       }
> }
> PQfinish(c);

Please ignore this question!

My connection pool implementation seems to have flaw. Somehow and somewhere the 
connection acquired by a thread is robbed by other threads. The PGconn  sending 
"LISTEN NotifyMe" becomes different from the PGconn passed to PQsocket(), 
PQconsumeInput(), and/or PQnotifies().

Please also pardon me for asking inappropriate questions like this one. As far 
as I can recall, every issue I encountered before always finally proved that 
PostgreSQL is flawless.

Best Regards,
CN


-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to