Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1bfdd1a

Browse files
committed
fix founded hole in recovery after crash, add vacuum_delay_point()
1 parent3f6a094 commit1bfdd1a

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/2010:29:36 teodor Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.121 2005/06/2015: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-
OffsetNumbernoffs=0,offs[MAXALIGN(sizeof(OffsetNumber) ) /sizeof(OffsetNumber) ];
321320
XLogRecPtrrecptr;
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-
inti;
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
OffsetNumberl;
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
intllen=v.spl_nleft;
756745
IndexTuple*lntup;
757-
inti;
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
OffsetNumberl;
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/2010:29:36 teodor Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gist/gistvacuum.c,v 1.2 2005/06/2015: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)

[8]ページ先頭

©2009-2025 Movatter.jp