]> granicus.if.org Git - postgresql/commitdiff
Use stat(2) to probe for existing xlog segments in InstallXLogFileSegment,
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Jan 2003 03:06:04 +0000 (03:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Jan 2003 03:06:04 +0000 (03:06 +0000)
rather than actually opening the files.  This eliminates some corner cases
where the file indeed exists but open() fails for another reason, such
as being out of file descriptors.  The net reliability gain is probably
tiny, since xlog.c is full of other file open calls that will elog(PANIC)
if they fail for any reason; but this specific failure mode has been
observed in the field, so we may as well fix it.

src/backend/access/transam/xlog.c

index a78533c3890730d78c8f8cab82b5a0de61d6342c..c35762bba9ef7b19418fc374297f4837e0eeb60d 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.110 2002/11/08 20:23:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.111 2003/01/25 03:06:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1471,7 +1471,7 @@ InstallXLogFileSegment(uint32 log, uint32 seg, char *tmppath,
                                           bool use_lock)
 {
        char            path[MAXPGPATH];
-       int                     fd;
+       struct stat stat_buf;
 
        XLogFileName(path, log, seg);
 
@@ -1489,10 +1489,8 @@ InstallXLogFileSegment(uint32 log, uint32 seg, char *tmppath,
        else
        {
                /* Find a free slot to put it in */
-               while ((fd = BasicOpenFile(path, O_RDWR | PG_BINARY,
-                                                                  S_IRUSR | S_IWUSR)) >= 0)
+               while (stat(path, &stat_buf) == 0)
                {
-                       close(fd);
                        if (--max_advance < 0)
                        {
                                /* Failed to find a free slot within specified range */