mirror of
https://github.com/postgres/postgres.git
synced 2025-10-15 05:46:52 +03:00
For cascading replication, wake physical and logical walsenders separately
Physical walsenders can't send data until it's been flushed; logical walsenders can't decode and send data until it's been applied. On the standby, the WAL is flushed first, which will only wake up physical walsenders; and then applied, which will only wake up logical walsenders. Previously, all walsenders were awakened when the WAL was flushed. That was fine for logical walsenders on the primary; but on the standby the flushed WAL would have been not applied yet, so logical walsenders were awakened too early. Per idea from Jeff Davis and Amit Kapila. Author: "Drouvot, Bertrand" <bertranddrouvot.pg@gmail.com> Reviewed-By: Jeff Davis <pgsql@j-davis.com> Reviewed-By: Robert Haas <robertmhaas@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Discussion: https://postgr.es/m/CAA4eK1+zO5LUeisabX10c81LU-fWMKO4M9Wyg1cdkbW7Hqh6vQ@mail.gmail.com
This commit is contained in:
@@ -2645,7 +2645,7 @@ XLogFlush(XLogRecPtr record)
|
||||
END_CRIT_SECTION();
|
||||
|
||||
/* wake up walsenders now that we've released heavily contended locks */
|
||||
WalSndWakeupProcessRequests();
|
||||
WalSndWakeupProcessRequests(true, !RecoveryInProgress());
|
||||
|
||||
/*
|
||||
* If we still haven't flushed to the request point then we have a
|
||||
@@ -2816,7 +2816,7 @@ XLogBackgroundFlush(void)
|
||||
END_CRIT_SECTION();
|
||||
|
||||
/* wake up walsenders now that we've released heavily contended locks */
|
||||
WalSndWakeupProcessRequests();
|
||||
WalSndWakeupProcessRequests(true, !RecoveryInProgress());
|
||||
|
||||
/*
|
||||
* Great, done. To take some work off the critical path, try to initialize
|
||||
@@ -5765,7 +5765,7 @@ StartupXLOG(void)
|
||||
* If there were cascading standby servers connected to us, nudge any wal
|
||||
* sender processes to notice that we've been promoted.
|
||||
*/
|
||||
WalSndWakeup();
|
||||
WalSndWakeup(true, true);
|
||||
|
||||
/*
|
||||
* If this was a promotion, request an (online) checkpoint now. This isn't
|
||||
|
Reference in New Issue
Block a user