diff options
-rw-r--r-- | src/backend/utils/init/miscinit.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 55b395f9a2b..35ef0de709a 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.175.2.1 2009/12/09 21:58:04 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.175.2.2 2010/08/16 17:33:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -879,6 +879,9 @@ CreateLockFile(const char *filename, bool amPostmaster, * admin) but has left orphan backends behind. Check for this by * looking to see if there is an associated shmem segment that is * still in use. + * + * Note: because postmaster.pid is written in two steps, we might not + * find the shmem ID values in it; we can't treat that as an error. */ if (isDDLock) { @@ -942,7 +945,18 @@ CreateLockFile(const char *filename, bool amPostmaster, (errcode_for_file_access(), errmsg("could not write lock file \"%s\": %m", filename))); } - if (close(fd)) + if (pg_fsync(fd) != 0) + { + int save_errno = errno; + + close(fd); + unlink(filename); + errno = save_errno; + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not write lock file \"%s\": %m", filename))); + } + if (close(fd) != 0) { int save_errno = errno; @@ -1103,7 +1117,14 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2) close(fd); return; } - if (close(fd)) + if (pg_fsync(fd) != 0) + { + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not write to file \"%s\": %m", + DIRECTORY_LOCK_FILE))); + } + if (close(fd) != 0) { ereport(LOG, (errcode_for_file_access(), |