jim 98/12/02 17:08:02
Modified: src/main http_main.c
src/modules/standard mod_status.c
Log:
During Graceful restarts, the value of vhostrec is bogus. To get around
this, we reset this pointer to NULL during these.
Revision Changes Path
1.407 +44 -31 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.406
retrieving revision 1.407
diff -u -r1.406 -r1.407
--- http_main.c 1998/12/02 00:00:06 1.406
+++ http_main.c 1998/12/03 01:07:54 1.407
@@ -1531,6 +1531,12 @@
* We begin with routines which deal with the file itself...
*/
+/* volatile just in case */
+static int volatile shutdown_pending;
+static int volatile restart_pending;
+static int volatile is_graceful;
+static int volatile generation;
+
#ifdef MULTITHREAD
/*
* In the multithreaded mode, have multiple threads - not multiple
@@ -1542,8 +1548,14 @@
static void reinit_scoreboard(pool *p)
{
ap_assert(!ap_scoreboard_image);
- ap_scoreboard_image = (scoreboard *) malloc(SCOREBOARD_SIZE);
- memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
+ if (is_graceful) {
+ int i;
+ for (i = 0; i < HARD_SERVER_LIMIT; i++)
+ ap_scoreboard_image->servers[i].vhostrec = NULL;
+ } else {
+ ap_scoreboard_image = (scoreboard *) malloc(SCOREBOARD_SIZE);
+ memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
+ }
}
void cleanup_scoreboard(void)
@@ -1950,32 +1962,41 @@
/* Called by parent process */
static void reinit_scoreboard(pool *p)
{
- int exit_gen = 0;
- if (ap_scoreboard_image)
- exit_gen = ap_scoreboard_image->global.exit_generation;
+ if (is_graceful && ap_scoreboard_image) {
+ int i;
+ for (i = 0; i < HARD_SERVER_LIMIT; i++)
+ ap_scoreboard_image->servers[i].vhostrec = NULL;
+#ifdef SCOREBOARD_FILE
+ force_write(scoreboard_fd, ap_scoreboard_image,
sizeof(*ap_scoreboard_image));
+#endif
+ } else {
+ int exit_gen = 0;
+ if (ap_scoreboard_image)
+ exit_gen = ap_scoreboard_image->global.exit_generation;
#ifndef SCOREBOARD_FILE
- if (ap_scoreboard_image == NULL) {
- setup_shared_mem(p);
- }
- memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
- ap_scoreboard_image->global.exit_generation = exit_gen;
+ if (ap_scoreboard_image == NULL) {
+ setup_shared_mem(p);
+ }
+ memset(ap_scoreboard_image, 0, SCOREBOARD_SIZE);
+ ap_scoreboard_image->global.exit_generation = exit_gen;
#else
- ap_scoreboard_image = &_scoreboard_image;
- ap_scoreboard_fname = ap_server_root_relative(p, ap_scoreboard_fname);
+ ap_scoreboard_image = &_scoreboard_image;
+ ap_scoreboard_fname = ap_server_root_relative(p,
ap_scoreboard_fname);
- scoreboard_fd = ap_popenf(p, ap_scoreboard_fname, O_CREAT | O_BINARY |
O_RDWR, 0644);
- if (scoreboard_fd == -1) {
- perror(ap_scoreboard_fname);
- fprintf(stderr, "Cannot open scoreboard file:\n");
- exit(APEXIT_INIT);
- }
- ap_register_cleanup(p, NULL, cleanup_scoreboard_file, ap_null_cleanup);
+ scoreboard_fd = ap_popenf(p, ap_scoreboard_fname, O_CREAT | O_BINARY
| O_RDWR, 0644);
+ if (scoreboard_fd == -1) {
+ perror(ap_scoreboard_fname);
+ fprintf(stderr, "Cannot open scoreboard file:\n");
+ exit(APEXIT_INIT);
+ }
+ ap_register_cleanup(p, NULL, cleanup_scoreboard_file,
ap_null_cleanup);
- memset((char *) ap_scoreboard_image, 0, sizeof(*ap_scoreboard_image));
- ap_scoreboard_image->global.exit_generation = exit_gen;
- force_write(scoreboard_fd, ap_scoreboard_image,
sizeof(*ap_scoreboard_image));
+ memset((char *) ap_scoreboard_image, 0,
sizeof(*ap_scoreboard_image));
+ ap_scoreboard_image->global.exit_generation = exit_gen;
+ force_write(scoreboard_fd, ap_scoreboard_image,
sizeof(*ap_scoreboard_image));
#endif
+ }
}
/* Routines called to deal with the scoreboard image
@@ -2551,12 +2572,6 @@
deferred_die = 1;
}
-/* volatile just in case */
-static int volatile shutdown_pending;
-static int volatile restart_pending;
-static int volatile is_graceful;
-static int volatile generation;
-
#ifdef WIN32
/*
* Signalling Apache on NT.
@@ -4247,9 +4262,7 @@
ap_init_modules(pconf, server_conf);
version_locked++; /* no more changes to server_version */
SAFE_ACCEPT(accept_mutex_init(pconf));
- if (!is_graceful) {
- reinit_scoreboard(pconf);
- }
+ reinit_scoreboard(pconf);
#ifdef SCOREBOARD_FILE
else {
ap_scoreboard_fname = ap_server_root_relative(pconf,
ap_scoreboard_fname);
1.101 +2 -1 apache-1.3/src/modules/standard/mod_status.c
Index: mod_status.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_status.c,v
retrieving revision 1.100
retrieving revision 1.101
diff -u -r1.100 -r1.101
--- mod_status.c 1998/10/28 13:02:39 1.100
+++ mod_status.c 1998/12/03 01:08:00 1.101
@@ -653,7 +653,8 @@
ap_rprintf(r,
"<td>%s<td nowrap>%s<td nowrap>%s</tr>\n\n",
score_record.client,
- score_record.vhostrec->server_hostname,
+ (score_record.vhostrec ?
+ score_record.vhostrec->server_hostname : "NULL"),
ap_escape_html(r->pool, score_record.request));
} /* no_table_report */
} /* !short_report */