diff options
Diffstat (limited to 'src/backend/utils/init/miscinit.c')
-rw-r--r-- | src/backend/utils/init/miscinit.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 0d5ffb0a8e5..27679259e47 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -46,7 +46,20 @@ #define DIRECTORY_LOCK_FILE "postmaster.pid" - +/* + * The lock file contents are: + * + * line # + * 1 pid + * 2 postmaster start time + * 3 data directory + * 4 port # + * 5 user-specified socket directory + * (the lines below are added later) + * 6 first valid listen_address + * 7 shared memory key + */ + ProcessingMode Mode = InitProcessing; /* Note: we rely on this to initialize as zeroes */ @@ -678,7 +691,7 @@ CreateLockFile(const char *filename, bool amPostmaster, bool isDDLock, const char *refName) { int fd; - char buffer[MAXPGPATH * 2 + 256]; + char buffer[MAXPGPATH * 3 + 256]; int ntries; int len; int encoded_pid; @@ -845,11 +858,10 @@ CreateLockFile(const char *filename, bool amPostmaster, if (isDDLock) { char *ptr = buffer; - unsigned long id1, - id2; + unsigned long id1, id2; int lineno; - for (lineno = 1; lineno <= 4; lineno++) + for (lineno = 1; lineno <= LOCK_FILE_LINES - 1; lineno++) { if ((ptr = strchr(ptr, '\n')) == NULL) { @@ -893,9 +905,10 @@ CreateLockFile(const char *filename, bool amPostmaster, /* * Successfully created the file, now fill it. */ - snprintf(buffer, sizeof(buffer), "%d\n%s\n%d\n%s\n", + snprintf(buffer, sizeof(buffer), "%d\n%ld\n%s\n%d\n%s\n", amPostmaster ? (int) my_pid : -((int) my_pid), - DataDir, PostPortNumber, UnixSocketDir); + (long) MyStartTime, DataDir, PostPortNumber, + UnixSocketDir); errno = 0; if (write(fd, buffer, strlen(buffer)) != strlen(buffer)) { @@ -1004,24 +1017,19 @@ TouchSocketLockFile(void) } } + /* - * Append information about a shared memory segment to the data directory - * lock file. - * - * This may be called multiple times in the life of a postmaster, if we - * delete and recreate shmem due to backend crash. Therefore, be prepared - * to overwrite existing information. (As of 7.1, a postmaster only creates - * one shm seg at a time; but for the purposes here, if we did have more than - * one then any one of them would do anyway.) + * Add lines to the data directory lock file. This erases all following + * lines, but that is OK because lines are added in order. */ void -RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2) +AddToLockFile(int target_line, const char *str) { int fd; int len; int lineno; char *ptr; - char buffer[MAXPGPATH * 2 + 256]; + char buffer[MAXPGPATH * 3 + 256]; fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0); if (fd < 0) @@ -1048,7 +1056,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2) * Skip over first four lines (PID, pgdata, portnum, socketdir). */ ptr = buffer; - for (lineno = 1; lineno <= 4; lineno++) + for (lineno = 1; lineno < target_line; lineno++) { if ((ptr = strchr(ptr, '\n')) == NULL) { @@ -1059,11 +1067,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2) ptr++; } - /* - * Append key information. Format to try to keep it the same length - * always (trailing junk won't hurt, but might confuse humans). - */ - sprintf(ptr, "%9lu %9lu\n", id1, id2); + strlcat(buffer, str, sizeof(buffer)); /* * And rewrite the data. Since we write in a single kernel call, this |