OSDN Git Service

Avoid treating WAL senders as normal backends.
authorRobert Haas <rhaas@postgresql.org>
Sat, 22 Jan 2011 03:20:06 +0000 (22:20 -0500)
committerRobert Haas <rhaas@postgresql.org>
Sat, 22 Jan 2011 03:23:01 +0000 (22:23 -0500)
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

index 179048f..8f77d1b 100644 (file)
@@ -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++;
        }