You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Ben Laurie <be...@gonzo.ben.algroup.co.uk> on 1995/12/08 20:32:38 UTC

And this time - GET IT RIGHT!!!

From: ben@algroup.co.uk (Ben Laurie)
Subject: Cure scoreboard race condition
Affects: http_main.c scoreboard.h
Changelog: On heavily loaded servers it was possible for the scoreboard to
	get out of sync with reality, as a result of a race condition. The
	observed symptoms are far more Apaches running than should be, and
	heavy system loads, generally followed by catastrophic system failure.

*** http_main.c.old	Fri Dec  8 18:59:11 1995
--- http_main.c	Fri Dec  8 19:26:22 1995
***************
*** 433,439 ****
      int res = 0;
  
      for (i = 0; i < HARD_SERVER_MAX; ++i)
! 	if (scoreboard_image[i].status == SERVER_READY)
  	    ++res;
  
      return res;
--- 433,440 ----
      int res = 0;
  
      for (i = 0; i < HARD_SERVER_MAX; ++i)
! 	if (scoreboard_image[i].status == SERVER_READY
! 	  || scoreboard_image[i].status == SERVER_STARTING)
  	    ++res;
  
      return res;
***************
*** 963,969 ****
--- 964,973 ----
  	if ((count_idle_servers() < daemons_min_free)
  	    && (child_slot = find_free_child_num()) >= 0
  	    && child_slot <= daemons_limit)
+ 	    {
+ 	    update_child_status(child_slot,SERVER_STARTING);
  	    make_child(server_conf, child_slot);
+ 	    }
      }
  
  } /* standalone_main */
*** scoreboard.h.old	Fri Dec  8 18:59:47 1995
--- scoreboard.h	Fri Dec  8 19:04:49 1995
***************
*** 65,70 ****
--- 65,71 ----
  #define SERVER_DEAD 0		/* Unused scoreboard entry */
  #define SERVER_READY 1		/* Waiting for connection (or accept() lock) */
  #define SERVER_BUSY 2		/* Processing a client request */
+ #define SERVER_STARTING 3	/* Launched, but not yet live */
  
  typedef struct {
      pid_t pid;

-- 
Ben Laurie                  Phone: +44 (181) 994 6435
Freelance Consultant        Fax:   +44 (181) 994 6472
and Technical Director      Email: ben@algroup.co.uk
A.L. Digital Ltd,           URL: http://www.algroup.co.uk
London, England.