postgres.git / summary / log / commit / refs

commit    c299477229559d4ee7db68720d86d3fb391db761
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sun Dec 16 20:01:55 2012 +0000
First released in: 9.3.0, 9.1.8, 9.2.3

    Fix filling of postmaster.pid in bootstrap/standalone mode.
    
    We failed to ever fill the sixth line (LISTEN_ADDR), which caused the
    attempt to fill the seventh line (SHMEM_KEY) to fail, so that the shared
    memory key never got added to the file in standalone mode.  This has been
    broken since we added more content to our lock files in 9.1.
    
    To fix, tweak the logic in CreateLockFile to add an empty LISTEN_ADDR
    line in standalone mode.  This is a tad grotty, but since that function
    already knows almost everything there is to know about the contents of
    lock files, it doesn't seem that it's any better to hack it elsewhere.
    
    It's not clear how significant this bug really is, since a standalone
    backend should never have any children and thus it seems not critical
    to be able to check the nattch count of the shmem segment externally.
    But I'm going to back-patch the fix anyway.
    
    This problem had escaped notice because of an ancient (and in hindsight
    pretty dubious) decision to suppress LOG-level messages by default in
    standalone mode; so that the elog(LOG) complaint in AddToDataDirLockFile
    that should have warned of the problem didn't do anything.  Fixing that
    is material for a separate patch though.


src/backend/utils/init/miscinit.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index c518c2133cd..225c175d7fc 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -894,9 +894,9 @@ CreateLockFile(const char *filename, bool amPostmaster, /* * Successfully created the file, now fill it. See comment in miscadmin.h - * about the contents. Note that we write the same info into both datadir - * and socket lockfiles; although more stuff may get added to the datadir - * lockfile later. + * about the contents. Note that we write the same first five lines into + * both datadir and socket lockfiles; although more stuff may get added to + * the datadir lockfile later. */ snprintf(buffer, sizeof(buffer), "%d\n%s\n%ld\n%d\n%s\n", amPostmaster ? (int) my_pid : -((int) my_pid), @@ -905,6 +905,13 @@ CreateLockFile(const char *filename, bool amPostmaster, PostPortNumber, socketDir); + /* + * In a standalone backend, the next line (LOCK_FILE_LINE_LISTEN_ADDR) + * will never receive data, so fill it in as empty now. + */ + if (isDDLock && !amPostmaster) + strlcat(buffer, "\n", sizeof(buffer)); + errno = 0; if (write(fd, buffer, strlen(buffer)) != strlen(buffer)) { @@ -1078,7 +1085,8 @@ AddToDataDirLockFile(int target_line, const char *str) { if ((srcptr = strchr(srcptr, '\n')) == NULL) { - elog(LOG, "bogus data in \"%s\"", DIRECTORY_LOCK_FILE); + elog(LOG, "incomplete data in \"%s\": found only %d newlines while trying to add line %d", + DIRECTORY_LOCK_FILE, lineno - 1, target_line); close(fd); return; } [parent: 3717f0837b79]