Re: [HACKERS] Reducing pg_ctl's reaction time - Mailing list pgsql-hackers

From Andres Freund
Subject Re: [HACKERS] Reducing pg_ctl's reaction time
Date
Msg-id 20170627200544.2czwjtdtyy4gr4sv@alap3.anarazel.de
Whole thread Raw
In response to Re: [HACKERS] Reducing pg_ctl's reaction time  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: [HACKERS] Reducing pg_ctl's reaction time
Re: [HACKERS] Reducing pg_ctl's reaction time
List pgsql-hackers
Hi,

On 2017-06-27 14:59:18 -0400, Tom Lane wrote:
> Here's a draft patch for that.  I quite like the results --- this seems
> way simpler and more reliable than what pg_ctl has done up to now.

Yea, I like that too.


> However, it's certainly arguable that this is too much change for an
> optional post-beta patch.

Yea, I think there's a valid case to be made for that. I'm still
inclined to go along with this, it seems we're otherwise just adding
complexity we're going to remove in a bit again.


> If we decide that it has to wait for v11,
> I'd address Jeff's complaint by hacking the loop behavior in
> test_postmaster_connection, which'd be ugly but not many lines of code.

Basically increasing the wait time over time?


> Note that I followed the USE_SYSTEMD patch's lead as to where to report
> postmaster state changes.  Arguably, in the standby-server case, we
> should not report the postmaster is ready until we've reached consistency.
> But that would require additional signaling from the startup process
> to the postmaster, so it seems like a separate change if we want it.

I suspect we're going to want to add more states to this over time, but
as you say, there's no need to hurry.


>      /*
> +     * Report postmaster status in the postmaster.pid file, to allow pg_ctl to
> +     * see what's happening.  Note that all strings written to the status line
> +     * must be the same length, per comments for AddToDataDirLockFile().  We
> +     * currently make them all 8 bytes, padding with spaces.
> +     */
> +    AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, "starting");

The 8-space thing in multiple places is a bit ugly.  How about having a
a bunch of constants declared in one place? Alternatively make it
something like: status: $c, where $c is a one character code for the
various states?


> @@ -1149,8 +1149,9 @@ TouchSocketLockFiles(void)
>   *
>   * Note: because we don't truncate the file, if we were to rewrite a line
>   * with less data than it had before, there would be garbage after the last
> - * line.  We don't ever actually do that, so not worth adding another kernel
> - * call to cover the possibility.
> + * line.  While we could fix that by adding a truncate call, that would make
> + * the file update non-atomic, which we'd rather avoid.  Therefore, callers
> + * should endeavor never to shorten a line once it's been written.
>   */
>  void
>  AddToDataDirLockFile(int target_line, const char *str)
> @@ -1193,19 +1194,26 @@ AddToDataDirLockFile(int target_line, co
>      srcptr = srcbuffer;
>      for (lineno = 1; lineno < target_line; lineno++)
>      {
> -        if ((srcptr = strchr(srcptr, '\n')) == NULL)
> -        {
> -            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;
> -        }
> -        srcptr++;
> +        char       *eol = strchr(srcptr, '\n');
> +
> +        if (eol == NULL)
> +            break;                /* not enough lines in file yet */
> +        srcptr = eol + 1;
>      }
>      memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
>      destptr = destbuffer + (srcptr - srcbuffer);
>  
>      /*
> +     * Fill in any missing lines before the target line, in case lines are
> +     * added to the file out of order.
> +     */
> +    for (; lineno < target_line; lineno++)
> +    {
> +        if (destptr < destbuffer + sizeof(destbuffer))
> +            *destptr++ = '\n';
> +    }
> +
> +    /*
>       * Write or rewrite the target line.
>       */
>      snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr,
> "%s\n", str);

Not this patches fault, and shouldn't be changed now, but this is a
fairly weird way to manage and update this file.

Greetings,

Andres Freund



pgsql-hackers by date:

Previous
From: Peter Geoghegan
Date:
Subject: [HACKERS] Abbreviated keys in nbtree internal pages
Next
From: Tom Lane
Date:
Subject: Re: [HACKERS] Reducing pg_ctl's reaction time