From a0c75f55394fe904e09f7caee9a8195e3a09c801 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Fri, 21 Jan 2011 22:20:06 -0500
Subject: [PATCH] Avoid treating WAL senders as normal backends.

The previous coding treated anything that wasn't an autovacuum launcher
as a normal backend, which is wrong now that we also have WAL senders.

Fujii Masao, reviewed by Robert Haas, Alvaro Herrera, Tom Lane,
and Bernd Helmle.
---
 src/backend/postmaster/postmaster.c | 52 +++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 14 deletions(-)

diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 179048f32d1..8f77d1bfc97 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -3167,13 +3167,25 @@ SignalSomeChildren(int signal, int target)
 
 		if (bp->dead_end)
 			continue;
-		if (!(target & BACKEND_TYPE_NORMAL) && !bp->is_autovacuum)
-			continue;
-		if (!(target & BACKEND_TYPE_AUTOVAC) && bp->is_autovacuum)
-			continue;
-		if (!(target & BACKEND_TYPE_WALSND) &&
-			IsPostmasterChildWalSender(bp->child_slot))
-			continue;
+
+		/*
+		 * Since target == BACKEND_TYPE_ALL is the most common case,
+		 * we test it first and avoid touching shared memory for
+		 * every child.
+		 */
+		if (target != BACKEND_TYPE_ALL)
+		{
+			int			child;
+
+			if (bp->is_autovacuum)
+				child = BACKEND_TYPE_AUTOVAC;
+			else if (IsPostmasterChildWalSender(bp->child_slot))
+				child = BACKEND_TYPE_WALSND;
+			else
+				child = BACKEND_TYPE_NORMAL;
+			if (!(target & child))
+				continue;
+		}
 
 		ereport(DEBUG4,
 				(errmsg_internal("sending signal %d to process %d",
@@ -4380,13 +4392,25 @@ CountChildren(int target)
 
 		if (bp->dead_end)
 			continue;
-		if (!(target & BACKEND_TYPE_NORMAL) && !bp->is_autovacuum)
-			continue;
-		if (!(target & BACKEND_TYPE_AUTOVAC) && bp->is_autovacuum)
-			continue;
-		if (!(target & BACKEND_TYPE_WALSND) &&
-			IsPostmasterChildWalSender(bp->child_slot))
-			continue;
+
+		/*
+		 * Since target == BACKEND_TYPE_ALL is the most common case,
+		 * we test it first and avoid touching shared memory for
+		 * every child.
+		 */
+		if (target != BACKEND_TYPE_ALL)
+		{
+			int			child;
+
+			if (bp->is_autovacuum)
+				child = BACKEND_TYPE_AUTOVAC;
+			else if (IsPostmasterChildWalSender(bp->child_slot))
+				child = BACKEND_TYPE_WALSND;
+			else
+				child = BACKEND_TYPE_NORMAL;
+			if (!(target & child))
+				continue;
+		}
 
 		cnt++;
 	}
-- 
GitLab