Re: invisible commit question for sync replication

From: Julien Rouhaud <rjuju123(at)gmail(dot)com>
To: qihua wu <staywithpin(at)gmail(dot)com>
Cc: pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: invisible commit question for sync replication
Date: 2023-02-01 07:11:28
Message-ID: 20230201071128.zhhff44qlbahsc6h@jrouhaud
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi,

On Wed, Feb 01, 2023 at 02:52:49PM +0800, qihua wu wrote:
> When run a cluster with sync replication, if DML is done on primary, but
> primary is isolated from all slave, then the DML will hang, if cancel it
> DML, it will say:
> WARNING: canceling wait for synchronous replication due to user request
> DETAIL: The transaction has already committed locally, but might not have
> been replicated to the standby
>
> So the workflow is
> 1: commit to local.
> 2: waiting for ACK from remote sync.
>
> When cancel the DML at step 2. the data are arealy on local, that's why
> it's warning.
>
> But when runs an insert which is waiting for remote ACK, and then query
> from another session, I didn't find that row. Why this happen? If the
> insert is already one locally, whey another session can't read it?

It works as expected for me, are you sure both sessions are actually connected
to the same server and/or querying the same table?

[1456]rjuju(at)127(dot)0(dot)0(dot)1:14295) rjuju=# select * from tt;
id | val
----+-----
(0 rows)

[1456]rjuju(at)127(dot)0(dot)0(dot)1:14295) rjuju=# insert into tt select 1;
^CCancel request sent
WARNING: 01000: canceling wait for synchronous replication due to user request
DETAIL: The transaction has already committed locally, but might not have been replicated to the standby.
LOCATION: SyncRepWaitForLSN, syncrep.c:287
INSERT 0 1

[1456]rjuju(at)127(dot)0(dot)0(dot)1:14295) rjuju=# select pg_backend_pid(), * from tt;
pg_backend_pid | id | val
----------------+----+--------
1456 | 1 | <NULL>
(1 row)

and another session:

[3327]rjuju(at)127(dot)0(dot)0(dot)1:14295) rjuju=# select pg_backend_pid(), * from tt;
pg_backend_pid | id | val
----------------+----+--------
3327 | 1 | <NULL>
(1 row)

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message David G. Johnston 2023-02-01 07:21:25 Re: invisible commit question for sync replication
Previous Message qihua wu 2023-02-01 06:52:49 invisible commit question for sync replication