Tom Lane wrote:
Heikki Linnakangas <[EMAIL PROTECTED]> writes:
Tom Lane wrote:
Heikki Linnakangas <[EMAIL PROTECTED]> writes:
A much simpler approach would be to try to acquire the vacuum lock, and compact the page the usual way, and fall back to a cold update if we can't get the lock immediately.
Seems like that could work.

I just realized that there's a big problem with that. The process doing the update surely holds a pin on the buffer itself. Needs more thought..

So does VACUUM when it's trying to lock a page, no?  In any case we
could surely make an extra parameter to LockBufferForCleanup if it
really needs to distinguish the cases.

The problem is that if we trigger the page cleanup from heap_update, as I was planning to do, the executor has already pinned the page and holds a reference to the old tuple on the page. We can't shuffle the data on the page, because the pointer to the old tuple would become invalid.

We could do still it from somewhere else, though. For example, in heap_fetch, the first time a page is touched. Or in bgwriter.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to