]> granicus.if.org Git - postgresql/commitdiff
Change LockClassinfoForUpdate() to retry mark4update() in case
authorHiroshi Inoue <inoue@tpf.co.jp>
Thu, 18 Jan 2001 04:01:42 +0000 (04:01 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Thu, 18 Jan 2001 04:01:42 +0000 (04:01 +0000)
the tuple is already uodated. (If LockClassinfoForUpdate() is
thought to be useful).

src/backend/catalog/index.c

index 46f8abe7b312a0e967f27f0e0ecdeb0eb119f602..7b0ca328cd5c089fe7dd0b0a8d321fcb58413621 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.133 2000/12/22 23:12:03 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.134 2001/01/18 04:01:42 inoue Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1348,15 +1348,26 @@ LockClassinfoForUpdate(Oid relid, HeapTuple rtup,
        rtup->t_self = classTuple->t_self;
        ReleaseSysCache(classTuple);
 
-       test = heap_mark4update(relationRelation, rtup, buffer);
-       switch (test)
+       while (1)
        {
-               case HeapTupleSelfUpdated:
-               case HeapTupleMayBeUpdated:
-                       break;
-               default:
-                       elog(ERROR, "LockStatsForUpdate couldn't lock relid %u", relid);
-                       return false;
+               ItemPointerData tidsave;
+
+               ItemPointerCopy(&(rtup->t_self), &tidsave);
+               test = heap_mark4update(relationRelation, rtup, buffer);
+               switch (test)
+               {
+                       case HeapTupleSelfUpdated:
+                       case HeapTupleMayBeUpdated:
+                               break;
+                       case HeapTupleUpdated:
+                               ReleaseBuffer(*buffer);
+                               if (!ItemPointerEquals(&(rtup->t_self), &tidsave))
+                                       continue;
+                       default:
+                               elog(ERROR, "LockClassinfoForUpdate couldn't lock relid %u", relid);
+                               return false;
+               }
+               break;
        }
        RelationInvalidateHeapTuple(relationRelation, rtup);
        if (confirmCommitted)
@@ -1634,8 +1645,7 @@ UpdateStats(Oid relid, long reltuples)
 #ifdef OLD_FILE_NAMING
        in_place_upd = (IsReindexProcessing() || IsBootstrapProcessingMode());
 #else
-       in_place_upd = (IsIgnoringSystemIndexes() || (IsReindexProcessing() &&
-                       relid == RelOid_pg_class));
+       in_place_upd = (IsIgnoringSystemIndexes() || IsReindexProcessing());
 #endif /* OLD_FILE_NAMING */
 
        if (!in_place_upd)