diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 58e298af89..ef486ca92c 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1674,33 +1674,38 @@ WalSndFilterStandbySlots(XLogRecPtr wait_for_lsn, List **standby_slots) continue; } - - /* - * It may happen that the slot specified in standby_slot_names GUC - * value is dropped, so let's skip over it. - */ else if (!slot) + { + /* + * It may happen that the slot specified in standby_slot_names GUC + * value is dropped, so let's skip over it. + */ warningfmt = _("replication slot \"%s\" specified in parameter \"%s\" does not exist, ignoring"); - - /* - * If a logical slot name is provided in standby_slot_names, issue a - * WARNING and skip it. Although logical slots are disallowed in the - * GUC check_hook(validate_standby_slots), it is still possible for a - * user to drop an existing physical slot and recreate a logical slot - * with the same name. Since it is harmless, a WARNING should be - * enough, no need to error-out. - */ + } else if (SlotIsLogical(slot)) + { + /* + * If a logical slot name is provided in standby_slot_names, issue + * a WARNING and skip it. Although logical slots are disallowed in + * the GUC check_hook(validate_standby_slots), it is still possible + * for a user to drop an existing physical slot and recreate a + * logical slot with the same name. Since it is harmless, a WARNING + * should be enough, no need to error-out. + */ warningfmt = _("cannot have logical replication slot \"%s\" in parameter \"%s\", ignoring"); - - /* - * Specified physical slot may have been invalidated, so no point in - * waiting for it. - */ + } else if (XLogRecPtrIsInvalid(restart_lsn) || invalidated) + { + /* + * Specified physical slot may have been invalidated, so no point in + * waiting for it. + */ warningfmt = _("physical slot \"%s\" specified in parameter \"%s\" has been invalidated, ignoring"); + } else + { Assert(restart_lsn >= wait_for_lsn); + } /* * Reaching here indicates that either the slot has passed the @@ -1768,9 +1773,9 @@ WalSndWaitForStandbyConfirmation(XLogRecPtr wait_for_lsn) /* * Wait till WAL < loc is flushed to disk so it can be safely sent to client. * - * If the walsender holds a logical slot that has enabled failover, the - * function also waits for all the specified streaming replication standby - * servers to confirm receipt of WAL up to RecentFlushPtr. + * If the walsender holds a logical slot that has enabled failover, we also + * wait for all the specified streaming replication standby servers to + * confirm receipt of WAL up to RecentFlushPtr. * * Returns end LSN of flushed WAL. Normally this will be >= loc, but if we * detect a shutdown request (either from postmaster or client) we will return @@ -1790,7 +1795,7 @@ WalSndWaitForWal(XLogRecPtr loc) /* * Check if all the standby servers have confirmed receipt of WAL up to - * RecentFlushPtr if we already know we have enough WAL available. + * RecentFlushPtr even when we already know we have enough WAL available. * * Note that we cannot directly return without checking the status of * standby servers because the standby_slot_names may have changed, which @@ -1892,7 +1897,10 @@ WalSndWaitForWal(XLogRecPtr loc) wait_for_standby = true; } else + { + /* already caught up and doesn't need to wait for standby_slots */ break; + } /* Waiting for new WAL. Since we need to wait, we're now caught up. */ WalSndCaughtUp = true;