Re: Assertion failure in REL9_5_STABLE
| От | Alvaro Herrera |
|---|---|
| Тема | Re: Assertion failure in REL9_5_STABLE |
| Дата | |
| Msg-id | 20160810210129.GA627089@alvherre.pgsql обсуждение исходный текст |
| Ответ на | Re: Assertion failure in REL9_5_STABLE (Marko Tiikkaja <marko@joh.to>) |
| Ответы |
Re: Assertion failure in REL9_5_STABLE
Re: Assertion failure in REL9_5_STABLE |
| Список | pgsql-hackers |
Marko Tiikkaja wrote:
> On 2016-08-10 19:28, Alvaro Herrera wrote:
> >Umm. AFAICS HeapTupleSatisfiesUpdate() only returns SelfUpdated after
> >already calling HeapTupleHeaderGetCmax() (which obviously hasn't caught
> >the same assertion). Something is odd there ...
>
> HeapTupleSatisfiesUpdate() returns HeapTupleBeingUpdated in this case.
> HeapTupleSelfUpdated comes from here (line 4749):
>
> /* if there are updates, follow the update chain */
> if (follow_updates && !HEAP_XMAX_IS_LOCKED_ONLY(infomask))
> {
> HTSU_Result res;
> res = heap_lock_updated_tuple(relation, tuple, &t_ctid,
> GetCurrentTransactionId(),
> mode);
> if (res != HeapTupleMayBeUpdated)
> {
> result = res;
> /* recovery code expects to have buffer lock held */
> LockBuffer(*buffer, BUFFER_LOCK_EXCLUSIVE);
> goto failed;
> }
> }
Oh, I see ... so there's an update chain, and you're updating a earlier
tuple. But the later tuple has a multixact and one of the members is
the current transaction.
I wonder how can you lock a tuple that's not the latest, where that
update chain was produced by your own transaction. I suppose this is
because of plpgsql use of cursors.
--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
В списке pgsql-hackers по дате отправления: