[HACKERS] archive_timeout ignored directly after promotion
От | Andres Freund |
---|---|
Тема | [HACKERS] archive_timeout ignored directly after promotion |
Дата | |
Msg-id | 20170621175838.3kva7ajqk5qru657@alap3.anarazel.de обсуждение исходный текст |
Ответы |
Re: [HACKERS] archive_timeout ignored directly after promotion
|
Список | pgsql-hackers |
Hi, When promoting a standby without using the "fast promotion" logic, e.g. by using recovery targets (which doesn't use fast promotion for unbeknownst to me reasons), checkpointer doesn't necessarily respect archive timeout for the first cycle after promotion. The reason for that is that it determines the sleep times like if (XLogArchiveTimeout > 0 && !RecoveryInProgress()) { elapsed_secs= now - last_xlog_switch_time; if (elapsed_secs >= XLogArchiveTimeout) continue; /*no sleep for us ... */ cur_timeout = Min(cur_timeout, XLogArchiveTimeout - elapsed_secs); } and RecoveryInProgress() will still return true. We just fudge that when creating the end-of-recovery checkpoint: /* * The end-of-recovery checkpoint is a real checkpoint that's * performed while we're still in recovery. */ if (flags & CHECKPOINT_END_OF_RECOVERY) do_restartpoint = false; One easy way to fix that would be to just wakeup the checkpointer from the startup process once at the end of recovery, but it'd not be pretty. I think it'd be better to change the do_restartpoint = RecoveryInProgress(); /* * The end-of-recovery checkpoint is a real checkpoint that's * performed while we're still inrecovery. */ if (flags & CHECKPOINT_END_OF_RECOVERY) do_restartpoint = false; into having a per-loop 'local_in_recovery' variable, that we turn off once a CHECKPOINT_END_OF_RECOVERY checkpoint is requested. Comments? Greetings, Andres Freund
В списке pgsql-hackers по дате отправления: