576df0
diff --git a/include/scoreboard.h b/include/scoreboard.h
576df0
index 9376da2..92d198d 100644
576df0
--- a/include/scoreboard.h
576df0
+++ b/include/scoreboard.h
576df0
@@ -148,7 +148,9 @@ struct process_score {
576df0
     apr_uint32_t lingering_close;   /* async connections in lingering close */
576df0
     apr_uint32_t keep_alive;        /* async connections in keep alive */
576df0
     apr_uint32_t suspended;         /* connections suspended by some module */
576df0
-    int bucket;             /* Listener bucket used by this child */
576df0
+    int bucket;  /* Listener bucket used by this child; this field is DEPRECATED
576df0
+                  * and no longer updated by the MPMs (i.e. always zero).
576df0
+                  */
576df0
 };
576df0
 
576df0
 /* Scoreboard is now in 'local' memory, since it isn't updated once created,
576df0
diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c
576df0
index ffe8a23..048ae61 100644
576df0
--- a/server/mpm/event/event.c
576df0
+++ b/server/mpm/event/event.c
576df0
@@ -2695,7 +2695,6 @@ static int make_child(server_rec * s, int slot, int bucket)
576df0
 
576df0
     ap_scoreboard_image->parent[slot].quiescing = 0;
576df0
     ap_scoreboard_image->parent[slot].not_accepting = 0;
576df0
-    ap_scoreboard_image->parent[slot].bucket = bucket;
576df0
     event_note_child_started(slot, pid);
576df0
     active_daemons++;
576df0
     retained->total_daemons++;
576df0
@@ -2734,6 +2733,7 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
          * that threads_per_child is always > 0 */
576df0
         int status = SERVER_DEAD;
576df0
         int child_threads_active = 0;
576df0
+        int bucket = i % num_buckets;
576df0
 
576df0
         if (i >= retained->max_daemons_limit &&
576df0
             free_length == retained->idle_spawn_rate[child_bucket]) {
576df0
@@ -2757,7 +2757,7 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
                  */
576df0
                 if (status <= SERVER_READY && !ps->quiescing && !ps->not_accepting
576df0
                     && ps->generation == retained->mpm->my_generation
576df0
-                    && ps->bucket == child_bucket)
576df0
+                    && bucket == child_bucket)
576df0
                 {
576df0
                     ++idle_thread_count;
576df0
                 }
576df0
@@ -2768,7 +2768,9 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
             last_non_dead = i;
576df0
         }
576df0
         active_thread_count += child_threads_active;
576df0
-        if (!ps->pid && free_length < retained->idle_spawn_rate[child_bucket])
576df0
+        if (!ps->pid
576df0
+                && bucket == child_bucket
576df0
+                && free_length < retained->idle_spawn_rate[child_bucket])
576df0
             free_slots[free_length++] = i;
576df0
         else if (child_threads_active == threads_per_child)
576df0
             had_healthy_child = 1;
576df0
@@ -2951,13 +2953,14 @@ static void server_main_loop(int remaining_children_to_start, int num_buckets)
576df0
                 retained->total_daemons--;
576df0
                 if (processed_status == APEXIT_CHILDSICK) {
576df0
                     /* resource shortage, minimize the fork rate */
576df0
-                    retained->idle_spawn_rate[ps->bucket] = 1;
576df0
+                    retained->idle_spawn_rate[child_slot % num_buckets] = 1;
576df0
                 }
576df0
                 else if (remaining_children_to_start) {
576df0
                     /* we're still doing a 1-for-1 replacement of dead
576df0
                      * children with new children
576df0
                      */
576df0
-                    make_child(ap_server_conf, child_slot, ps->bucket);
576df0
+                    make_child(ap_server_conf, child_slot,
576df0
+                               child_slot % num_buckets);
576df0
                     --remaining_children_to_start;
576df0
                 }
576df0
             }
576df0
diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c
576df0
index 8efda72..7c00625 100644
576df0
--- a/server/mpm/prefork/prefork.c
576df0
+++ b/server/mpm/prefork/prefork.c
576df0
@@ -637,8 +637,9 @@ static void child_main(int child_num_arg, int child_bucket)
576df0
 }
576df0
 
576df0
 
576df0
-static int make_child(server_rec *s, int slot, int bucket)
576df0
+static int make_child(server_rec *s, int slot)
576df0
 {
576df0
+    int bucket = slot % retained->mpm->num_buckets;
576df0
     int pid;
576df0
 
576df0
     if (slot + 1 > retained->max_daemons_limit) {
576df0
@@ -716,7 +717,6 @@ static int make_child(server_rec *s, int slot, int bucket)
576df0
         child_main(slot, bucket);
576df0
     }
576df0
 
576df0
-    ap_scoreboard_image->parent[slot].bucket = bucket;
576df0
     prefork_note_child_started(slot, pid);
576df0
 
576df0
     return 0;
576df0
@@ -732,7 +732,7 @@ static void startup_children(int number_to_start)
576df0
         if (ap_scoreboard_image->servers[i][0].status != SERVER_DEAD) {
576df0
             continue;
576df0
         }
576df0
-        if (make_child(ap_server_conf, i, i % retained->mpm->num_buckets) < 0) {
576df0
+        if (make_child(ap_server_conf, i) < 0) {
576df0
             break;
576df0
         }
576df0
         --number_to_start;
576df0
@@ -741,8 +741,6 @@ static void startup_children(int number_to_start)
576df0
 
576df0
 static void perform_idle_server_maintenance(apr_pool_t *p)
576df0
 {
576df0
-    static int bucket_make_child_record = -1;
576df0
-    static int bucket_kill_child_record = -1;
576df0
     int i;
576df0
     int idle_count;
576df0
     worker_score *ws;
576df0
@@ -789,6 +787,7 @@ static void perform_idle_server_maintenance(apr_pool_t *p)
576df0
     }
576df0
     retained->max_daemons_limit = last_non_dead + 1;
576df0
     if (idle_count > ap_daemons_max_free) {
576df0
+        static int bucket_kill_child_record = -1;
576df0
         /* kill off one child... we use the pod because that'll cause it to
576df0
          * shut down gracefully, in case it happened to pick up a request
576df0
          * while we were counting
576df0
@@ -819,10 +818,7 @@ static void perform_idle_server_maintenance(apr_pool_t *p)
576df0
                     idle_count, total_non_dead);
576df0
             }
576df0
             for (i = 0; i < free_length; ++i) {
576df0
-                bucket_make_child_record++;
576df0
-                bucket_make_child_record %= retained->mpm->num_buckets;
576df0
-                make_child(ap_server_conf, free_slots[i],
576df0
-                           bucket_make_child_record);
576df0
+                make_child(ap_server_conf, free_slots[i]);
576df0
             }
576df0
             /* the next time around we want to spawn twice as many if this
576df0
              * wasn't good enough, but not if we've just done a graceful
576df0
@@ -867,7 +863,7 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
576df0
 
576df0
     if (one_process) {
576df0
         AP_MONCONTROL(1);
576df0
-        make_child(ap_server_conf, 0, 0);
576df0
+        make_child(ap_server_conf, 0);
576df0
         /* NOTREACHED */
576df0
         ap_assert(0);
576df0
         return !OK;
576df0
@@ -976,8 +972,7 @@ static int prefork_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
576df0
                     /* we're still doing a 1-for-1 replacement of dead
576df0
                      * children with new children
576df0
                      */
576df0
-                    make_child(ap_server_conf, child_slot,
576df0
-                               ap_get_scoreboard_process(child_slot)->bucket);
576df0
+                    make_child(ap_server_conf, child_slot);
576df0
                     --remaining_children_to_start;
576df0
                 }
576df0
 #if APR_HAS_OTHER_CHILD
576df0
diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c
576df0
index 8012fe2..a927942 100644
576df0
--- a/server/mpm/worker/worker.c
576df0
+++ b/server/mpm/worker/worker.c
576df0
@@ -1339,7 +1339,6 @@ static int make_child(server_rec *s, int slot, int bucket)
576df0
         worker_note_child_lost_slot(slot, pid);
576df0
     }
576df0
     ap_scoreboard_image->parent[slot].quiescing = 0;
576df0
-    ap_scoreboard_image->parent[slot].bucket = bucket;
576df0
     worker_note_child_started(slot, pid);
576df0
     return 0;
576df0
 }
576df0
@@ -1388,6 +1387,7 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
         int any_dead_threads = 0;
576df0
         int all_dead_threads = 1;
576df0
         int child_threads_active = 0;
576df0
+        int bucket = i % num_buckets;
576df0
 
576df0
         if (i >= retained->max_daemons_limit &&
576df0
             totally_free_length == retained->idle_spawn_rate[child_bucket]) {
576df0
@@ -1420,7 +1420,7 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
                 if (status <= SERVER_READY &&
576df0
                         !ps->quiescing &&
576df0
                         ps->generation == retained->mpm->my_generation &&
576df0
-                        ps->bucket == child_bucket) {
576df0
+                        bucket == child_bucket) {
576df0
                     ++idle_thread_count;
576df0
                 }
576df0
                 if (status >= SERVER_READY && status < SERVER_GRACEFUL) {
576df0
@@ -1430,6 +1430,7 @@ static void perform_idle_server_maintenance(int child_bucket, int num_buckets)
576df0
         }
576df0
         active_thread_count += child_threads_active;
576df0
         if (any_dead_threads
576df0
+                && bucket == child_bucket
576df0
                 && totally_free_length < retained->idle_spawn_rate[child_bucket]
576df0
                 && free_length < MAX_SPAWN_RATE / num_buckets
576df0
                 && (!ps->pid               /* no process in the slot */
576df0
@@ -1615,14 +1616,15 @@ static void server_main_loop(int remaining_children_to_start, int num_buckets)
576df0
                 ps->quiescing = 0;
576df0
                 if (processed_status == APEXIT_CHILDSICK) {
576df0
                     /* resource shortage, minimize the fork rate */
576df0
-                    retained->idle_spawn_rate[ps->bucket] = 1;
576df0
+                    retained->idle_spawn_rate[child_slot % num_buckets] = 1;
576df0
                 }
576df0
                 else if (remaining_children_to_start
576df0
                     && child_slot < ap_daemons_limit) {
576df0
                     /* we're still doing a 1-for-1 replacement of dead
576df0
                      * children with new children
576df0
                      */
576df0
-                    make_child(ap_server_conf, child_slot, ps->bucket);
576df0
+                    make_child(ap_server_conf, child_slot,
576df0
+                               child_slot % num_buckets);
576df0
                     --remaining_children_to_start;
576df0
                 }
576df0
             }