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