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

Reply via email to