Re: Re: [COMMITTERS] pgsql: Write a WAL record whenever we perform an operation without
От | Fujii Masao |
---|---|
Тема | Re: Re: [COMMITTERS] pgsql: Write a WAL record whenever we perform an operation without |
Дата | |
Msg-id | 3f0b79eb1002010158m5ce05291i7bd619b5388923b4@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [COMMITTERS] pgsql: Write a WAL record whenever we perform an operation without (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>) |
Ответы |
Re: Re: [COMMITTERS] pgsql: Write a WAL record whenever we
perform an operation without
Re: Re: [COMMITTERS] pgsql: Write a WAL record whenever we perform an operation without |
Список | pgsql-hackers |
On Mon, Feb 1, 2010 at 6:33 PM, Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote: > Hmm. The "unlogged" record is written here: > > ... > void > heap_sync(Relation rel) > { > char reason[NAMEDATALEN + 30]; > > /* temp tables never need fsync */ > if (rel->rd_istemp) > return; > > snprintf(reason, sizeof(reason), "heap inserts on \"%s\"", > RelationGetRelationName(rel)); > XLogReportUnloggedStatement(reason); > ... > > > So it clearly shouldn't be written for temp relations. Apparently the > rd_istemp flag not set correctly after CLUSTER / VACUUM FULL. The cause of the problem seems to be the new heap created by rebuild_relation() and copy_heap_data(), i.e., new VACUUM FULL. Since it's not a temporary heap, its rd_istemp is off. OTOH it needs to be synced after physical copy from old heap. So XLogReportUnloggedStatement() is called in heap_sync(). The easy fix is to change the code as below. if (XLogIsNeeded()) { snprintf(reason, sizeof(reason), "heap inserts on \"%s\"", RelationGetRelationName(rel)); XLogReportUnloggedStatement(reason); } But I'm not sure this fix is right, so I need to investigate the code more. Regards, -- Fujii Masao NIPPON TELEGRAPH AND TELEPHONE CORPORATION NTT Open Source Software Center
В списке pgsql-hackers по дате отправления: