]> granicus.if.org Git - postgresql/commitdiff
Eliminate ajust scan code. Since concurrent GiST it doesn't
authorTeodor Sigaev <teodor@sigaev.ru>
Mon, 3 Apr 2006 13:44:33 +0000 (13:44 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Mon, 3 Apr 2006 13:44:33 +0000 (13:44 +0000)
do real work. That was missed during concurrence development.

src/backend/access/gist/gist.c
src/backend/access/gist/gistscan.c
src/backend/utils/resowner/resowner.c
src/include/access/gistscan.h

index 93ec60481f89f72e1deadd8e87229f9e7d6fa583..16468fd35a5bce6b442bd3349c6805a5a7857bbf 100644 (file)
@@ -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 */
 
index e73016a525d7d00191ee60e83e033a9f742394b5..528fb0e7df4ce071692e758b44a339bfcecc19bf 100644 (file)
@@ -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 $
  *
  *-------------------------------------------------------------------------
  */
 #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;
        }
 }
+
index 3e00edc110affbae4831c463682a3678f60d97d5..97ce5f12100030f6ebe2af3c52e69a9930cfde9a 100644 (file)
@@ -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();
        }
 
index 438664cff0940025f4466f8c92d9e271fd7bb6e6..dbe369af1a813a0f6368c814fd1534e36a9d5ab0 100644 (file)
@@ -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 */