Re: Segfault on exclusion constraint violation

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: Segfault on exclusion constraint violation
Дата
Msg-id 54CF8B41.7020006@vmware.com
обсуждение исходный текст
Ответ на Segfault on exclusion constraint violation  (Heikki Linnakangas <hlinnakangas@vmware.com>)
Список pgsql-bugs
On 02/02/2015 03:50 PM, Heikki Linnakangas wrote:
> This only happens with assertions enabled. The culprit is commit
> f88d4cfc9d417dac2ee41a8f5e593898e56fd2bd, which added the 'ctid'
> argument to XactLockTableWait. check_exclusion_constraint calls
> index_endscan() just before XactLockTableWait, but that free's the
> memory the ctid points to.
>
> The fix for this particular instance is trivial: copy the ctid to a
> local variable before calling index_endscan. However, looking at the
> other XactLockTableWait() and MultiXactIdWait() calls, there are more
> questionable pointers being passed. Most point to heap tuples on disk
> pages, after releasing the lock on the page, although not the pin. The
> one in EvalPlanQualFetch releases the pin too.
>
> I'll write up a patch to change those call sites to use local variables.
> Hopefully it's trivial enough to still include in 9.4.1, although time
> is really running out..

I'll commit the attached fix shortly, so please shout quickly if you see
a problem with this.

Aside from the potential for segfaults with assertions, I think the
calls passed incorrect ctid anyway. For example:

> --- a/src/backend/executor/execUtils.c
> +++ b/src/backend/executor/execUtils.c
> @@ -1307,7 +1307,7 @@ retry:
>                 if (TransactionIdIsValid(xwait))
>                 {
>                         index_endscan(index_scan);
> -                       XactLockTableWait(xwait, heap, &tup->t_data->t_ctid,
> +                       XactLockTableWait(xwait, heap, &tup->t_self,
>                                                           XLTW_RecheckExclusionConstr);
>                         goto retry;
>                 }

We don't really want to pass the heap tuple's ctid field. If the tuple
was updated (again) in the same transaction, the one that's still
in-progress, that points to the *next* tuple in the chain, but the error
message says "while checking exclusion constraint on tuple (%u,%u) in
relation \"%s\"". We should be passing the TID of the tuple itself, not
the ctid value in the tuple's header. The attached patch fixes that too.

- Heikki

Вложения

В списке pgsql-bugs по дате отправления:

Предыдущее
От: hans@matfyz.cz
Дата:
Сообщение: BUG #12730: pg_dump produces trailing spaces
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Segfault on exclusion constraint violation