On 10/24/07, Pavan Deolasee <[EMAIL PROTECTED]> wrote: > > > > I am looking at it. We must not call SetBufferCommitInfoNeedsSave unless > we make any state changes to the page. > > >
The attached patch should fix this. We mark the buffer dirty only if there is any state change in the page header. Thanks, Pavan -- Pavan Deolasee EnterpriseDB http://www.enterprisedb.com
Index: src/backend/access/heap/pruneheap.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/access/heap/pruneheap.c,v retrieving revision 1.2 diff -c -r1.2 pruneheap.c *** src/backend/access/heap/pruneheap.c 21 Sep 2007 21:25:42 -0000 1.2 --- src/backend/access/heap/pruneheap.c 24 Oct 2007 09:32:21 -0000 *************** *** 146,162 **** int nredirected = 0; int ndead = 0; int nunused = 0; START_CRIT_SECTION(); /* ! * Mark the page as clear of prunable tuples. If we find a tuple which ! * may soon become prunable, we shall set the hint again. Also clear ! * the "page is full" flag, since there's no point in repeating the ! * prune/defrag process until something else happens to the page. */ PageClearPrunable(page); ! PageClearFull(page); /* Scan the page */ maxoff = PageGetMaxOffsetNumber(page); --- 146,173 ---- int nredirected = 0; int ndead = 0; int nunused = 0; + TransactionId save_prune_xid; START_CRIT_SECTION(); /* ! * Save the current pd_prune_xid and mark the page as clear of prunable ! * tuples. If we find a tuple which may soon become prunable, we shall set ! * the hint again. */ + save_prune_xid = ((PageHeader) page)->pd_prune_xid; PageClearPrunable(page); ! ! /* ! * Also clear the "page is full" flag if it is set, since there's no point ! * in repeating the prune/defrag process until something else happens to the ! * page. ! */ ! if (PageIsFull(page)) ! { ! PageClearFull(page); ! SetBufferCommitInfoNeedsSave(buffer); ! } /* Scan the page */ maxoff = PageGetMaxOffsetNumber(page); *************** *** 209,218 **** else { /* ! * If we didn't prune anything, we have nonetheless updated the * pd_prune_xid field; treat this as a non-WAL-logged hint. */ ! SetBufferCommitInfoNeedsSave(buffer); } END_CRIT_SECTION(); --- 220,230 ---- else { /* ! * If we didn't prune anything, but have updated the * pd_prune_xid field; treat this as a non-WAL-logged hint. */ ! if (((PageHeader) page)->pd_prune_xid != save_prune_xid) ! SetBufferCommitInfoNeedsSave(buffer); } END_CRIT_SECTION();
---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq