From 5524b8ed3819f6764c09eaa85d8f68b955f79d9d Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Wed, 8 Aug 2018 15:37:09 +0200 Subject: [PATCH] pgsql: Avoid excessive latency on frequent ping()s. --- lib/modules/Sql.pmod/pgsql.h | 1 + lib/modules/Sql.pmod/pgsql.pike | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql.h b/lib/modules/Sql.pmod/pgsql.h index 67d8301899..e2fb97ef9f 100644 --- a/lib/modules/Sql.pmod/pgsql.h +++ b/lib/modules/Sql.pmod/pgsql.h @@ -30,6 +30,7 @@ #define QUERYTIMEOUT 4095 // Queries running longer than this number // of seconds are canceled automatically #define PORTALBUFFERSIZE (32*1024) // Approximate buffer per portal +#define MINPINGINTERVAL 4 // minimum seconds between ping()s #define BACKOFFDELAY 1 #define PGSQL_DEFAULT_PORT 5432 diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index d968066088..948a6707f9 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -80,6 +80,7 @@ private int portalbuffersize = PORTALBUFFERSIZE; private int timeout = QUERYTIMEOUT; private array connparmcache; private int reconnected; +private int lastping = time(1); protected string _sprintf(int type) { string res; @@ -253,9 +254,15 @@ protected void create(void|string host, void|string database, //! @seealso //! @[is_open()] /*semi*/final int ping() { + int t, ret; waitauthready(); - return is_open() - && !catch(proxy.c->start()->sendcmd(FLUSHSEND)) ? !!reconnected : -1; + if ((ret = is_open()) + // Pinging more frequently than MINPINGINTERVAL seconds + // is suppressed to avoid artificial TCP-ACK latency + && (t = time(1)) - lastping > MINPINGINTERVAL + && (ret = !catch(proxy.c->start()->sendcmd(FLUSHSEND)))) + lastping = t; + return ret ? !!reconnected : -1; } //! Cancels all currently running queries in this session. -- GitLab