diff --git a/pgxn/neon/libpagestore.c b/pgxn/neon/libpagestore.c index 5db9e5e08e..574e68af66 100644 --- a/pgxn/neon/libpagestore.c +++ b/pgxn/neon/libpagestore.c @@ -35,7 +35,8 @@ #define PageStoreTrace DEBUG5 -#define RECONNECT_INTERVAL_USEC 1000000 +#define MAX_RECONNECT_INTERVAL_USEC 100 +#define MAX_RECONNECT_INTERVAL_USEC 1000000 bool connected = false; PGconn *pageserver_conn = NULL; @@ -134,7 +135,9 @@ pageserver_connect(int elevel) int n; static TimestampTz last_connect_time = 0; + static uint64_t delay_us = MIN_RECONNECT_INTERVAL_USEC; TimestampTz now; + uint64_t us_since_last_connect; Assert(!connected); @@ -144,13 +147,18 @@ pageserver_connect(int elevel) } now = GetCurrentTimestamp(); - if ((now - last_connect_time) < RECONNECT_INTERVAL_USEC) + us_since_last_connect = now - last_connect_time; + if (us_since_last_connect < delay_us) { - pg_usleep(RECONNECT_INTERVAL_USEC); + pg_usleep(delay_us - us_since_last_connect); + delay_us *= 2; + if (delay_us > MAX_RECONNECT_INTERVAL_USEC) + delay_us = MAX_RECONNECT_INTERVAL_USEC; last_connect_time = GetCurrentTimestamp(); } else { + delay_us = MIN_RECONNECT_INTERVAL_USEC; last_connect_time = now; }