You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Rob Hartill <ro...@imdb.com> on 1997/01/15 23:10:06 UTC

Bug report (fwd)

Not acked. Someone who understands the implications of the patch
should ack this...

No version number. I'm asuming it's against 1.1


---------- Forwarded message ----------
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);
! 	    }

  	}