RE: Exit walsender before confirming remote flush in logical replication
Hayato Kuroda (Fujitsu) <kuroda.hayato@fujitsu.com>
From: "Hayato Kuroda (Fujitsu)" <kuroda.hayato@fujitsu.com>
To: 'Kyotaro Horiguchi' <horikyota.ntt@gmail.com>
Cc: "amit.kapila16@gmail.com" <amit.kapila16@gmail.com>, "dilipbalaut@gmail.com" <dilipbalaut@gmail.com>, "pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2023-01-16T11:09:24Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add wal_sender_shutdown_timeout GUC to limit shutdown wait for replication
- a8f45dee9176 19 (unreleased) landed
-
pg_upgrade: Add --copy option
- 746915c68669 16.0 cited
-
Prevent possibility of panics during shutdown checkpoint.
- c6c333436491 10.0 cited
-
Support clean switchover.
- 985bd7d49726 9.4.0 cited
Attachments
- v4-0001-Exit-walsender-before-confirming-remote-flush-in-.patch (application/octet-stream) patch v4-0001
Dear Horiguchi-san, > If I'm grabbing the discussion here correctly, in my memory, it is > because: physical replication needs all records that have written on > primary are written on standby for switchover to succeed. It is > annoying that normal shutdown occasionally leads to switchover > failure. Thus WalSndDone explicitly waits for remote flush/write > regardless of the setting of synchronous_commit. AFAIK the condition (sentPtr == replicatedPtr) seemed to be introduced for the purpose[1]. You meant to say that the conditon (!pq_is_send_pending()) has same motivation, right? > Thus apply delay > doesn't affect shutdown (AFAICS), and that is sufficient since all the > records will be applied at the next startup. I was not clear the word "next startup", but I agreed that we can shut down the walsender in case of recovery_min_apply_delay > 0 and synchronous_commit = remote_apply. The startup process will be not terminated even if the primary crashes, so I think the process will apply the transaction sooner or later. > In logical replication apply preceeds write and flush so we have no > indication whether a record is "replicated" to standby by other than > apply LSN. On the other hand, logical recplication doesn't have a > business with switchover so that assurarance is useless. Thus I think > we can (practically) ignore apply_lsn at shutdown. It seems subtly > irregular, though. Another consideration is that the condition (!pq_is_send_pending()) ensures that there are no pending messages, including other packets. Currently we force walsenders to clean up all messages before shutting down, even if it is a keepalive one. I cannot have any problems caused by this, but I can keep the condition in case of logical replication. I updated the patch accordingly. Also, I found that the previous version did not work well in case of streamed transactions. When a streamed transaction is committed on publisher but the application is delayed on subscriber, the process sometimes waits until there is no pending write. This is done in ProcessPendingWrites(). I added another termination path in the function. [1]: https://github.com/postgres/postgres/commit/985bd7d49726c9f178558491d31a570d47340459 Best Regards, Hayato Kuroda FUJITSU LIMITED