Re: Request for further clarification on synchronous_commit - Mailing list pgsql-docs

From Bruce Momjian
Subject Re: Request for further clarification on synchronous_commit
Date
Msg-id 20200818145851.GB27231@momjian.us
Whole thread Raw
In response to Re: Request for further clarification on synchronous_commit  (Kasper Kondzielski <kghost0@gmail.com>)
Responses Re: Request for further clarification on synchronous_commit  (Bruce Momjian <bruce@momjian.us>)
List pgsql-docs
On Tue, Aug 18, 2020 at 12:50:34PM +0200, Kasper Kondzielski wrote:
> Hi, thanks for the reply.
> 
> To be honest I don't think it is better. Previously paragraph about
> remote_apply was after paragraph about `on` and before remote_write which
> followed natural order in terms of how strict these parameters are (i.e. how
> strong are the guarantees they provide). Because of that I think that
> remote_apply should return to its previous position.

Uh, not really --- see below.

> My original concern was about the fact that the difference between `on`,
> remote_write and remote_apply wasn't perfectly clear.
> I am not sure if I understand this difference correctly but maybe such a table
> could be helpful to me and others:
> 
> +-----------------------------+-------------------------------------------+
> |                             | synchronous_commit                        |
> +-----------------------------+-----+--------------+--------------+-------+
> | operation on standby server | on  | remote_apply | remote_write | local |
> +-----------------------------+-----+--------------+--------------+-------+
> | written to WAL              | Yes | Yes          | Yes          | No    |
> +-----------------------------+-----+--------------+--------------+-------+
> | commit transaction          | Yes | Yes          | No           | No    |
> +-----------------------------+-----+--------------+--------------+-------+
> | fsync                       | Yes | No           | No           | No    |
> +-----------------------------+-----+--------------+--------------+-------+
> 
> From which we can clearly see that only `on` option guarantees fsync, and the
> only difference between remote_write and remote_apply is the visibility of
> transaction results to the queries.

Un, 'on' does _not_ apply the WAL data, and remote_apply does do remote
fsync.  If you want to go in order of severity, with the most severe
first, it is:

    remote_apply
    on
    remote_write
    local

This is seen in the C enum ordering for synchronous_commit, but in
reverse order:

    typedef enum
    {
        SYNCHRONOUS_COMMIT_OFF,     /* asynchronous commit */
        SYNCHRONOUS_COMMIT_LOCAL_FLUSH, /* wait for local flush only */
        SYNCHRONOUS_COMMIT_REMOTE_WRITE,    /* wait for local flush and remote
                                             * write */
        SYNCHRONOUS_COMMIT_REMOTE_FLUSH,    /* wait for local and remote flush */
        SYNCHRONOUS_COMMIT_REMOTE_APPLY /* wait for local flush and remote apply */
    }           SyncCommitLevel;

and this defines the 'on' behavior:
    
    /* Define the default setting for synchronous_commit */
    #define SYNCHRONOUS_COMMIT_ON   SYNCHRONOUS_COMMIT_REMOTE_FLUSH

I will clarify this comment, and the docs, to say that remote_apply
includes remote flush.

Obviously these docs need improvement.  Updated patch attached.  I have
to admit I was kind of confused if remote_apply did remote fsync, but
never had the time to research it until you asked.  remote_apply is so
different from the rest, and so heavy, that I put it last in its own
paragraph.

> +         Finally, when set to <literal>remote_apply</literal>, commits will
> +         wait until replies from the current synchronous standby(s) indicate
> +         they have received the commit record of the transaction and applied
> +         it, so that it has become visible to queries on the standby(s).
> +         This can cause much larger commit delays than previous settings
> +         since it involves WAL replay.
> 'This can cause much' - What does it mean that it can cause? Under what
> circumstances it will/won't cause it?

Uh, I think we can change this to "will cause", because I can't think of
a case where it will not.

> "since it involves WAL replay" - What is a WAL replay? 

Well, there is a doc section that talks about WAL:

    https://www.postgresql.org/docs/12/wal.html

and other parts of the config docs that talk about WAL.

-- 
  Bruce Momjian  <bruce@momjian.us>        https://momjian.us
  EnterpriseDB                             https://enterprisedb.com

  The usefulness of a cup is in its emptiness, Bruce Lee


Attachment

pgsql-docs by date:

Previous
From: Kasper Kondzielski
Date:
Subject: Re: Request for further clarification on synchronous_commit
Next
From: "David G. Johnston"
Date:
Subject: Re: obsolete indexing method "rtree"