You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Randy Terbush <ra...@zyzzyva.com> on 1997/01/25 16:29:03 UTC

Re: [PATCH] make_child and SERVER_STARTING forever

+1

> I'd like to apply this as well, but I can't until I can commit
> the other patch to http_main.c.
> 
> .....Roy
> 
> Date: Wed, 15 Jan 1997 16:44:55 -0500
> From: Phillip Vandry <va...@staple.mlink.net>
> To: apache-bugs@apache.org
> Subject: Bug report
> 
> We operate a fairly large Apache server (half a million hits per day)
> under Solaris 2.5 and we are experiencing hanging problems, where the
> server will occasionally block, and connections are accepted, but no
> requests are processed for 40 or 50 seconds or more.
> 
> I think the following bug is part of the problem, but not all of it.
> 
> If a child fails to initialize and craps out, it will be reaped by the
> main process and the scoreboard will be updated to SERVER_DEAD. But
> if the fork() in make_child() fails, the scoreboard will continue
> to say SERVER_STARTING forever. Eventually, the main process will
> refuse to start new children because count_idle_servers() will count those
> SERVER_STARTING entries and will always report that there are enough
> idle servers.
> 
> Thanks.
> -Phil
> 
> *** http_main.c	1997/01/09 15:14:53	1.2
> --- http_main.c	1997/01/15 21:30:09
> ***************
> *** 1675,1681 ****
>       }
>   }
> 
> ! void make_child(server_rec *server_conf, int child_num)
>   {
>       int pid;
> 
> --- 1675,1681 ----
>       }
>   }
> 
> ! int make_child(server_rec *server_conf, int child_num)
>   {
>       int pid;
> 
> ***************
> *** 1693,1699 ****
>              over and over again. */
>   	sleep(10);
> 
> ! 	return;
>       }
> 
>       if (!pid) {
> --- 1693,1699 ----
>              over and over again. */
>   	sleep(10);
> 
> ! 	return -1;
>       }
> 
>       if (!pid) {
> ***************
> *** 1701,1706 ****
> --- 1701,1707 ----
>   	signal (SIGTERM, (void (*)())just_die);
>   	child_main (child_num);
>       }
> +     return 0;
>   }
> 
>   static int
> ***************
> *** 1974,1980 ****
>   	    Explain1("Starting new child in slot %d",child_slot);
>   	    (void)update_child_status(child_slot,SERVER_STARTING,
>   	     (request_rec*)NULL);
> ! 	    make_child(server_conf, child_slot);
> 
>   	}
> 
> --- 1975,1986 ----
>   	    Explain1("Starting new child in slot %d",child_slot);
>   	    (void)update_child_status(child_slot,SERVER_STARTING,
>   	     (request_rec*)NULL);
> ! 	    if (make_child(server_conf, child_slot) < 0) {
> ! 		/* fork didn't succeed. Fix the scoreboard or else
> ! 		   it will say SERVER_STRATING forever and ever */
> ! 	        (void)update_child_status(child_slot,SERVER_DEAD,
> ! 	             (request_rec*)NULL);
> ! 	    }
> 
>   	}