Re: [HACKERS] Anyone working on asynchronous NOTIFY reception? - Mailing list pgsql-hackers

From Massimo Dal Zotto
Subject Re: [HACKERS] Anyone working on asynchronous NOTIFY reception?
Date
Msg-id 199804171025.MAA01131@pennac.cs.unitn.it
Whole thread Raw
In response to Re: [HACKERS] Anyone working on asynchronous NOTIFY reception?  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
>
> Mattias Kregert <matti@algonet.se> writes:
> > Async communication between backend and frontend would be really nice.
> > I use Tcl a lot and I really miss this. It would be wonderful to have
> > libpgtcl do callbacks, so that info on-screen could be automagically
> > updated whenever something changes.
>
> Yes, if anything were to be done along this line it'd also make sense
> to revise libpgtcl.  I think it ought to work more like this:
>   (a) the idle loop is invoked while waiting for a query response
>       (so that a pg_exec statement behaves sort of like "tkwait");
>   (b) a "listen" command is sent via a new pg_listen statement that
>       specifies a callback command string.  Subsequent notify responses
>       can occur whenever a callback is possible.
> I suppose (a) had better be an option to pg_exec statements so that
> we don't break existing Tcl code...
>
>             regards, tom lane

There is already some support for async notify in libpgtcl, it was and old
patch of mine. It does exactly what you are thinking of, except for the
idle loop stuff. You can setup callbacks for specific relations and then
periodically issue a command which checks for pending notifications and does
the callbacks if any is found. Note also that you can listen on any name,
not just for existing relations.

I have a Tcl/Tk application (used concurrently by more than 30 users)
which uses heavily async notifications to notify clients when some events
occur. It uses a timer inside the application which polls the server every
n seconds (actually 1 second) for pending notifies.
It works well but it is a really big bottleneck for the application and I
had to spend a lot of time to debug and patch the code in async.c.
It seems that nobody beside me has ever used this feature because I didn't
see any bug report on the mailing lists (and there were many).

The biggest problem is that if you have many clients listening on the same
thing they are signaled at the same time and all of them try to access the
pg_listener table for write. The result is that you have a lot of waits on
the table and sometimes also deadlocks if you don't do things carefully.

From the Tcl side, a better solution would be to define a tcl event handler,
like the standard Tcl filehandler, which would be invoked automatically by
the Tk event loop or by tkwait if using pure Tcl.

I have also some new patches which try to reduce the notify overhead by
avoiding unnecessary unlocks of the table. If you are interested I can
post them.

--
Massimo Dal Zotto

+----------------------------------------------------------------------+
|  Massimo Dal Zotto                e-mail:  dz@cs.unitn.it            |
|  Via Marconi, 141                 phone:  ++39-461-534251            |
|  38057 Pergine Valsugana (TN)     www:  http://www.cs.unitn.it/~dz/  |
|  Italy                            pgp:  finger dz@tango.cs.unitn.it  |
+----------------------------------------------------------------------+


pgsql-hackers by date:

Previous
From: Michael Meskes
Date:
Subject: Re: [HACKERS] [Fwd: In the Soup]
Next
From: "Jose' Soares Da Silva"
Date:
Subject: drop table inside transactions