RE: [HACKERS] SELECT FOR UPDATE leaks relation refcounts

Поиск
Список
Период
Сортировка
От Hiroshi Inoue
Тема RE: [HACKERS] SELECT FOR UPDATE leaks relation refcounts
Дата
Msg-id 000601bf6ddb$90b4d9e0$2801007e@tpf.co.jp
обсуждение исходный текст
Ответ на SELECT FOR UPDATE leaks relation refcounts  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: [HACKERS] SELECT FOR UPDATE leaks relation refcounts  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
> -----Original Message-----
> From: owner-pgsql-hackers@postgreSQL.org
> [mailto:owner-pgsql-hackers@postgreSQL.org]On Behalf Of Tom Lane
> 
> Poking into Oliver's report of "RelationClearRelation: relation 21645
> modified while in use", I find that the culprit is the following
> code in execMain.c's InitPlan():
> 
>         foreach(l, parseTree->rowMark)
>         {
>             rm = lfirst(l);
>             relid = rt_fetch(rm->rti, rangeTable)->relid;
>             relation = heap_open(relid, RowShareLock);
>             if (!(rm->info & ROW_MARK_FOR_UPDATE))
>                 continue;
>             erm = (execRowMark *) palloc(sizeof(execRowMark));
>             erm->relation = relation;
>             erm->rti = rm->rti;
>             sprintf(erm->resname, "ctid%u", rm->rti);
>             estate->es_rowMark = lappend(estate->es_rowMark, erm);
>         }
> 
> That heap_open() call has no corresponding heap_close() anywhere,
> so every SELECT FOR UPDATE leaves the relation's refcount one higher
> than it was.  This didn't use to be a huge problem, other than that the
> rel would be permanently locked into the backend's relcache.  (I think
> an attempt to DROP the table later in the session would have caused
> trouble, though.)  However, I just committed changes in the relcache
> that assume that zero refcount is trustworthy, and it's those changes
> that are spitting up.
> 
> It's easy enough to add code to EndPlan that goes through the
> estate->es_rowMark list to close the rels that had ROW_MARK_FOR_UPDATE
> set.  But if that bit wasn't set, the above code opens the rel and then
> forgets about it completely.  Is that a bug?  If not, I guess we need

Seems its a bug though I'm not sure.
Is there anything wrong with inserting heap_close(relation, NoLock)
immediately before 'continue;' ?

Regards.

Hiroshi Inoue
Inoue@tpf.co.jp


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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] Recent RI changes have broken something
Следующее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] SELECT FOR UPDATE leaks relation refcounts