Re: Listen / Notify - what to do when the queue is full
От | Joachim Wieland |
---|---|
Тема | Re: Listen / Notify - what to do when the queue is full |
Дата | |
Msg-id | dc7b844e1002030134w1f851077q2fb78200e24f777a@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: Listen / Notify - what to do when the queue is full (Jeff Davis <pgsql@j-davis.com>) |
Ответы |
Re: Listen / Notify - what to do when the queue is full
|
Список | pgsql-hackers |
On Wed, Feb 3, 2010 at 2:05 AM, Jeff Davis <pgsql@j-davis.com> wrote: >> Thanks, very well spotted... Actually the same is true for LISTEN... I >> have reworked the patch to do the changes to listenChannels only in >> the post-commit functions. > > I'm worried that this creates the opposite problem: that a LISTEN > transaction might commit before a NOTIFY transaction, and yet miss the > notification. See the following comment and let me know if you agree... ! /* ! * Exec_ListenBeforeCommit --- subroutine for AtCommit_NotifyBeforeCommit ! * ! * Note that we do only set our pointer here and do not yet add the channel to ! * listenChannels. Since our transaction could still roll back we do this only ! * after commit. We know that our tail pointer won't move between here and ! * directly after commit, so we won't miss a notification. ! */ However this introduces a new problem when an initial LISTEN aborts: Then we are not listening to anything but for other backends it looks like we were. This is tracked by the boolean variable backendExecutesInitialListen and gets cleaned up in AtAbort_Notify(). > It seems safest to me to add a backend (LISTEN) to the list before > commit, and remove a backend (UNLISTEN) after commit. That way we are > sure to only receive spurious notifications, and can't miss any. If a LISTEN aborted we would not only receive a few spurious notifications from it but would receive notifications on this channel forever even though we have never executed LISTEN on it successfully. Joachim
В списке pgsql-hackers по дате отправления: