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