On Tue, 2007-09-11 at 10:42 +0100, Simon Riggs wrote:

> 2. CountActiveBackends() searches the whole of the proc array, even
> though it could stop when it gets to commit_siblings. Stopping once the
> heuristic has been determined seems like the best thing to do. A small
> patch to implement this is attached.

 backend/access/transam/xact.c   |    2 !!
 backend/storage/ipc/procarray.c |   11 !!!!!!!!!!!
 include/storage/procarray.h     |    2 !!
 3 files changed, 15 modifications(!)

-- 
  Simon Riggs
  2ndQuadrant  http://www.2ndQuadrant.com
Index: src/backend/access/transam/xact.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xact.c,v
retrieving revision 1.250
diff -c -r1.250 xact.c
*** src/backend/access/transam/xact.c	8 Sep 2007 20:31:14 -0000	1.250
--- src/backend/access/transam/xact.c	11 Sep 2007 13:11:33 -0000
***************
*** 886,892 ****
  		 * active transactions.
  		 */
  		if (CommitDelay > 0 && enableFsync &&
! 			CountActiveBackends() >= CommitSiblings)
  			pg_usleep(CommitDelay);
  
  		XLogFlush(XactLastRecEnd);
--- 886,892 ----
  		 * active transactions.
  		 */
  		if (CommitDelay > 0 && enableFsync &&
! 			NumActiveBackendsIsAtLeast(CommitSiblings))
  			pg_usleep(CommitDelay);
  
  		XLogFlush(XactLastRecEnd);
Index: src/backend/storage/ipc/procarray.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/ipc/procarray.c,v
retrieving revision 1.33
diff -c -r1.33 procarray.c
*** src/backend/storage/ipc/procarray.c	8 Sep 2007 20:31:15 -0000	1.33
--- src/backend/storage/ipc/procarray.c	11 Sep 2007 13:11:35 -0000
***************
*** 1016,1030 ****
  
  
  /*
!  * CountActiveBackends --- count backends (other than myself) that are in
   *		active transactions.  This is used as a heuristic to decide if
   *		a pre-XLOG-flush delay is worthwhile during commit.
   *
   * Do not count backends that are blocked waiting for locks, since they are
   * not going to get to run until someone else commits.
   */
! int
! CountActiveBackends(void)
  {
  	ProcArrayStruct *arrayP = procArray;
  	int			count = 0;
--- 1016,1030 ----
  
  
  /*
!  * NumActiveBackendsIsAtLeast --- count backends (other than myself) that are in
   *		active transactions.  This is used as a heuristic to decide if
   *		a pre-XLOG-flush delay is worthwhile during commit.
   *
   * Do not count backends that are blocked waiting for locks, since they are
   * not going to get to run until someone else commits.
   */
! bool
! NumActiveBackendsIsAtLeast(int MinBackends)
  {
  	ProcArrayStruct *arrayP = procArray;
  	int			count = 0;
***************
*** 1047,1056 ****
  			continue;			/* do not count if no XID assigned */
  		if (proc->waitLock != NULL)
  			continue;			/* do not count if blocked on a lock */
! 		count++;
  	}
  
! 	return count;
  }
  
  /*
--- 1047,1057 ----
  			continue;			/* do not count if no XID assigned */
  		if (proc->waitLock != NULL)
  			continue;			/* do not count if blocked on a lock */
! 		if (++count >= MinBackends)
! 			return true;
  	}
  
! 	return false;
  }
  
  /*
Index: src/include/storage/procarray.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/procarray.h,v
retrieving revision 1.17
diff -c -r1.17 procarray.h
*** src/include/storage/procarray.h	8 Sep 2007 20:31:15 -0000	1.17
--- src/include/storage/procarray.h	11 Sep 2007 13:11:38 -0000
***************
*** 38,44 ****
  
  extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin,
  												   bool allDbs);
! extern int	CountActiveBackends(void);
  extern int	CountDBBackends(Oid databaseid);
  extern int	CountUserBackends(Oid roleid);
  extern bool CheckOtherDBBackends(Oid databaseId);
--- 38,44 ----
  
  extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin,
  												   bool allDbs);
! extern bool	NumActiveBackendsIsAtLeast(int MinBackends);
  extern int	CountDBBackends(Oid databaseid);
  extern int	CountUserBackends(Oid roleid);
  extern bool CheckOtherDBBackends(Oid databaseId);
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to