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