From b982c0c65ab5cf6c24d13a28a6cc32061efcccc9 Mon Sep 17 00:00:00 2001
From: "Stephen R. van den Berg" <srb@cuci.nl>
Date: Fri, 14 Oct 2016 10:49:34 +0200
Subject: [PATCH] pgsql: Drop callbacks on destruct of conxion, force short
 close.

---
 lib/modules/Sql.pmod/pgsql.pike      |  2 +-
 lib/modules/Sql.pmod/pgsql_util.pmod | 13 +++++++++----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index 30c93353f0..afcf57d391 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -316,7 +316,7 @@ private .pgsql_util.conxion getsocket(void|int nossl) {
   .pgsql_util.conxion lcon=getsocket(2);
   lcon->add_int32(16)->add_int32(PG_PROTOCOL(1234,5678))
    ->add_int32(backendpid)->add(cancelsecret)->sendcmd(FLUSHSEND);
-  lcon=0;
+  destruct(lcon);		// Destruct explicitly to avoid delayed close
 #ifdef PG_DEBUGMORE
   PD("Closetrace %O\n",backtrace());
 #endif
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index f0077a1455..fff0261f78 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -279,10 +279,14 @@ class conxion {
   }
 
   private int write_cb() {
-    Thread.MutexKey lock=shortmux->lock();
-    towrite-=output_to(socket,towrite);
-    lock=0;
-    if(!i->fillread && !sizeof(this))
+    Thread.MutexKey lock = shortmux->lock();
+    towrite -= output_to(socket,towrite);
+    lock = 0;
+#ifdef PG_DEBUG
+    if (!i->fillread)
+      PD("%d>Delayed close to go %d\n", socket->query_fd(), sizeof(this));
+#endif
+    if (!i->fillread && !sizeof(this))
       close();
     return 0;
   }
@@ -364,6 +368,7 @@ outer:
   }
 
   protected void destroy() {
+    PD("%d>Close conxion %d\n", socket ? socket->query_fd() : -1, !!nostash);
     if(nostash) {
       catch {
         while(sizeof(closecallbacks))
-- 
GitLab