I think this is the problem: When a child is reaped normally after
exiting due to MaxSpareServers or MaxRequestsPerChild, it remains in
the scoreboard with status set to SERVER_DEAD, and it is removed from
the pid table.
Often that slot will be reused by a child created subsequently.
If it is never reused before termination or hard restart,
reclaim_child_processes() will see it in this code and complain that
it isn't in the pid table:
for (i = 0; i < max_daemons_limit; ++i) {
int pid = ap_scoreboard_image->parent[i].pid;
if (pid == my_pid || pid == 0)
continue;
if (!in_pid_table(pid)) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
"Bad pid (%d) in scoreboard slot %d", pid, i);
continue;
}
But it doesn't need to complain if the child is in the scoreboard with
state SERVER_DEAD, since that means it exited previously and is out of
the pid table.
Here's a hack to look out for that situation:
if (!in_pid_table(pid)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, server_conf,
- "Bad pid (%d) in scoreboard slot %d", pid, i);
+ /* Report an error if the scoreboard state for this child is
+ * something besides SERVER_DEAD or if we can't find the
+ * child slot.
+ *
+ * It is okay to find it with state SERVER_DEAD. The child
+ * exited normally, the state was set to SERVER_DEAD, and we
+ * didn't subsequently reuse that scoreboard slot for another
+ * child.
+ */
+ int child_slot = find_child_by_pid(pid);
+
+ if (child_slot < 0
+ ||
ap_scoreboard_image->servers[child_slot].status != SERVER_DEAD) {
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
server_conf,
+ "Bad pid (%d) in scoreboard slot %d", pid, i);
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR,
server_conf,
+ "avoided bad pid msg for %d;
child_slot %d, status %d",
+ pid, child_slot, child_slot >= 0 ?
ap_scoreboard_image->servers[child_slot].status : -1);
+ }
continue;
}
The "avoided bad pid" msg is just for debugging, of course.
This is perhaps not cool on whatever imaginary machines keep the
scoreboard in a file. I never fully grokked the sync-scoreboard-image
requirements.