From ca5646fc824abe606e2cc78dff89631b0e875e27 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 13 Feb 2009 17:12:04 +0000
Subject: [PATCH] Fix UNLISTEN to fall out quickly if the current backend has
 never executed any LISTEN command.  This is more important than it used to be
 because DISCARD ALL invokes UNLISTEN.  Connection-pooled applications making
 heavy use of DISCARD ALL were seeing significant contention for pg_listener,
 as reported by Matteo Beccati.  It seems unlikely that clients using LISTEN
 would use pooled connections, so this simple tweak seems sufficient,
 especially since the pg_listener implementation is slated to go away soon
 anyway.

Back-patch to 8.3, where DISCARD ALL was introduced.
---
 src/backend/commands/async.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index 5e38ec154b6..745f4558537 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.145 2009/01/01 17:23:37 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.146 2009/02/13 17:12:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -277,6 +277,10 @@ Async_Unlisten(const char *relname)
 	if (Trace_notify)
 		elog(DEBUG1, "Async_Unlisten(%s,%d)", relname, MyProcPid);
 
+	/* If we couldn't possibly be listening, no need to queue anything */
+	if (pendingActions == NIL && !unlistenExitRegistered)
+		return;
+
 	queue_listen(LISTEN_UNLISTEN, relname);
 }
 
@@ -291,6 +295,10 @@ Async_UnlistenAll(void)
 	if (Trace_notify)
 		elog(DEBUG1, "Async_UnlistenAll(%d)", MyProcPid);
 
+	/* If we couldn't possibly be listening, no need to queue anything */
+	if (pendingActions == NIL && !unlistenExitRegistered)
+		return;
+
 	queue_listen(LISTEN_UNLISTEN_ALL, "");
 }
 
-- 
GitLab