Re: [PATCH] Improve performance of NOTIFY over many databases (v2)
От | Martijn van Oosterhout |
---|---|
Тема | Re: [PATCH] Improve performance of NOTIFY over many databases (v2) |
Дата | |
Msg-id | CADWG95sC7Bg6c0Nk1fhu38oJKKEA=N86CZ4NFx=hbwYaAW5j+A@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [PATCH] Improve performance of NOTIFY over many databases (v2) (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: [PATCH] Improve performance of NOTIFY over many databases (v2)
|
Список | pgsql-hackers |
Hoi Tom, On Fri, 13 Sep 2019 at 22:04, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > This throws multiple compiler warnings for me: Fixed. > Also, I don't exactly believe this bit: [snip] > It seems unlikely that insertion would stop exactly at a page boundary, > but that seems to be what this is looking for. This is how asyncQueueAddEntries() works. Entries are never split over pages. If there is not enough room, then it advances to the beginning of the next page and returns. Hence here the offset is zero. I could set the global inside asyncQueueAddEntries() but that seems icky. Another alternative is to have asyncQueueAddEntries() return a boolean "moved to new page", but that's just a long-winded way of doing what it is now. > But, really ... do we need the backendTryAdvanceTail flag at all? > I'm dubious, because it seems like asyncQueueReadAllNotifications > would have already covered the case if we're listening. If we're > not listening, but we signalled some other listeners, it falls > to them to kick us if we're the slowest backend. If we're not the > slowest backend then doing asyncQueueAdvanceTail isn't useful. There are multiple issues here. asyncQueueReadAllNotifications() is going to be called by each listener simultaneously, so each listener is going to come to the same conclusion. On the other side, there is no guarantee we wake up anyone as a result of the NOTIFY, e.g. if there are no listeners in the current database. To be sure you try to advance the tail, you have to trigger on the sending side. The global is there because at the point we are inserting entries we are still in a user transaction, potentially holding many table locks (the issue we were running into in the first place). By setting backendTryAdvanceTail we can move the work to ProcessCompletedNotifies() which is after the transaction has committed and the locks released. > I agree with getting rid of the asyncQueueAdvanceTail call in > asyncQueueUnregister; on reflection doing that there seems pretty unsafe, > because we're not necessarily in a transaction and hence anything that > could possibly error is a bad idea. However, it'd be good to add a > comment explaining that we're not doing that and why it's ok not to. Comment added. > I'm fairly unimpressed with the "kick a random slow backend" logic. > There can be no point in kicking any but the slowest backend, ie > one whose pointer is exactly the oldest. Since we're already computing > the min pointer in that loop, it would actually take *less* logic inside > the loop to remember the/a backend that had that pointer value, and then > decide afterwards whether it's slow enough to merit a kick. Adjusted this. I'm not sure it's actually clearer this way, but it is less work inside the loop. A small change is that now it won't signal anyone if this backend is the slowest, which more correct. Thanks for the feedback. Attached is version 3. Have a nice weekend, -- Martijn van Oosterhout <kleptog@gmail.com> http://svana.org/kleptog/
Вложения
В списке pgsql-hackers по дате отправления: