Re: Doubts about EvalPlanQual

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: Doubts about EvalPlanQual
Дата
Msg-id 499D18DA.1070100@enterprisedb.com
обсуждение исходный текст
Ответ на Doubts about EvalPlanQual  ("Jacky Leng" <lengjianquan@163.com>)
Список pgsql-hackers
Jacky Leng wrote:
> When I read function "EvalPlanQual", I found the following code:
> 
>   if (heap_fetch(relation, &SnapshotDirty, &tuple, &buffer, true, NULL))
>   {
>    /*
>     * If xmin isn't what we're expecting, the slot must have been
>     * recycled and reused for an unrelated tuple. This implies that
>     * the latest version of the row was deleted, so we need do
>     * nothing.  (Should be safe to examine xmin without getting
>     * buffer's content lock, since xmin never changes in an existing
>     * tuple.)
>     */
>    if (!TransactionIdEquals(HeapTupleHeaderGetXmin(tuple.t_data),
>           priorXmax))
>    {
>     ReleaseBuffer(buffer);
>     return NULL;
>    }
> 
> AFAICS, when Vacuum decides to reclaim any version V of a tuple T, there 
> must be none concurrent transactions that are accessing or will access any 
> versions before V, because HeapTupleSatisfiesVacuum ensures this.
> 
> If I'm right, then my doubt is: how can the branch "if 
> (!TransactionIdEquals(HeapTupleHeaderGetXmin(tuple.t_data), priorXmax))" 
> happen? Is this a dead branch?
> 
> If not, can anyone give an example to explain how does this happen?

Tuples with an aborted xmin can be vacuumed right away. When we're 
following the update chain in EvalPlanQual, it's possible that the 
updater has aborted, the updated dead tuple is vacuumed away, and the 
slot is reused for another unrelated tuple.

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


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

Предыдущее
От: "Jacky Leng"
Дата:
Сообщение: Doubts about EvalPlanQual
Следующее
От: "Jacky Leng"
Дата:
Сообщение: Re: Doubts about EvalPlanQual