Re: Problem with PITR Past Particular WAL File

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





Craig McElroy wrote:
Teodor:
Thanks for the followup. We will be upgrading this system to 8.2.5 in the next day or so and will test it on that anyways just to be sure it isn't related. Let me know if there is anything else we can provide to help track down the bug. We will be keeping this base backup and WAL files around so that we can use them for testing.
If I'm right then 8.2.5 will not help you. Attached patch should fix your problem, but I suppose that there is an another bug. Test specially developed for reproduce your problem discovers another issue. The diagnostic is:
FATAL:  failed to add item to index page in 1663/10819/16460
CONTEXT: xlog redo Insert item, node: 1663/10819/16460 blkno: 514 offset: 78 nitem: 1 isdata: F isleaf F isdelete F updateBlkno:1551

Now I'm working on fixing it.
--
Teodor Sigaev                                   E-mail: teodor@xxxxxxxxx
                                                   WWW: http://www.sigaev.ru/
*** ./src/backend/access/gin.orig/ginentrypage.c	Thu Oct 25 22:11:56 2007
--- ./src/backend/access/gin/ginentrypage.c	Thu Oct 25 22:43:17 2007
***************
*** 404,409 ****
--- 404,434 ----
  }
  
  /*
+  * Returns new tuple with copied value from source tuple.
+  * New tuple will not store posting list
+  */
+ static IndexTuple
+ copyIndexTuple(IndexTuple itup, Page page)
+ {
+ 	IndexTuple	nitup;
+ 
+ 	if (GinPageIsLeaf(page) && !GinIsPostingTree(itup))
+ 	{
+ 		nitup = (IndexTuple) palloc(MAXALIGN(GinGetOrigSizePosting(itup)));
+ 		memcpy(nitup, itup, GinGetOrigSizePosting(itup));
+ 		nitup->t_info &= ~INDEX_SIZE_MASK;
+ 		nitup->t_info |= GinGetOrigSizePosting(itup);
+ 	}
+ 	else
+ 	{
+ 		nitup = (IndexTuple) palloc(MAXALIGN(IndexTupleSize(itup)));
+ 		memcpy(nitup, itup, IndexTupleSize(itup));
+ 	}
+ 
+ 	return nitup;
+ }
+ 
+ /*
   * Place tuple and split page, original buffer(lbuf) leaves untouched,
   * returns shadow page of lbuf filled new data.
   * Tuples are distributed between pages by equal size on its, not
***************
*** 424,431 ****
  	IndexTuple	itup,
  				leftrightmost = NULL;
  	static ginxlogSplit data;
- 	Datum		value;
- 	bool		isnull;
  	Page		page;
  	Page		lpage = GinPageGetCopyPage(BufferGetPage(lbuf));
  	Page		rpage = BufferGetPage(rbuf);
--- 449,454 ----
***************
*** 494,502 ****
  		ptr += MAXALIGN(IndexTupleSize(itup));
  	}
  
! 	value = index_getattr(leftrightmost, FirstOffsetNumber, btree->ginstate->tupdesc, &isnull);
! 	btree->entry = GinFormTuple(btree->ginstate, value, NULL, 0);
  	ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber(lbuf), InvalidOffsetNumber);
  	btree->rightblkno = BufferGetBlockNumber(rbuf);
  
  	data.node = btree->index->rd_node;
--- 517,525 ----
  		ptr += MAXALIGN(IndexTupleSize(itup));
  	}
  
! 	btree->entry = copyIndexTuple(leftrightmost, lpage);
  	ItemPointerSet(&(btree->entry)->t_tid, BufferGetBlockNumber(lbuf), InvalidOffsetNumber);
+ 
  	btree->rightblkno = BufferGetBlockNumber(rbuf);
  
  	data.node = btree->index->rd_node;
***************
*** 533,552 ****
  	Page		page = BufferGetPage(buf);
  
  	itup = getRightMostTuple(page);
! 	if (GinPageIsLeaf(page) && !GinIsPostingTree(itup))
! 	{
! 		nitup = (IndexTuple) palloc(MAXALIGN(GinGetOrigSizePosting(itup)));
! 		memcpy(nitup, itup, GinGetOrigSizePosting(itup));
! 		nitup->t_info &= ~INDEX_SIZE_MASK;
! 		nitup->t_info |= GinGetOrigSizePosting(itup);
! 	}
! 	else
! 	{
! 		nitup = (IndexTuple) palloc(MAXALIGN(IndexTupleSize(itup)));
! 		memcpy(nitup, itup, IndexTupleSize(itup));
! 	}
! 
  	ItemPointerSet(&nitup->t_tid, BufferGetBlockNumber(buf), InvalidOffsetNumber);
  	return nitup;
  }
  
--- 556,564 ----
  	Page		page = BufferGetPage(buf);
  
  	itup = getRightMostTuple(page);
! 	nitup = copyIndexTuple(itup, page);
  	ItemPointerSet(&nitup->t_tid, BufferGetBlockNumber(buf), InvalidOffsetNumber);
+ 
  	return nitup;
  }
  
---------------------------(end of broadcast)---------------------------
TIP 4: Have you searched our list archives?

               http://archives.postgresql.org

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux