Index: src/backend/access/gin/ginxlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/gin/ginxlog.c,v
retrieving revision 1.6
diff -c -r1.6 ginxlog.c
*** src/backend/access/gin/ginxlog.c	5 Jan 2007 22:19:21 -0000	1.6
--- src/backend/access/gin/ginxlog.c	1 Jun 2007 16:22:42 -0000
***************
*** 26,37 ****
  	BlockNumber leftBlkno;
  	BlockNumber rightBlkno;
  	BlockNumber rootBlkno;
  } ginIncompleteSplit;
  
  static List *incomplete_splits;
  
  static void
! pushIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber rightBlkno, BlockNumber rootBlkno)
  {
  	ginIncompleteSplit *split;
  
--- 26,41 ----
  	BlockNumber leftBlkno;
  	BlockNumber rightBlkno;
  	BlockNumber rootBlkno;
+ 	XLogRecPtr	lsn;
  } ginIncompleteSplit;
  
  static List *incomplete_splits;
  
+ static void gin_dump_incomplete_splits(void);
+ 
  static void
! pushIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, 
! 					BlockNumber rightBlkno, BlockNumber rootBlkno, XLogRecPtr lsn)
  {
  	ginIncompleteSplit *split;
  
***************
*** 43,48 ****
--- 47,53 ----
  	split->leftBlkno = leftBlkno;
  	split->rightBlkno = rightBlkno;
  	split->rootBlkno = rootBlkno;
+ 	split->lsn = lsn;
  
  	incomplete_splits = lappend(incomplete_splits, split);
  
***************
*** 53,58 ****
--- 58,64 ----
  forgetIncompleteSplit(RelFileNode node, BlockNumber leftBlkno, BlockNumber updateBlkno)
  {
  	ListCell   *l;
+ 	bool		found = false;
  
  	foreach(l, incomplete_splits)
  	{
***************
*** 61,69 ****
--- 67,83 ----
  		if (RelFileNodeEquals(node, split->node) && leftBlkno == split->leftBlkno && updateBlkno == split->rightBlkno)
  		{
  			incomplete_splits = list_delete_ptr(incomplete_splits, split);
+ 			found = true;
  			break;
  		}
  	}
+ 
+ 	if (!found)
+ 	{
+ 		gin_dump_incomplete_splits();
+ 		elog(ERROR, "failed to identify corresponding split record for %u/%u/%u",
+ 				 node.relNode, leftBlkno, updateBlkno);
+ 	}
  }
  
  static void
***************
*** 324,330 ****
  		UnlockReleaseBuffer(rootBuf);
  	}
  	else
! 		pushIncompleteSplit(data->node, data->lblkno, data->rblkno, data->rootBlkno);
  
  	UnlockReleaseBuffer(rbuffer);
  	UnlockReleaseBuffer(lbuffer);
--- 338,344 ----
  		UnlockReleaseBuffer(rootBuf);
  	}
  	else
! 		pushIncompleteSplit(data->node, data->lblkno, data->rblkno, data->rootBlkno, lsn);
  
  	UnlockReleaseBuffer(rbuffer);
  	UnlockReleaseBuffer(lbuffer);
***************
*** 600,605 ****
--- 614,637 ----
  gin_safe_restartpoint(void)
  {
  	if (incomplete_splits)
+ 	{
+ 		gin_dump_incomplete_splits();
  		return false;
+ 	}
  	return true;
  }
+ 
+ static void
+ gin_dump_incomplete_splits(void)
+ {
+ 	ListCell   *l;
+ 	int			nsplits = list_length(incomplete_splits);
+ 
+ 	elog(LOG,"GIN incomplete splits=%d", nsplits);
+ 	foreach(l, incomplete_splits)
+ 	{
+ 		ginIncompleteSplit *split = (ginIncompleteSplit *) lfirst(l);
+ 		elog(LOG,"GIN incomplete split root:%u l:%u r:%u at redo %X/%X", 
+ 			split->rootBlkno, split->leftBlkno, split->rightBlkno, split->lsn.xlogid, split->lsn.xrecoff);
+ 	}
+ }
