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

Commit799bc58

Browse files
committed
More infrastructure for btree compaction project. Tree-traversal code
now knows what to do upon hitting a dead page (in theory anyway, it'suntested...). Add a post-VACUUM-cleanup entry point for index AMs, toprovide a place for dead-page scavenging to happen.Also, fix oversight that broke btpo_prev links in temporary indexes.initdb forced due to additions in pg_am.
1 parent4fff132 commit799bc58

File tree

18 files changed

+705
-341
lines changed

18 files changed

+705
-341
lines changed

‎doc/src/sgml/catalogs.sgml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!--
22
Documentation of the system catalogs, directed toward PostgreSQL developers
3-
$Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.65 2003/01/19 00:13:28 momjian Exp $
3+
$Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.66 2003/02/22 00:45:03 tgl Exp $
44
-->
55

66
<chapter id="catalogs">
@@ -446,6 +446,13 @@
446446
<entry>bulk-delete function</entry>
447447
</row>
448448

449+
<row>
450+
<entry>amvacuumcleanup</entry>
451+
<entry><type>regproc</type></entry>
452+
<entry>pg_proc.oid</entry>
453+
<entry>post-VACUUM cleanup function</entry>
454+
</row>
455+
449456
<row>
450457
<entry>amcostestimate</entry>
451458
<entry><type>regproc</type></entry>

‎src/backend/access/gist/gist.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-
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.99 2002/11/13 00:39:46 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.100 2003/02/22 00:45:03 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1650,8 +1650,9 @@ gistbulkdelete(PG_FUNCTION_ARGS)
16501650

16511651
result= (IndexBulkDeleteResult*)palloc(sizeof(IndexBulkDeleteResult));
16521652
result->num_pages=num_pages;
1653-
result->tuples_removed=tuples_removed;
16541653
result->num_index_tuples=num_index_tuples;
1654+
result->tuples_removed=tuples_removed;
1655+
result->pages_free=0;
16551656

16561657
PG_RETURN_POINTER(result);
16571658
}

‎src/backend/access/hash/hash.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.60 2002/09/04 20:31:09 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.61 2003/02/22 00:45:03 tgl Exp $
1212
*
1313
* NOTES
1414
* This file contains only the public interface routines.
@@ -491,8 +491,9 @@ hashbulkdelete(PG_FUNCTION_ARGS)
491491

492492
result= (IndexBulkDeleteResult*)palloc(sizeof(IndexBulkDeleteResult));
493493
result->num_pages=num_pages;
494-
result->tuples_removed=tuples_removed;
495494
result->num_index_tuples=num_index_tuples;
495+
result->tuples_removed=tuples_removed;
496+
result->pages_free=0;
496497

497498
PG_RETURN_POINTER(result);
498499
}

‎src/backend/access/index/indexam.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.63 2003/01/08 19:41:40 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.64 2003/02/22 00:45:03 tgl Exp $
1212
*
1313
* INTERFACE ROUTINES
1414
*index_open- open an index relation by relation OID
@@ -23,6 +23,7 @@
2323
*index_restrpos- restore a scan position
2424
*index_getnext- get the next tuple from a scan
2525
*index_bulk_delete- bulk deletion of index tuples
26+
*index_vacuum_cleanup- post-deletion cleanup of an index
2627
*index_cost_estimator- fetch amcostestimate procedure OID
2728
*index_getprocid - get a support procedure OID
2829
*
@@ -579,6 +580,37 @@ index_bulk_delete(Relation indexRelation,
579580
returnresult;
580581
}
581582

583+
/* ----------------
584+
*index_vacuum_cleanup - do post-deletion cleanup of an index
585+
*
586+
*return value is an optional palloc'd struct of statistics
587+
* ----------------
588+
*/
589+
IndexBulkDeleteResult*
590+
index_vacuum_cleanup(RelationindexRelation,
591+
IndexVacuumCleanupInfo*info,
592+
IndexBulkDeleteResult*stats)
593+
{
594+
RegProcedureprocedure;
595+
IndexBulkDeleteResult*result;
596+
597+
RELATION_CHECKS;
598+
599+
/* It's okay for an index AM not to have a vacuumcleanup procedure */
600+
if (!RegProcedureIsValid(indexRelation->rd_am->amvacuumcleanup))
601+
returnstats;
602+
603+
GET_REL_PROCEDURE(vacuum_cleanup,amvacuumcleanup);
604+
605+
result= (IndexBulkDeleteResult*)
606+
DatumGetPointer(OidFunctionCall3(procedure,
607+
PointerGetDatum(indexRelation),
608+
PointerGetDatum((Pointer)info),
609+
PointerGetDatum((Pointer)stats)));
610+
611+
returnresult;
612+
}
613+
582614
/* ----------------
583615
*index_cost_estimator
584616
*

‎src/backend/access/nbtree/nbtinsert.c

Lines changed: 97 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.97 2003/02/21 00:06:21 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.98 2003/02/22 00:45:03 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -280,12 +280,21 @@ _bt_check_unique(Relation rel, BTItem btitem, Relation heapRel,
280280
if (!_bt_isequal(itupdesc,page,P_HIKEY,
281281
natts,itup_scankey))
282282
break;
283-
nblkno=opaque->btpo_next;
284-
if (nbuf!=InvalidBuffer)
285-
_bt_relbuf(rel,nbuf);
286-
nbuf=_bt_getbuf(rel,nblkno,BT_READ);
287-
page=BufferGetPage(nbuf);
288-
opaque= (BTPageOpaque)PageGetSpecialPointer(page);
283+
/* Advance to next non-dead page --- there must be one */
284+
for (;;)
285+
{
286+
nblkno=opaque->btpo_next;
287+
if (nbuf!=InvalidBuffer)
288+
_bt_relbuf(rel,nbuf);
289+
nbuf=_bt_getbuf(rel,nblkno,BT_READ);
290+
page=BufferGetPage(nbuf);
291+
opaque= (BTPageOpaque)PageGetSpecialPointer(page);
292+
if (!P_IGNORE(opaque))
293+
break;
294+
if (P_RIGHTMOST(opaque))
295+
elog(ERROR,"_bt_check_unique: fell off the end of %s",
296+
RelationGetRelationName(rel));
297+
}
289298
maxoff=PageGetMaxOffsetNumber(page);
290299
offset=P_FIRSTDATAKEY(opaque);
291300
}
@@ -414,20 +423,34 @@ _bt_insertonpg(Relation rel,
414423
_bt_compare(rel,keysz,scankey,page,P_HIKEY)==0&&
415424
random()> (MAX_RANDOM_VALUE /100))
416425
{
417-
/* step right one page */
418-
BlockNumberrblkno=lpageop->btpo_next;
419-
Bufferrbuf;
420-
421426
/*
422-
* must write-lock next page before releasing write lock on
427+
* step right to next non-dead page
428+
*
429+
* must write-lock that page before releasing write lock on
423430
* current page; else someone else's _bt_check_unique scan
424-
* could fail to see our insertion.
431+
* could fail to see our insertion. write locks on intermediate
432+
* dead pages won't do because we don't know when they will get
433+
* de-linked from the tree.
425434
*/
426-
rbuf=_bt_getbuf(rel,rblkno,BT_WRITE);
435+
Bufferrbuf=InvalidBuffer;
436+
437+
for (;;)
438+
{
439+
BlockNumberrblkno=lpageop->btpo_next;
440+
441+
if (rbuf!=InvalidBuffer)
442+
_bt_relbuf(rel,rbuf);
443+
rbuf=_bt_getbuf(rel,rblkno,BT_WRITE);
444+
page=BufferGetPage(rbuf);
445+
lpageop= (BTPageOpaque)PageGetSpecialPointer(page);
446+
if (!P_IGNORE(lpageop))
447+
break;
448+
if (P_RIGHTMOST(lpageop))
449+
elog(ERROR,"_bt_insertonpg: fell off the end of %s",
450+
RelationGetRelationName(rel));
451+
}
427452
_bt_relbuf(rel,buf);
428453
buf=rbuf;
429-
page=BufferGetPage(buf);
430-
lpageop= (BTPageOpaque)PageGetSpecialPointer(page);
431454
movedright= true;
432455
}
433456

@@ -633,8 +656,9 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
633656
BTPageOpaqueropaque,
634657
lopaque,
635658
oopaque;
636-
Buffersbuf=0;
637-
Pagespage=0;
659+
Buffersbuf=InvalidBuffer;
660+
Pagespage=NULL;
661+
BTPageOpaquesopaque=NULL;
638662
Sizeitemsz;
639663
ItemIditemid;
640664
BTItemitem;
@@ -792,6 +816,9 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
792816
{
793817
sbuf=_bt_getbuf(rel,ropaque->btpo_next,BT_WRITE);
794818
spage=BufferGetPage(sbuf);
819+
sopaque= (BTPageOpaque)PageGetSpecialPointer(spage);
820+
if (sopaque->btpo_prev!=ropaque->btpo_prev)
821+
elog(PANIC,"btree: right sibling's left-link doesn't match");
795822
}
796823

797824
/*
@@ -802,6 +829,9 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
802829
*/
803830
START_CRIT_SECTION();
804831

832+
if (!P_RIGHTMOST(ropaque))
833+
sopaque->btpo_prev=BufferGetBlockNumber(rbuf);
834+
805835
/* XLOG stuff */
806836
if (!rel->rd_istemp)
807837
{
@@ -847,10 +877,6 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
847877

848878
if (!P_RIGHTMOST(ropaque))
849879
{
850-
BTPageOpaquesopaque= (BTPageOpaque)PageGetSpecialPointer(spage);
851-
852-
sopaque->btpo_prev=BufferGetBlockNumber(rbuf);
853-
854880
rdata[2].next=&(rdata[3]);
855881
rdata[3].buffer=sbuf;
856882
rdata[3].data=NULL;
@@ -1250,58 +1276,63 @@ _bt_getstackbuf(Relation rel, BTStack stack, int access)
12501276
Bufferbuf;
12511277
Pagepage;
12521278
BTPageOpaqueopaque;
1253-
OffsetNumberoffnum,
1254-
minoff,
1255-
maxoff;
1256-
ItemIditemid;
1257-
BTItemitem;
12581279

12591280
buf=_bt_getbuf(rel,blkno,access);
12601281
page=BufferGetPage(buf);
12611282
opaque= (BTPageOpaque)PageGetSpecialPointer(page);
1262-
minoff=P_FIRSTDATAKEY(opaque);
1263-
maxoff=PageGetMaxOffsetNumber(page);
12641283

1265-
/*
1266-
* start = InvalidOffsetNumber means "search the whole page".
1267-
* We need this test anyway due to possibility that
1268-
* page has a high key now when it didn't before.
1269-
*/
1270-
if (start<minoff)
1271-
start=minoff;
1272-
1273-
/*
1274-
* These loops will check every item on the page --- but in an order
1275-
* that's attuned to the probability of where it actually is. Scan
1276-
* to the right first, then to the left.
1277-
*/
1278-
for (offnum=start;
1279-
offnum <=maxoff;
1280-
offnum=OffsetNumberNext(offnum))
1284+
if (!P_IGNORE(opaque))
12811285
{
1282-
itemid=PageGetItemId(page,offnum);
1283-
item= (BTItem)PageGetItem(page,itemid);
1284-
if (BTItemSame(item,&stack->bts_btitem))
1286+
OffsetNumberoffnum,
1287+
minoff,
1288+
maxoff;
1289+
ItemIditemid;
1290+
BTItemitem;
1291+
1292+
minoff=P_FIRSTDATAKEY(opaque);
1293+
maxoff=PageGetMaxOffsetNumber(page);
1294+
1295+
/*
1296+
* start = InvalidOffsetNumber means "search the whole page".
1297+
* We need this test anyway due to possibility that
1298+
* page has a high key now when it didn't before.
1299+
*/
1300+
if (start<minoff)
1301+
start=minoff;
1302+
1303+
/*
1304+
* These loops will check every item on the page --- but in an
1305+
* order that's attuned to the probability of where it actually
1306+
* is. Scan to the right first, then to the left.
1307+
*/
1308+
for (offnum=start;
1309+
offnum <=maxoff;
1310+
offnum=OffsetNumberNext(offnum))
12851311
{
1286-
/* Return accurate pointer to where link is now */
1287-
stack->bts_blkno=blkno;
1288-
stack->bts_offset=offnum;
1289-
returnbuf;
1312+
itemid=PageGetItemId(page,offnum);
1313+
item= (BTItem)PageGetItem(page,itemid);
1314+
if (BTItemSame(item,&stack->bts_btitem))
1315+
{
1316+
/* Return accurate pointer to where link is now */
1317+
stack->bts_blkno=blkno;
1318+
stack->bts_offset=offnum;
1319+
returnbuf;
1320+
}
12901321
}
1291-
}
12921322

1293-
for (offnum=OffsetNumberPrev(start);
1294-
offnum >=minoff;
1295-
offnum=OffsetNumberPrev(offnum))
1296-
{
1297-
itemid=PageGetItemId(page,offnum);
1298-
item= (BTItem)PageGetItem(page,itemid);
1299-
if (BTItemSame(item,&stack->bts_btitem))
1323+
for (offnum=OffsetNumberPrev(start);
1324+
offnum >=minoff;
1325+
offnum=OffsetNumberPrev(offnum))
13001326
{
1301-
/* Return accurate pointer to where link is now */
1302-
stack->bts_blkno=blkno;
1303-
stack->bts_offset=offnum;
1304-
returnbuf;
1327+
itemid=PageGetItemId(page,offnum);
1328+
item= (BTItem)PageGetItem(page,itemid);
1329+
if (BTItemSame(item,&stack->bts_btitem))
1330+
{
1331+
/* Return accurate pointer to where link is now */
1332+
stack->bts_blkno=blkno;
1333+
stack->bts_offset=offnum;
1334+
returnbuf;
1335+
}
13051336
}
13061337
}
13071338

@@ -1365,6 +1396,8 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
13651396
rootbuf=_bt_getbuf(rel,P_NEW,BT_WRITE);
13661397
rootpage=BufferGetPage(rootbuf);
13671398
rootblknum=BufferGetBlockNumber(rootbuf);
1399+
1400+
/* acquire lock on the metapage */
13681401
metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE);
13691402
metapg=BufferGetPage(metabuf);
13701403
metad=BTPageGetMeta(metapg);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp