> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general