Eliminate ajust scan code. Since concurrent GiST it doesn't
authorTeodor Sigaev
Mon, 3 Apr 2006 13:44:33 +0000 (13:44 +0000)
committerTeodor Sigaev
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 */