Re: Trouble with PQnotifies()

From: seiliki(at)so-net(dot)net(dot)tw
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Trouble with PQnotifies()
Date: 2012-12-14 10:07:43
Message-ID: 20121214100751.4FA00F4883E@m5.so-net.net.tw
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

> 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

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Mark Morgan Lloyd 2012-12-14 10:39:32 Re: Trouble with PQnotifies()
Previous Message ac@hsk.hk 2012-12-14 06:56:09 PostgreSQL contrib 9.2.x