Skip to content

Commit 1bfdd1a

Browse files
committed
fix founded hole in recovery after crash, add vacuum_delay_point()
1 parent 3f6a094 commit 1bfdd1a

File tree

4 files changed

+77
-174
lines changed

4 files changed

+77
-174
lines changed

src/backend/access/gist/gist.c

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.120 2005/06/20 10:29:36 teodor Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.121 2005/06/20 15:22:37 teodor Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -317,17 +317,10 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) {
317317
newitup = gistSplit(state->r, state->stack->buffer, itvec, &tlen, &dist, giststate);
318318

319319
if ( !state->r->rd_istemp ) {
320-
OffsetNumber noffs=0, offs[ MAXALIGN( sizeof(OffsetNumber) ) / sizeof(OffsetNumber) ];
321320
XLogRecPtr recptr;
322321
XLogRecData *rdata;
323322

324-
if ( state->stack->todelete ) {
325-
offs[0] = state->stack->childoffnum;
326-
noffs=1;
327-
}
328-
329323
rdata = formSplitRdata(state->r->rd_node, state->stack->blkno,
330-
offs, noffs, state->itup, state->ituplen,
331324
&(state->key), state->path, state->pathlen, dist);
332325

333326
START_CRIT_SECTION();
@@ -716,31 +709,27 @@ gistSplit(Relation r,
716709
/* write on disk (may need another split) */
717710
if (gistnospace(right, rvectup, v.spl_nright))
718711
{
719-
int i;
720-
SplitedPageLayout *d, *origd=*dist;
721-
722712
nlen = v.spl_nright;
723713
newtup = gistSplit(r, rightbuf, rvectup, &nlen, dist, giststate);
724-
/* XLOG stuff */
725-
d=*dist;
726-
/* translate offsetnumbers to our */
727-
while( d && d!=origd ) {
728-
for(i=0;i<d->block.num;i++)
729-
d->list[i] = v.spl_right[ d->list[i]-1 ];
730-
d=d->next;
731-
}
732714
ReleaseBuffer(rightbuf);
733715
}
734716
else
735717
{
736718
OffsetNumber l;
719+
char *ptr;
737720

738721
l = gistfillbuffer(r, right, rvectup, v.spl_nright, FirstOffsetNumber);
739722
/* XLOG stuff */
740723
ROTATEDIST(*dist);
741724
(*dist)->block.blkno = BufferGetBlockNumber(rightbuf);
742725
(*dist)->block.num = v.spl_nright;
743-
(*dist)->list = v.spl_right;
726+
(*dist)->list = (IndexTupleData*)palloc( BLCKSZ );
727+
ptr = (char*) ( (*dist)->list );
728+
for(i=0;i<v.spl_nright;i++) {
729+
memcpy( ptr, rvectup[i], IndexTupleSize( rvectup[i] ) );
730+
ptr += IndexTupleSize( rvectup[i] );
731+
}
732+
(*dist)->lenlist = ptr - ( (char*) ( (*dist)->list ) );
744733
(*dist)->buffer = rightbuf;
745734

746735
nlen = 1;
@@ -754,39 +743,34 @@ gistSplit(Relation r,
754743
{
755744
int llen = v.spl_nleft;
756745
IndexTuple *lntup;
757-
int i;
758-
SplitedPageLayout *d, *origd=*dist;
759746

760747
lntup = gistSplit(r, leftbuf, lvectup, &llen, dist, giststate);
761-
762-
/* XLOG stuff */
763-
d=*dist;
764-
/* translate offsetnumbers to our */
765-
while( d && d!=origd ) {
766-
for(i=0;i<d->block.num;i++)
767-
d->list[i] = v.spl_left[ d->list[i]-1 ];
768-
d=d->next;
769-
}
770-
771748
ReleaseBuffer(leftbuf);
772749

773750
newtup = gistjoinvector(newtup, &nlen, lntup, llen);
774751
}
775752
else
776753
{
777754
OffsetNumber l;
755+
char *ptr;
778756

779757
l = gistfillbuffer(r, left, lvectup, v.spl_nleft, FirstOffsetNumber);
780-
if (BufferGetBlockNumber(buffer) != GIST_ROOT_BLKNO)
781-
PageRestoreTempPage(left, p);
782-
783758
/* XLOG stuff */
784759
ROTATEDIST(*dist);
785760
(*dist)->block.blkno = BufferGetBlockNumber(leftbuf);
786761
(*dist)->block.num = v.spl_nleft;
787-
(*dist)->list = v.spl_left;
762+
(*dist)->list = (IndexTupleData*)palloc( BLCKSZ );
763+
ptr = (char*) ( (*dist)->list );
764+
for(i=0;i<v.spl_nleft;i++) {
765+
memcpy( ptr, lvectup[i], IndexTupleSize( lvectup[i] ) );
766+
ptr += IndexTupleSize( lvectup[i] );
767+
}
768+
(*dist)->lenlist = ptr - ( (char*) ( (*dist)->list ) );
788769
(*dist)->buffer = leftbuf;
789770

771+
if (BufferGetBlockNumber(buffer) != GIST_ROOT_BLKNO)
772+
PageRestoreTempPage(left, p);
773+
790774
nlen += 1;
791775
newtup = (IndexTuple *) repalloc(newtup, sizeof(IndexTuple) * nlen);
792776
newtup[nlen - 1] = ( v.spl_leftvalid ) ? gistFormTuple(giststate, r, v.spl_lattr, v.spl_lattrsize, v.spl_lisnull)

src/backend/access/gist/gistvacuum.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.1 2005/06/20 10:29:36 teodor Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.2 2005/06/20 15:22:37 teodor Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -183,7 +183,6 @@ gistVacuumUpdate( GistVacuum *gv, BlockNumber blkno, bool needunion ) {
183183
/* path is need to recovery because there is new pages, in a case of
184184
crash it's needed to add inner tuple pointers on parent page */
185185
rdata = formSplitRdata(gv->index->rd_node, blkno,
186-
todelete, ntodelete, addon, curlenaddon,
187186
&key, gv->path, gv->curpathlen, dist);
188187

189188
MemoryContextSwitchTo(oldCtx);
@@ -507,6 +506,8 @@ gistbulkdelete(PG_FUNCTION_ARGS) {
507506
ptr = stack->next;
508507
pfree( stack );
509508
stack = ptr;
509+
510+
vacuum_delay_point();
510511
}
511512

512513
MemoryContextDelete( opCtx );

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy