rbb         99/02/15 12:39:02

  Modified:    pthreads/src/include http_conf_globals.h httpd.h
                        scoreboard.h
               pthreads/src/main http_main.c scoreboard.c
  Log:
  Scoreboard updates.  We now store the number of workers and acceptors in the
  scoreboard file.  I also added two new states for acceptor threads, ACCEPTING
  and QUEUEing.  Lastly, we are now using reasonable defaults for
  HARD_SERVER_LIMIT and HARD_THREAD_LIMIT.
  
  Revision  Changes    Path
  1.6       +1 -0      apache-apr/pthreads/src/include/http_conf_globals.h
  
  Index: http_conf_globals.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/include/http_conf_globals.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- http_conf_globals.h       1999/02/11 16:33:00     1.5
  +++ http_conf_globals.h       1999/02/15 20:38:54     1.6
  @@ -74,6 +74,7 @@
   extern gid_t group_id_list[NGROUPS_MAX];
   #endif
   extern int ap_threads_per_child;
  +extern int ap_acceptors_per_child;
   extern int ap_idle_thread_threshold;
   extern int ap_busy_thread_threshold;
   extern int ap_max_requests_per_child;
  
  
  
  1.7       +4 -2      apache-apr/pthreads/src/include/httpd.h
  
  Index: httpd.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/include/httpd.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- httpd.h   1999/02/11 16:33:00     1.6
  +++ httpd.h   1999/02/15 20:38:57     1.7
  @@ -307,7 +307,7 @@
    * the overhead.
    */
   #ifndef HARD_SERVER_LIMIT
  -#define HARD_SERVER_LIMIT 256
  +#define HARD_SERVER_LIMIT 8 
   #endif
   
   /* Limit on the threads per process.  Clients will be locked out if more than
  @@ -318,7 +318,7 @@
    * the overhead.
    */
   #ifndef HARD_THREAD_LIMIT
  -#define HARD_THREAD_LIMIT 500
  +#define HARD_THREAD_LIMIT 64 
   #endif
   
   /*
  @@ -1039,6 +1039,8 @@
   API_EXPORT(int) ap_is_directory(const char *name);
   API_EXPORT(int) ap_can_exec(const struct stat *);
   API_EXPORT(void) ap_chdir_file(const char *file);
  +API_EXPORT(int) ap_get_max_daemons(void);
  +server_rec * get_server_conf(void);
   
   #ifndef HAVE_CANONICAL_FILENAME
   /*
  
  
  
  1.6       +5 -3      apache-apr/pthreads/src/include/scoreboard.h
  
  Index: scoreboard.h
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/include/scoreboard.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- scoreboard.h      1999/02/15 15:45:16     1.5
  +++ scoreboard.h      1999/02/15 20:38:57     1.6
  @@ -89,7 +89,9 @@
   #define SERVER_BUSY_LOG 6    /* Logging the request */
   #define SERVER_BUSY_DNS 7    /* Looking up a hostname */
   #define SERVER_GRACEFUL 8    /* server is gracefully finishing request */
  -#define SERVER_NUM_STATUS 9  /* number of status settings */
  +#define SERVER_ACCEPTING 9   /* thread is accepting connections */
  +#define SERVER_QUEUEING      10      /* thread is putting connection on the 
queue */
  +#define SERVER_NUM_STATUS 11 /* number of status settings */
   
   /* A "virtual time" is simply a counter that indicates that a child is
    * making progress.  The parent checks up on each child, and when they have
  @@ -171,8 +173,8 @@
   typedef struct {
       pid_t pid;
       ap_generation_t generation;      /* generation of this child */
  -    int threads;
  -    int inactive_threads;
  +    int worker_threads;
  +    int acceptor_threads;
   #ifdef OPTIMIZE_TIMEOUTS
       time_t last_rtime;               /* time(0) of the last change */
       vtime_t last_vtime;              /* the last vtime the parent has seen */
  
  
  
  1.25      +11 -24    apache-apr/pthreads/src/main/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/http_main.c,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- http_main.c       1999/02/15 18:42:49     1.24
  +++ http_main.c       1999/02/15 20:39:01     1.25
  @@ -157,6 +157,7 @@
   gid_t group_id_list[NGROUPS_MAX];
   #endif
   int ap_threads_per_child;
  +int ap_acceptors_per_child;
   int ap_max_requests_per_child;
   int ap_idle_thread_threshold;
   int ap_busy_thread_threshold;
  @@ -186,15 +187,6 @@
   static int max_daemons_limit = -1;
   
   /*
  - * The maximum number of threads in each child process.  This is ap_threads_
  - * per child + # of acceptor threads.  Used to optimize routines that must
  - * scan the entire scoreboard.  This is garaunteed not to change, unless the
  - * server is restarted, at which point, it must be updated to incorporate
  - * any changes in the threadsperchild or listen directives.
  - */
  -int max_threads_limit;
  -
  -/*
    * During config time, listeners is treated as a NULL-terminated list.
    * child_main previously would start at the beginning of the list each time
    * through the loop, so a socket early on in the list could easily starve out
  @@ -423,13 +415,7 @@
       int i;
       listen_rec *lr;
   
  -    /*  lr = ap_listeners;
  -    while (lr->next != NULL) {
  -        close(lr->fd);
  -     lr= lr->next;
  -     }*/
  -
  -    for (i = 0; i < max_threads_limit; i++)
  +    for (i = 0; i < ap_threads_per_child + ap_acceptors_per_child; i++)
           ap_update_child_status(child_num, i, SERVER_DEAD, (request_rec *) 
NULL);
   
       if (pchild) {
  @@ -1777,11 +1763,13 @@
   
       sock_disable_nagle(sd);
       */
  -    (void) ap_update_child_status(my_pid, my_tid, SERVER_READY, 
  -                               (request_rec *) NULL);
   
       while (0 < requests_this_child) {
  +        (void) ap_update_child_status(my_pid, my_tid, SERVER_ACCEPTING, 
  +                                 (request_rec *) NULL);
           csd = accept(sd, &sa_client, &len);
  +     (void) ap_update_child_status(my_pid, my_tid, SERVER_QUEUEING, 
  +                                   (request_rec *) NULL);
        if (csd >= 0) {
            if (queue_push(&csd_queue, csd, &sa_client) != 0) {
              /*                ap_log_error*/
  @@ -2072,12 +2060,10 @@
       int pid;
       listen_rec *lr;
   
  -    max_threads_limit = 0;
  -    for (lr = ap_listeners, max_threads_limit = 0; lr; 
  -      lr=lr->next, max_threads_limit++);
  +    for (lr = ap_listeners, ap_acceptors_per_child = 0; lr; 
  +      lr=lr->next, ap_acceptors_per_child++);
   
  -    max_threads_limit += ap_threads_per_child; 
  -    if (max_threads_limit  > HARD_THREAD_LIMIT) {
  +    if (ap_acceptors_per_child + ap_threads_per_child  > HARD_THREAD_LIMIT) {
           ap_log_error(APLOG_MARK, APLOG_ERR, s,
                     "Worker threads plus acceptor threads is greater than 
HARD_THREAD_LIMIT, please correct");
        exit(-1);
  @@ -2476,7 +2462,8 @@
            */
        
        for (i = 0; i < ap_daemons_limit; ++i) {
  -         for (j = 0; j < max_threads_limit; j++) { 
  +         for (j = 0; j < ap_threads_per_child + ap_acceptors_per_child; 
  +              j++) { 
                if (ap_scoreboard_image->servers[i][j].status != SERVER_DEAD) {
                    ap_scoreboard_image->servers[i][j].status = SERVER_GRACEFUL;
                }
  
  
  
  1.4       +6 -10     apache-apr/pthreads/src/main/scoreboard.c
  
  Index: scoreboard.c
  ===================================================================
  RCS file: /home/cvs/apache-apr/pthreads/src/main/scoreboard.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- scoreboard.c      1999/02/15 18:42:50     1.3
  +++ scoreboard.c      1999/02/15 20:39:01     1.4
  @@ -562,10 +562,6 @@
       return -1;
   }
   
  -
  -
  -
  -
   int ap_update_child_status(int child_num, int thread_num, int status, 
request_rec *r)
   {
       int old_status;
  @@ -581,12 +577,12 @@
   
       ps = &ap_scoreboard_image->parent[child_num];
       
  -    if (status == SERVER_READY && old_status != SERVER_READY)
  -        ps->inactive_threads++;
  -    else if (old_status == SERVER_READY)
  -        ps->inactive_threads--;
  -    else if (old_status == SERVER_STARTING)
  +    if ((status == SERVER_READY  || status == SERVER_ACCEPTING)
  +     && old_status == SERVER_STARTING) {
           ss->tid = pthread_self();
  +     ps->worker_threads = ap_threads_per_child;
  +     ps->acceptor_threads = ap_acceptors_per_child;
  +    }
   
       if (ap_extended_status) {
        if (status == SERVER_READY || status == SERVER_DEAD) {
  @@ -618,7 +614,7 @@
            ss->vhostrec =  r->server;
        }
       }
  -
  +    
       return old_status;
   }
   
  
  
  

Reply via email to