From 8d02b15e33ccbf9e58cb5b227254610491a90dc2 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Mon, 3 Apr 2006 13:44:33 +0000 Subject: [PATCH] Eliminate ajust scan code. Since concurrent GiST it doesn't do real work. That was missed during concurrence development. --- src/backend/access/gist/gist.c | 7 +- src/backend/access/gist/gistscan.c | 208 +------------------------- src/backend/utils/resowner/resowner.c | 3 +- src/include/access/gistscan.h | 4 +- 4 files changed, 6 insertions(+), 216 deletions(-) diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 93ec60481f..16468fd35a 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.131 2006/03/31 23:32:05 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.132 2006/04/03 13:44:33 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -493,11 +493,6 @@ gistplacetopage(GISTInsertState *state, GISTSTATE *giststate) END_CRIT_SECTION(); - if (!is_leaf) /* small optimization: inform scan ablout - * deleting... */ - gistadjscans(state->r, GISTOP_DEL, state->stack->blkno, - state->stack->childoffnum, PageGetLSN(state->stack->page), oldlsn); - if (state->ituplen > 1) { /* previous is_splitted==true */ diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index e73016a525..528fb0e7df 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.62 2006/03/05 15:58:20 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.63 2006/04/03 13:44:33 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -20,37 +20,8 @@ #include "utils/memutils.h" #include "utils/resowner.h" -/* routines defined and used here */ -static void gistregscan(IndexScanDesc scan); -static void gistdropscan(IndexScanDesc scan); -static void gistadjone(IndexScanDesc scan, int op, BlockNumber blkno, - OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn); -static void adjustiptr(IndexScanDesc scan, ItemPointer iptr, GISTSearchStack *stk, - int op, BlockNumber blkno, OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn); static void gistfreestack(GISTSearchStack *s); -/* - * Whenever we start a GiST scan in a backend, we register it in - * private space. Then if the GiST index gets updated, we check all - * registered scans and adjust them if the tuple they point at got - * moved by the update. We only need to do this in private space, - * because when we update an GiST we have a write lock on the tree, so - * no other process can have any locks at all on it. A single - * transaction can have write and read locks on the same object, so - * that's why we need to handle this case. - */ -typedef struct GISTScanListData -{ - IndexScanDesc gsl_scan; - ResourceOwner gsl_owner; - struct GISTScanListData *gsl_next; -} GISTScanListData; - -typedef GISTScanListData *GISTScanList; - -/* pointer to list of local scans on GiSTs */ -static GISTScanList GISTScans = NULL; - Datum gistbeginscan(PG_FUNCTION_ARGS) { @@ -60,7 +31,6 @@ gistbeginscan(PG_FUNCTION_ARGS) IndexScanDesc scan; scan = RelationGetIndexScan(r, nkeys, key); - gistregscan(scan); PG_RETURN_POINTER(scan); } @@ -254,189 +224,17 @@ gistendscan(PG_FUNCTION_ARGS) pfree(scan->opaque); } - - gistdropscan(scan); - PG_RETURN_VOID(); } -static void -gistregscan(IndexScanDesc scan) -{ - GISTScanList l; - - l = (GISTScanList) palloc(sizeof(GISTScanListData)); - l->gsl_scan = scan; - l->gsl_owner = CurrentResourceOwner; - l->gsl_next = GISTScans; - GISTScans = l; -} - -static void -gistdropscan(IndexScanDesc scan) -{ - GISTScanList l; - GISTScanList prev; - - prev = NULL; - - for (l = GISTScans; l != NULL && l->gsl_scan != scan; l = l->gsl_next) - prev = l; - - if (l == NULL) - elog(ERROR, "GiST scan list corrupted -- could not find 0x%p", - (void *) scan); - - if (prev == NULL) - GISTScans = l->gsl_next; - else - prev->gsl_next = l->gsl_next; - - pfree(l); -} - -/* - * ReleaseResources_gist() --- clean up gist subsystem resources. - * - * This is here because it needs to touch this module's static var GISTScans. - */ -void -ReleaseResources_gist(void) -{ - GISTScanList l; - GISTScanList prev; - GISTScanList next; - - /* - * Note: this should be a no-op during normal query shutdown. However, in - * an abort situation ExecutorEnd is not called and so there may be open - * index scans to clean up. - */ - prev = NULL; - - for (l = GISTScans; l != NULL; l = next) - { - next = l->gsl_next; - if (l->gsl_owner == CurrentResourceOwner) - { - if (prev == NULL) - GISTScans = next; - else - prev->gsl_next = next; - - pfree(l); - /* prev does not change */ - } - else - prev = l; - } -} - -void -gistadjscans(Relation rel, int op, BlockNumber blkno, OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn) -{ - GISTScanList l; - Oid relid; - - if (XLogRecPtrIsInvalid(newlsn) || XLogRecPtrIsInvalid(oldlsn)) - return; - - relid = RelationGetRelid(rel); - for (l = GISTScans; l != NULL; l = l->gsl_next) - { - if (l->gsl_scan->indexRelation->rd_id == relid) - gistadjone(l->gsl_scan, op, blkno, offnum, newlsn, oldlsn); - } -} - -/* - * gistadjone() -- adjust one scan for update. - * - * By here, the scan passed in is on a modified relation. Op tells - * us what the modification is, and blkno and offind tell us what - * block and offset index were affected. This routine checks the - * current and marked positions, and the current and marked stacks, - * to see if any stored location needs to be changed because of the - * update. If so, we make the change here. - */ -static void -gistadjone(IndexScanDesc scan, - int op, - BlockNumber blkno, - OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn) -{ - GISTScanOpaque so = (GISTScanOpaque) scan->opaque; - - adjustiptr(scan, &(scan->currentItemData), so->stack, op, blkno, offnum, newlsn, oldlsn); - adjustiptr(scan, &(scan->currentMarkData), so->markstk, op, blkno, offnum, newlsn, oldlsn); -} - -/* - * adjustiptr() -- adjust current and marked item pointers in the scan - * - * Depending on the type of update and the place it happened, we - * need to do nothing, to back up one record, or to start over on - * the same page. - */ -static void -adjustiptr(IndexScanDesc scan, - ItemPointer iptr, GISTSearchStack *stk, - int op, - BlockNumber blkno, - OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn) -{ - OffsetNumber curoff; - GISTScanOpaque so; - - if (ItemPointerIsValid(iptr)) - { - if (ItemPointerGetBlockNumber(iptr) == blkno) - { - curoff = ItemPointerGetOffsetNumber(iptr); - so = (GISTScanOpaque) scan->opaque; - - switch (op) - { - case GISTOP_DEL: - /* back up one if we need to */ - if (curoff >= offnum && XLByteEQ(stk->lsn, oldlsn)) /* the same vesrion of - * page */ - { - if (curoff > FirstOffsetNumber) - { - /* just adjust the item pointer */ - ItemPointerSet(iptr, blkno, OffsetNumberPrev(curoff)); - } - else - { - /* - * remember that we're before the current tuple - */ - ItemPointerSet(iptr, blkno, FirstOffsetNumber); - if (iptr == &(scan->currentItemData)) - so->flags |= GS_CURBEFORE; - else - so->flags |= GS_MRKBEFORE; - } - stk->lsn = newlsn; - } - break; - default: - elog(ERROR, "unrecognized GiST scan adjust operation: %d", - op); - } - } - } -} - static void gistfreestack(GISTSearchStack *s) -{ +{ while (s != NULL) { GISTSearchStack *p = s->next; - pfree(s); s = p; } } + diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index 3e00edc110..97ce5f1210 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.18 2006/03/05 15:58:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/resowner/resowner.c,v 1.19 2006/04/03 13:44:33 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -277,7 +277,6 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, } /* Clean up index scans too */ - ReleaseResources_gist(); ReleaseResources_hash(); } diff --git a/src/include/access/gistscan.h b/src/include/access/gistscan.h index 438664cff0..dbe369af1a 100644 --- a/src/include/access/gistscan.h +++ b/src/include/access/gistscan.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.28 2006/03/05 15:58:53 momjian Exp $ + * $PostgreSQL: pgsql/src/include/access/gistscan.h,v 1.29 2006/04/03 13:44:33 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -22,7 +22,5 @@ extern Datum gistrescan(PG_FUNCTION_ARGS); extern Datum gistmarkpos(PG_FUNCTION_ARGS); extern Datum gistrestrpos(PG_FUNCTION_ARGS); extern Datum gistendscan(PG_FUNCTION_ARGS); -extern void gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum, XLogRecPtr newlsn, XLogRecPtr oldlsn); -extern void ReleaseResources_gist(void); #endif /* GISTSCAN_H */