diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-20 15:22:38 +0000 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2005-06-20 15:22:38 +0000 |
commit | 1bfdd1a89321c390201ebe15fe47571f54f9c80a (patch) | |
tree | 5a329310ca2e125ac8fe3ada4200e4705f0b78e8 /src/backend/access/gist/gist.c | |
parent | 3f6a094be1c03336072cc737038b048e77d78bc4 (diff) | |
download | postgresql-1bfdd1a89321c390201ebe15fe47571f54f9c80a.tar.gz postgresql-1bfdd1a89321c390201ebe15fe47571f54f9c80a.zip |
fix founded hole in recovery after crash, add vacuum_delay_point()
Diffstat (limited to 'src/backend/access/gist/gist.c')
-rw-r--r-- | src/backend/access/gist/gist.c | 56 |
1 files changed, 20 insertions, 36 deletions
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 340f6b9b4f1..89ba0713554 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.120 2005/06/20 10:29:36 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.121 2005/06/20 15:22:37 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -317,17 +317,10 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) { newitup = gistSplit(state->r, state->stack->buffer, itvec, &tlen, &dist, giststate); if ( !state->r->rd_istemp ) { - OffsetNumber noffs=0, offs[ MAXALIGN( sizeof(OffsetNumber) ) / sizeof(OffsetNumber) ]; XLogRecPtr recptr; XLogRecData *rdata; - if ( state->stack->todelete ) { - offs[0] = state->stack->childoffnum; - noffs=1; - } - rdata = formSplitRdata(state->r->rd_node, state->stack->blkno, - offs, noffs, state->itup, state->ituplen, &(state->key), state->path, state->pathlen, dist); START_CRIT_SECTION(); @@ -716,31 +709,27 @@ gistSplit(Relation r, /* write on disk (may need another split) */ if (gistnospace(right, rvectup, v.spl_nright)) { - int i; - SplitedPageLayout *d, *origd=*dist; - nlen = v.spl_nright; newtup = gistSplit(r, rightbuf, rvectup, &nlen, dist, giststate); - /* XLOG stuff */ - d=*dist; - /* translate offsetnumbers to our */ - while( d && d!=origd ) { - for(i=0;i<d->block.num;i++) - d->list[i] = v.spl_right[ d->list[i]-1 ]; - d=d->next; - } ReleaseBuffer(rightbuf); } else { OffsetNumber l; + char *ptr; l = gistfillbuffer(r, right, rvectup, v.spl_nright, FirstOffsetNumber); /* XLOG stuff */ ROTATEDIST(*dist); (*dist)->block.blkno = BufferGetBlockNumber(rightbuf); (*dist)->block.num = v.spl_nright; - (*dist)->list = v.spl_right; + (*dist)->list = (IndexTupleData*)palloc( BLCKSZ ); + ptr = (char*) ( (*dist)->list ); + for(i=0;i<v.spl_nright;i++) { + memcpy( ptr, rvectup[i], IndexTupleSize( rvectup[i] ) ); + ptr += IndexTupleSize( rvectup[i] ); + } + (*dist)->lenlist = ptr - ( (char*) ( (*dist)->list ) ); (*dist)->buffer = rightbuf; nlen = 1; @@ -754,20 +743,8 @@ gistSplit(Relation r, { int llen = v.spl_nleft; IndexTuple *lntup; - int i; - SplitedPageLayout *d, *origd=*dist; lntup = gistSplit(r, leftbuf, lvectup, &llen, dist, giststate); - - /* XLOG stuff */ - d=*dist; - /* translate offsetnumbers to our */ - while( d && d!=origd ) { - for(i=0;i<d->block.num;i++) - d->list[i] = v.spl_left[ d->list[i]-1 ]; - d=d->next; - } - ReleaseBuffer(leftbuf); newtup = gistjoinvector(newtup, &nlen, lntup, llen); @@ -775,18 +752,25 @@ gistSplit(Relation r, else { OffsetNumber l; + char *ptr; l = gistfillbuffer(r, left, lvectup, v.spl_nleft, FirstOffsetNumber); - if (BufferGetBlockNumber(buffer) != GIST_ROOT_BLKNO) - PageRestoreTempPage(left, p); - /* XLOG stuff */ ROTATEDIST(*dist); (*dist)->block.blkno = BufferGetBlockNumber(leftbuf); (*dist)->block.num = v.spl_nleft; - (*dist)->list = v.spl_left; + (*dist)->list = (IndexTupleData*)palloc( BLCKSZ ); + ptr = (char*) ( (*dist)->list ); + for(i=0;i<v.spl_nleft;i++) { + memcpy( ptr, lvectup[i], IndexTupleSize( lvectup[i] ) ); + ptr += IndexTupleSize( lvectup[i] ); + } + (*dist)->lenlist = ptr - ( (char*) ( (*dist)->list ) ); (*dist)->buffer = leftbuf; + if (BufferGetBlockNumber(buffer) != GIST_ROOT_BLKNO) + PageRestoreTempPage(left, p); + nlen += 1; newtup = (IndexTuple *) repalloc(newtup, sizeof(IndexTuple) * nlen); newtup[nlen - 1] = ( v.spl_leftvalid ) ? gistFormTuple(giststate, r, v.spl_lattr, v.spl_lattrsize, v.spl_lisnull) |