]> granicus.if.org Git - postgresql/commitdiff
Fix init_irels to close the pg_internal.init file before returning.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 16 Jan 2002 17:34:42 +0000 (17:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 16 Jan 2002 17:34:42 +0000 (17:34 +0000)
This saves one open file descriptor per backend, and avoids an
annoying NOTICE on Cygwin (which has trouble deleting open files).
Bug appears to date back to original coding of init_irels, circa 1992.

src/backend/utils/cache/relcache.c

index 305422024076a4fbd3c5763374e85fcddd295561..16a38df83d3cd60d894569e2be43d2521e0ed0f0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.150 2002/01/15 22:33:20 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.151 2002/01/16 17:34:42 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2659,33 +2659,22 @@ init_irels(void)
                return;
        }
 
-       FileSeek(fd, 0L, SEEK_SET);
-
        for (relno = 0; relno < Num_indices_bootstrap; relno++)
        {
                /* first read the relation descriptor length */
                if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                /* safety check for incompatible relcache layout */
                if (len != sizeof(RelationData))
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                ird = irel[relno] = (Relation) palloc(len);
                MemSet(ird, 0, len);
 
                /* then, read the Relation structure */
                if ((nread = FileRead(fd, (char *) ird, len)) != len)
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                /* reset transient fields */
                ird->rd_targblock = InvalidBlockNumber;
@@ -2696,33 +2685,21 @@ init_irels(void)
 
                /* next, read the access method tuple form */
                if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                am = (Form_pg_am) palloc(len);
                if ((nread = FileRead(fd, (char *) am, len)) != len)
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                ird->rd_am = am;
 
                /* next read the relation tuple form */
                if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                relform = (Form_pg_class) palloc(len);
                if ((nread = FileRead(fd, (char *) relform, len)) != len)
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                ird->rd_rel = relform;
 
@@ -2734,18 +2711,12 @@ init_irels(void)
                for (i = 0; i < relform->relnatts; i++)
                {
                        if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-                       {
-                               write_irels();
-                               return;
-                       }
+                               goto read_failed;
 
                        ird->rd_att->attrs[i] = (Form_pg_attribute) palloc(len);
 
                        if ((nread = FileRead(fd, (char *) ird->rd_att->attrs[i], len)) != len)
-                       {
-                               write_irels();
-                               return;
-                       }
+                               goto read_failed;
                }
 
                /*
@@ -2761,17 +2732,11 @@ init_irels(void)
 
                /* next, read the index strategy map */
                if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                strat = (IndexStrategy) MemoryContextAlloc(indexcxt, len);
                if ((nread = FileRead(fd, (char *) strat, len)) != len)
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
 
                /* have to invalidate any FmgrInfo data in the strategy maps */
                nstrategies = am->amstrategies * relform->relnatts;
@@ -2782,17 +2747,11 @@ init_irels(void)
 
                /* finally, read the vector of support procedures */
                if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
-               {
-                       write_irels();
-                       return;
-               }
-
+                       goto read_failed;
                support = (RegProcedure *) MemoryContextAlloc(indexcxt, len);
                if ((nread = FileRead(fd, (char *) support, len)) != len)
-               {
-                       write_irels();
-                       return;
-               }
+                       goto read_failed;
+
                ird->rd_support = support;
 
                nsupport = relform->relnatts * am->amsupport;
@@ -2804,7 +2763,16 @@ init_irels(void)
 
                RelationCacheInsert(ird);
        }
+
+       /* successfully read the init file */
+       FileClose(fd);
        criticalRelcachesBuilt = true;
+       return;
+
+       /* init file is broken, so do it the hard way */
+read_failed:
+       FileClose(fd);
+       write_irels();
 }
 
 static void
@@ -2976,6 +2944,10 @@ write_irels(void)
        /*
         * And rename the temp file to its final name, deleting any
         * previously-existing init file.
+        *
+        * Note: a failure here is possible under Cygwin, if some other
+        * backend is holding open an unlinked-but-not-yet-gone init file.
+        * So treat this as a noncritical failure.
         */
        if (rename(tempfilename, finalfilename) < 0)
        {