fielding 97/01/25 12:28:21
Modified: src CHANGES http_main.c Log: Fixed condition where, if a child fails to fork, the scoreboard would continue to say SERVER_STARTING forever. Eventually, the main process would 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. Submitted by: Phillip Vandry <[EMAIL PROTECTED]> Reviewed by: Roy Fielding, Marc Slemko, Chuck Murcko, Randy Terbush Revision Changes Path 1.133 +6 -0 apache/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache/src/CHANGES,v retrieving revision 1.132 retrieving revision 1.133 diff -C3 -r1.132 -r1.133 *** CHANGES 1997/01/25 20:12:48 1.132 --- CHANGES 1997/01/25 20:28:17 1.133 *************** *** 106,111 **** --- 106,117 ---- select, and removed potential for infinite loop in accept. [Roy Fielding, after useful PR from [EMAIL PROTECTED] + *) Fixed condition where, if a child fails to fork, the scoreboard would + continue to say SERVER_STARTING forever. Eventually, the main process + would 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. [Phillip Vandry] + Changes with Apache 1.2b4: *) Fix possible race condition in accept_mutex_init() that 1.112 +9 -3 apache/src/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache/src/http_main.c,v retrieving revision 1.111 retrieving revision 1.112 diff -C3 -r1.111 -r1.112 *** http_main.c 1997/01/25 20:12:49 1.111 --- http_main.c 1997/01/25 20:28:19 1.112 *************** *** 1715,1721 **** } } ! void make_child(server_rec *server_conf, int child_num) { int pid; --- 1715,1721 ---- } } ! int make_child(server_rec *server_conf, int child_num) { int pid; *************** *** 1733,1739 **** over and over again. */ sleep(10); ! return; } if (!pid) { --- 1733,1739 ---- over and over again. */ sleep(10); ! return -1; } if (!pid) { *************** *** 1741,1746 **** --- 1741,1747 ---- signal (SIGTERM, (void (*)())just_die); child_main (child_num); } + return 0; } static int *************** *** 2014,2020 **** 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); } --- 2015,2026 ---- 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_STARTING forever and ever */ ! (void)update_child_status(child_slot,SERVER_DEAD, ! (request_rec*)NULL); ! } }