On Tue, Aug 28, 2012 at 04:25:36PM -0400, Tom Lane wrote:
> Bruce Momjian <br...@momjian.us> writes:
> > Updated patch attached which just reports the file as empty.  I assume
> > we don't want the extra text output for pg_ctl like we do for the
> > backend.
> 
> The backend side of this looks mostly sane to me (but drop the \n,
> messages are not supposed to contain those).  But the feof test proposed

Removed.  I thought we needed to add \n so that strings >80 would wrap
properly.  How do we handle this?

> for pg_ctl is no good: consider a file containing just, say, "-".
> fscanf would eat the "-", then hit eof, and this would complain the file
> is empty.  Possibly checking for ftell(pidf) == 0 would do, though I'm
> not sure whether it's portable to assume fscanf would eat a non-numeric
> character before complaining.

ftell() seems to work fine when combined with feof(), so I used that in
the attached patch.  ftell() alone remains at zero if the file contains
"A", so feof() is also needed.

-- 
  Bruce Momjian  <br...@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
new file mode 100644
index 775d71f..eadfcbf
*** a/src/backend/utils/init/miscinit.c
--- b/src/backend/utils/init/miscinit.c
*************** CreateLockFile(const char *filename, boo
*** 766,771 ****
--- 766,781 ----
  							filename)));
  		close(fd);
  
+ 		if (len == 0)
+ 		{
+ 			ereport(FATAL,
+ 					(errcode(ERRCODE_LOCK_FILE_EXISTS),
+ 					 errmsg("lock file \"%s\" is empty", filename),
+ 					 errhint(
+ 					 "Either another server is starting, or the lock file is the remnant "
+ 					 "of a previous server startup crash.")));
+ 		}
+ 
  		buffer[len] = '\0';
  		encoded_pid = atoi(buffer);
  
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index af8d8b2..81ba39e
*** a/src/bin/pg_ctl/pg_ctl.c
--- b/src/bin/pg_ctl/pg_ctl.c
*************** get_pgpid(void)
*** 292,299 ****
  	}
  	if (fscanf(pidf, "%ld", &pid) != 1)
  	{
! 		write_stderr(_("%s: invalid data in PID file \"%s\"\n"),
! 					 progname, pid_file);
  		exit(1);
  	}
  	fclose(pidf);
--- 292,304 ----
  	}
  	if (fscanf(pidf, "%ld", &pid) != 1)
  	{
! 		/* Is the file empty? */
! 		if (ftell(pidf) == 0 && feof(pidf))
! 			write_stderr(_("%s: the PID file \"%s\" is empty\n"),
! 						 progname, pid_file);
! 		else
! 			write_stderr(_("%s: invalid data in PID file \"%s\"\n"),
! 						 progname, pid_file);
  		exit(1);
  	}
  	fclose(pidf);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to