Hi, I found the bug about archive_timeout parameter. There is the case archive_timeout parameter is ignored after recovery works.
[Problem] When the value of archive_timeout is smaller than that of checkpoint_timeout and recovery works, archive_timeout is ignored in the first WAL archiving. Once WAL is archived, the archive_timeout seems to be valid after that. I attached the simple script for reproducing this problem on version 12. I also confirmed that PostgreSQL10, 11 and 12. I think other supported versions have this problem. [Investigation] In the CheckpointerMain(), calculate the time (cur_timeout) to wait on WaitLatch. ----------------------------------------------------------------- now = (pg_time_t) time(NULL); elapsed_secs = now - last_checkpoint_time; if (elapsed_secs >= CheckPointTimeout) continue; /* no sleep for us ... */ cur_timeout = CheckPointTimeout - elapsed_secs; 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); } (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, cur_timeout * 1000L /* convert to ms */ , WAIT_EVENT_CHECKPOINTER_MAIN); ----------------------------------------------------------------- Currently, cur_timeout is set according to only checkpoint_timeout when it is during recovery. Even during recovery, the cur_timeout should be calculated including archive_timeout as well as checkpoint_timeout, I think. I attached the patch to solve this problem. Regards, Daisuke, Higuchi
archive_timeout_test.sh
Description: archive_timeout_test.sh
archive_timeout.patch
Description: archive_timeout.patch