Re: Problem with PITR Past Particular WAL File - Mailing list pgsql-admin
| From | Teodor Sigaev |
|---|---|
| Subject | Re: Problem with PITR Past Particular WAL File |
| Date | |
| Msg-id | 4721E335.8090601@sigaev.ru Whole thread Raw |
| In response to | Re: Problem with PITR Past Particular WAL File (Craig McElroy <craig.mcelroy@contegix.com>) |
| List | pgsql-admin |
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@sigaev.ru
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;
}
pgsql-admin by date: