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:18:09 UTC

Scoreboard race condition fix

OK, here's the patch to cure (I hope) the problem. Note, as I mentioned before
that backing out patch 20 only reduces the likelihood of the bug. Note that in
this patch I have eliminated the reopen_scoreboard call - it is unnecessary,
and in fact leads to the problem, often bemoaned, that cron deleting the
scoreboard screws up everything. In fact, we should delete it ourselves, to
prevent interference, but I imagine people use it for status monitoring?

Cheers,

Ben.

------- SNIP HERE ---------
From: ben@algroup.co.uk (Ben Laurie)
Subject: Cure scoreboard race condition
Affects: http_main.c scoreboard.h
Changelog: On very heavily loaded servers, the scoreboard could lag behind
	reality, thus causing a nasty race condition which spawned many extra
	servers. This patch cures that problem, and incidentally removes the
	problem with the scoreboard being deleted.

*** http_main.c.old	Fri Dec  8 18:59:11 1995
--- http_main.c	Fri Dec  8 19:04:48 1995
***************
*** 381,386 ****
--- 381,387 ----
  		 sizeof(scoreboard_image));
  }
  
+ #if 0
  void reopen_scoreboard (pool *p)
  {
      if (scoreboard_fd != -1) pclosef (p, scoreboard_fd);
***************
*** 393,398 ****
--- 394,400 ----
  	exit (1);
      }
  }
+ #endif
  
  void cleanup_scoreboard ()
  {
***************
*** 433,439 ****
      int res = 0;
  
      for (i = 0; i < HARD_SERVER_MAX; ++i)
! 	if (scoreboard_image[i].status == SERVER_READY)
  	    ++res;
  
      return res;
--- 435,442 ----
      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;
***************
*** 739,745 ****
      dupped_csd = -1;
      child_num = child_num_arg;
      requests_this_child = 0;
!     reopen_scoreboard (pconf);
      update_child_status (child_num, SERVER_READY);
  
      /* Only try to switch if we're running as root */
--- 742,748 ----
      dupped_csd = -1;
      child_num = child_num_arg;
      requests_this_child = 0;
! /*    reopen_scoreboard (pconf);*/
      update_child_status (child_num, SERVER_READY);
  
      /* Only try to switch if we're running as root */
***************
*** 963,969 ****
--- 966,975 ----
  	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 */

-- 
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.