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