mjc 96/03/25 02:54:33
Modified: src http_main.c scoreboard.h CHANGES Log: Reviewed by: Ben Laurie Changes to core Apache to allow a module to obtain information from the scoreboard (in file or memory). Addition of an extra server BUSY state to distinguish between a "read request" and a "write response". A define allows the addition of full instrumentation into the scoreboard Revision Changes Path 1.10 +58 -1 apache/src/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache/src/http_main.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C3 -r1.9 -r1.10 *** http_main.c 1996/03/18 01:55:38 1.9 --- http_main.c 1996/03/25 10:54:29 1.10 *************** *** 118,123 **** --- 118,124 ---- int daemons_min_free; int daemons_max_free; int daemons_limit; + time_t restart_time; char server_root[MAX_STRING_LEN]; char server_confname[MAX_STRING_LEN]; *************** *** 658,666 **** --- 659,711 ---- void update_child_status (int child_num, int status) { short_score new_score_rec; + memcpy(&new_score_rec,&scoreboard_image[child_num],sizeof new_score_rec); new_score_rec.pid = getpid(); new_score_rec.status = status; + #if defined(STATUS_INSTRUMENTATION) + new_score_rec.last_used=time(NULL); + #endif + + #if defined(HAVE_MMAP) || defined(HAVE_SHMGET) + memcpy(&scoreboard_image[child_num], &new_score_rec, sizeof(short_score)); + #else + lseek (scoreboard_fd, (long)child_num * sizeof(short_score), 0); + force_write (scoreboard_fd, (char*)&new_score_rec, sizeof(short_score)); + #endif + } + + int count_busy_servers () + { + int i; + int res = 0; + + for (i = 0; i < HARD_SERVER_MAX; ++i) + if (scoreboard_image[i].status == SERVER_BUSY_READ || + scoreboard_image[i].status == SERVER_BUSY_WRITE) + ++res; + return res; + } + + short_score get_scoreboard_info(int i) + { + return (scoreboard_image[i]); + } + + #if defined(STATUS_INSTRUMENTATION) + void increment_counts (int child_num, request_rec *r) + { + long int bs=0; + short_score new_score_rec=scoreboard_image[child_num]; + + if (r->sent_bodyct) + bgetopt(r->connection->client, BO_BYTECT, &bs); + + new_score_rec.access_count ++; + new_score_rec.bytes_served += (long)bs; + + times(&new_score_rec.times); + #if defined(HAVE_MMAP) || defined(HAVE_SHMGET) memcpy(&scoreboard_image[child_num], &new_score_rec, sizeof(short_score)); #else *************** *** 668,673 **** --- 713,719 ---- force_write (scoreboard_fd, (char*)&new_score_rec, sizeof(short_score)); #endif } + #endif int count_idle_servers () { *************** *** 1074,1080 **** continue; } ! update_child_status (child_num, SERVER_BUSY); conn_io = bcreate(ptrans, B_RDWR); dupped_csd = csd; #if defined(NEED_DUPPED_CSD) --- 1120,1126 ---- continue; } ! update_child_status (child_num, SERVER_BUSY_READ); conn_io = bcreate(ptrans, B_RDWR); dupped_csd = csd; #if defined(NEED_DUPPED_CSD) *************** *** 1090,1102 **** --- 1136,1158 ---- (struct sockaddr_in *)&sa_server); r = read_request (current_conn); + update_child_status (child_num, SERVER_BUSY_WRITE); if (r) process_request (r); /* else premature EOF --- ignore */ + #if defined(STATUS_INSTRUMENTATION) + if (r) increment_counts(child_num,r); + #endif while (r && current_conn->keepalive) { bflush(conn_io); destroy_pool(r->pool); + update_child_status (child_num, SERVER_BUSY_READ); r = read_request (current_conn); + update_child_status (child_num, SERVER_BUSY_WRITE); if (r) process_request (r); + + #if defined(STATUS_INSTRUMENTATION) + if (r) increment_counts(child_num,r); + #endif } if (bytes_in_pool (ptrans) > 80000) *************** *** 1210,1215 **** --- 1266,1272 ---- log_error ("SIGHUP received. Attempting to restart", server_conf); } + restart_time = time(NULL); clear_pool (pconf); ptrans = make_sub_pool (pconf); 1.3 +14 -5 apache/src/scoreboard.h Index: scoreboard.h =================================================================== RCS file: /export/home/cvs/apache/src/scoreboard.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C3 -r1.2 -r1.3 *** scoreboard.h 1996/02/22 11:47:20 1.2 --- scoreboard.h 1996/03/25 10:54:30 1.3 *************** *** 51,56 **** --- 51,57 ---- * */ + #include <sys/times.h> /* Scoreboard info on a process is, for now, kept very brief --- * just status value and pid (the latter so that the caretaker process *************** *** 61,75 **** * * Status values: */ ! ! #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; char status; } short_score; /* --- 62,83 ---- * * Status values: */ ! ! #define SERVER_DEAD 0 ! #define SERVER_READY 1 /* Waiting for connection (or accept() lock) */ ! #define SERVER_STARTING 3 /* Server Starting up */ ! #define SERVER_BUSY_READ 2 /* Reading a client request */ ! #define SERVER_BUSY_WRITE 4 /* Processing a client request */ typedef struct { pid_t pid; char status; + #if defined(STATUS_INSTRUMENTATION) + long access_count; + long bytes_served; + struct tms times; + time_t last_used; + #endif } short_score; /* *************** *** 85,87 **** --- 93,96 ---- #define HARD_SERVER_MAX 150 + extern void sync_scoreboard_image(void); 1.14 +5 -0 apache/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache/src/CHANGES,v retrieving revision 1.13 retrieving revision 1.14 diff -C3 -r1.13 -r1.14 *** CHANGES 1996/03/22 05:42:50 1.13 --- CHANGES 1996/03/25 10:54:30 1.14 *************** *** 1,3 **** --- 1,8 ---- + *) Added simple and complex instrumentation to Apache to allow a + instantaneous status screen to be displayed. Since the complex + instrumentation makes the scoreboard file bigger it has been + made a compile-time define (add "-DSTATUS_INSTRUMENTATION" to + CLAGS in the Configuration file) [Mark Cox] *) Made it so XBITHACK behavior only occurs for files of type text/html, as any other file type doesn't really make sense. [Alexei Kosut]