On Thu, 2007-09-06 at 21:47 +0100, Simon Riggs wrote:
> On Thu, 2007-09-06 at 15:55 -0400, Tom Lane wrote:

> > This would have been painful to fix in 8.2 but it seems relatively
> > trivial in HEAD --- we just need another filter option in
> > GetCurrentVirtualXIDs.

Patch enclosed. Tested manually on same/different databases.

No docs changed, nor test cases added.

-- 
  Simon Riggs
  2ndQuadrant  http://www.2ndQuadrant.com
Index: src/backend/commands/indexcmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/indexcmds.c,v
retrieving revision 1.163
diff -c -r1.163 indexcmds.c
*** src/backend/commands/indexcmds.c	5 Sep 2007 18:10:47 -0000	1.163
--- src/backend/commands/indexcmds.c	6 Sep 2007 21:47:21 -0000
***************
*** 538,544 ****
  	 * missing older tuples.  Also, GetCurrentVirtualXIDs never reports our
  	 * own vxid, so we need not check for that.
  	 */
! 	old_snapshots = GetCurrentVirtualXIDs(ActiveSnapshot->xmax);
  
  	while (VirtualTransactionIdIsValid(*old_snapshots))
  	{
--- 538,544 ----
  	 * missing older tuples.  Also, GetCurrentVirtualXIDs never reports our
  	 * own vxid, so we need not check for that.
  	 */
! 	old_snapshots = GetCurrentVirtualXIDs(ActiveSnapshot->xmax, false);
  
  	while (VirtualTransactionIdIsValid(*old_snapshots))
  	{
Index: src/backend/storage/ipc/procarray.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/storage/ipc/procarray.c,v
retrieving revision 1.30
diff -c -r1.30 procarray.c
*** src/backend/storage/ipc/procarray.c	5 Sep 2007 21:11:19 -0000	1.30
--- src/backend/storage/ipc/procarray.c	6 Sep 2007 21:47:22 -0000
***************
*** 892,900 ****
   *
   * If limitXmin is not InvalidTransactionId, we skip any backends
   * with xmin >= limitXmin.  Also, our own process is always skipped.
   */
  VirtualTransactionId *
! GetCurrentVirtualXIDs(TransactionId limitXmin)
  {
  	VirtualTransactionId *vxids;
  	ProcArrayStruct *arrayP = procArray;
--- 892,901 ----
   *
   * If limitXmin is not InvalidTransactionId, we skip any backends
   * with xmin >= limitXmin.  Also, our own process is always skipped.
+  * Optionally, we can skip processes attached to different databases.
   */
  VirtualTransactionId *
! GetCurrentVirtualXIDs(TransactionId limitXmin, bool allDbs)
  {
  	VirtualTransactionId *vxids;
  	ProcArrayStruct *arrayP = procArray;
***************
*** 916,921 ****
--- 917,925 ----
  		if (proc == MyProc)
  			continue;
  
+ 		if (!allDbs && proc->databaseId != MyProc->databaseId)
+ 			continue;
+ 
  		/*
  		 * Note that InvalidTransactionId precedes all other XIDs, so a
  		 * proc that hasn't set xmin yet will always be included.
Index: src/include/storage/procarray.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/storage/procarray.h,v
retrieving revision 1.15
diff -c -r1.15 procarray.h
*** src/include/storage/procarray.h	5 Sep 2007 18:10:48 -0000	1.15
--- src/include/storage/procarray.h	6 Sep 2007 21:47:24 -0000
***************
*** 33,39 ****
  extern int	BackendXidGetPid(TransactionId xid);
  extern bool IsBackendPid(int pid);
  
! extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin);
  extern int	CountActiveBackends(void);
  extern int	CountDBBackends(Oid databaseid);
  extern int	CountUserBackends(Oid roleid);
--- 33,39 ----
  extern int	BackendXidGetPid(TransactionId xid);
  extern bool IsBackendPid(int pid);
  
! extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin, bool allDbs);
  extern int	CountActiveBackends(void);
  extern int	CountDBBackends(Oid databaseid);
  extern int	CountUserBackends(Oid roleid);
---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to