Re: missing LockBuffer(buffer, BUFFER_LOCK_SHARE) in trigger.c GetTupleForTrigger?

From: Pavan Deolasee <pavan(dot)deolasee(at)gmail(dot)com>
To: Andres Freund <andres(at)2ndquadrant(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: missing LockBuffer(buffer, BUFFER_LOCK_SHARE) in trigger.c GetTupleForTrigger?
Date: 2012-11-30 12:39:49
Message-ID: CABOikdM-9MrJs207Z8dnibss_VujMAGLYoteU0rtS-gPKmtV_g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Nov 30, 2012 at 5:28 PM, Andres Freund <andres(at)2ndquadrant(dot)com>wrote:

>
> > >
> > That seems to be safe to me. Anything thats been read above can't really
> > change. The tuple is already locked, so a concurrent update/delete has to
> > wait on us. We have a pin on the buffer, so VACUUM or HOT-prune can't
> > happen either. I can't see any other operation that can really change
> those
> > fields.
>
> We only get the pin right there, I don't see any preexisting pin. Which
> means we might have just opened a page thats in the process of being
> pruned/vacuumed by another backend.
>

Hmm. Yeah, you're right. That is a possible risky scenario. Even though
cleanup lock waits for all pins to go away, it will work only if every
reader takes at least a SHARE lock unless it was continuously holding a pin
on a buffer (in which case its OK to drop lock and read a tuple body
without reacquiring it again). Otherwise, as you rightly pointed out, we
could actually be reading a page which being actively cleaned up and tuples
are being moved around.

> I think a concurrent heap_(insert|update)/PageAddItem might actually be
> already dangerous because it might move line pointers around
>
>
I don't we move the line pointers around ever because the indexes will be
pointing to them. But the vacuum/prune is dangerous enough to require a
SHARE lock here in any case.

Thanks,
Pavan

--
Pavan Deolasee
http://www.linkedin.com/in/pavandeolasee

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dimitri Fontaine 2012-11-30 12:40:35 Re: Review: Extra Daemons / bgworker
Previous Message Alvaro Herrera 2012-11-30 12:33:10 Re: Re: missing LockBuffer(buffer, BUFFER_LOCK_SHARE) in trigger.c GetTupleForTrigger?