Re: Logical replication timeout problem
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Fabrice Chapuis <fabrice636861@gmail.com>,
Simon Riggs <simon.riggs@enterprisedb.com>, Petr Jelinek <petr.jelinek@enterprisedb.com>
Cc: "wangw.fnst@fujitsu.com" <wangw.fnst@fujitsu.com>, "tanghy.fnst@fujitsu.com" <tanghy.fnst@fujitsu.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-01-22T11:11:42Z
Lists: pgsql-hackers
On Fri, Jan 21, 2022 at 10:45 PM Fabrice Chapuis <fabrice636861@gmail.com> wrote: > > I keep your patch 0001 and I add these two calls in function WalSndUpdateProgress without modifying WalSndKeepaliveIfNecessary, it works too. > What do your think of this patch? > I think this will also work. Here, the point was to just check what is the exact problem and the possible approach to solve it, the actual patch might be different from these ideas. So, let me try to summarize the problem and the possible approach to solve it so that others can also share their opinion. Here, the problem is that we don't send keep-alive messages for a long time while processing large transactions during logical replication where we don't send any data of such transactions (say because the table modified in the transaction is not published). We do try to send the keep_alive if necessary at the end of the transaction (via WalSndWriteData()) but by that time the subscriber-side can timeout and exit. Now, one idea to solve this problem could be that whenever we skip sending any change we do try to update the plugin progress via OutputPluginUpdateProgress(for walsender, it will invoke WalSndUpdateProgress), and there it tries to process replies and send keep_alive if necessary as we do when we send some data via OutputPluginWrite(for walsender, it will invoke WalSndWriteData). I don't know whether it is a good idea to invoke such a mechanism for every change we skip to send or we should do it after we skip sending some threshold of continuous changes. I think later would be preferred. Also, we might want to introduce a new parameter send_keep_alive to this API so that there is flexibility to invoke this mechanism as we don't need to invoke it while we are actually sending data and before that, we just update the progress via this API. Thoughts? Note: I have added Simon and Petr J. to this thread as they introduced the API OutputPluginUpdateProgress in commit 024711bb54 and know this part of code/design well but ideas suggestions from everyone are welcome. -- With Regards, Amit Kapila.
Commits
-
Fix the logical replication timeout during large DDLs.
- 8c58624df462 16.0 landed
-
Fix the logical replication timeout during large transactions.
- f95d53eded55 15.0 landed
- d6da71fa8f28 14.4 landed
- 55558df23741 13.8 landed
- f832b5007c1c 12.12 landed
- 87c1dd246af8 11.17 landed
- a4015ec0375d 10.22 landed
-
Rethink the delay-checkpoint-end mechanism in the back-branches.
- 10520f434687 14.3 cited
-
Revert "Logical decoding of sequences"
- 2c7ea57e56ca 15.0 cited
-
Skip empty transactions for logical replication.
- d5a9d86d8ffc 15.0 cited
-
Allow specifying column lists for logical replication
- 923def9a533a 15.0 cited
-
Add decoding of sequences to built-in replication
- 75b1521dae1f 15.0 cited
-
Fix ABI break introduced by commit 4daa140a2f.
- 56e366f6757d 13.4 cited
-
Lag tracking for logical replication
- 024711bb5446 10.0 cited