postgres.git / summary / log / commit / refs

commit    2fed5731a39643ddbf9e9127a75664dfd4b21877
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Fri Jun 19 15:44:33 2015 +0000
First released in: 9.5.0, 9.0.23, 9.1.19, 9.2.14, 9.3.10, 9.4.5

    Clamp autovacuum launcher sleep time to 5 minutes
    
    This avoids the problem that it might go to sleep for an unreasonable
    amount of time in unusual conditions like the server clock moving
    backwards an unreasonable amount of time.
    
    (Simply moving the server clock forward again doesn't solve the problem
    unless you wake up the autovacuum launcher manually, say by sending it
    SIGHUP).
    
    Per trouble report from Prakash Itnal in
    https://www.postgresql.org/message-id/CAHC5u79-UqbapAABH2t4Rh2eYdyge0Zid-X=Xz-ZWZCBK42S0Q@mail.gmail.com
    
    Analyzed independently by Haribabu Kommi and Tom Lane.


src/backend/postmaster/autovacuum.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index aa4f6636e61..e31d454d019 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -120,6 +120,7 @@ int Log_autovacuum_min_duration = -1; /* the minimum allowed time between two awakenings of the launcher */ #define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */ +#define MAX_AUTOVAC_SLEEPTIME 300 /* seconds */ /* Flags to tell if we are in an autovacuum process */ static bool am_autovacuum_launcher = false; @@ -863,6 +864,15 @@ launcher_determine_sleep(bool canlaunch, bool recursing, struct timeval * nap) nap->tv_sec = 0; nap->tv_usec = MIN_AUTOVAC_SLEEPTIME * 1000; } + + /* + * If the sleep time is too large, clamp it to an arbitrary maximum (plus + * any fractional seconds, for simplicity). This avoids an essentially + * infinite sleep in strange cases like the system clock going backwards a + * few years. + */ + if (nap->tv_sec > MAX_AUTOVAC_SLEEPTIME) + nap->tv_sec = MAX_AUTOVAC_SLEEPTIME; } /* [parent: 6ab1a53dd595]