|
|||||||||||
|
"Graceful Restart" patch
From: Ben Laurie <ben(at)gonzo.ben.algroup.co.uk>
Date: Sun Jun 23 1996 - 08:02:24 EDT
Cheers, Ben. Index: http_main.c RCS file: /export/home/cvs/apache/src/http_main.c,v retrieving revision 1.40 diff -c -r1.40 http_main.c *** http_main.c 1996/06/22 13:58:34 1.40 --- http_main.c 1996/06/23 12:36:32
#if defined(HAVE_MMAP)
static void setup_shared_mem(void)
caddr_t m;
! m = mmap((caddr_t)0, HARD_SERVER_LIMIT*sizeof(short_score),
PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if (m == (caddr_t)-1)
{
--- 427,440 ---- */
#if defined(HAVE_MMAP)
static void setup_shared_mem(void)
caddr_t m;
! m = mmap((caddr_t)0, SCOREBOARD_SIZE,
PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
if (m == (caddr_t)-1)
{
#elif defined(HAVE_SHMGET)
static void setup_shared_mem(void)
- int score_size = HARD_SERVER_LIMIT*sizeof(short_score);
char errstr[MAX_STRING_LEN];
struct shmid_ds shmbuf;
#endif
! if ((shmid = shmget(shmkey, score_size, IPC_CREAT|SHM_R|SHM_W)) == -1)
{
perror("shmget");
fprintf(stderr, "httpd: Could not call shmget\n");
--- 463,485 ----
}
close(fd);
}
#elif defined(HAVE_SHMGET)
static void setup_shared_mem(void)
char errstr[MAX_STRING_LEN];
struct shmid_ds shmbuf;
#endif
! if ((shmid = shmget(shmkey, SCOREBOARD_SIZE, IPC_CREAT|SHM_R|SHM_W)) == -1)
{
perror("shmget");
fprintf(stderr, "httpd: Could not call shmget\n");
! #define BADSHMAT ((short_score*)(-1))
! if ((scoreboard_image = (short_score*)shmat(shmid, 0, 0)) == BADSHMAT)
{
perror("shmat");
fprintf(stderr, "httpd: Could not call shmat\n");
--- 506,513 ----
}
#endif
! #define BADSHMAT ((scoreboard *)(-1))
! if ((scoreboard_image = (scoreboard *)shmat(shmid, 0, 0)) == BADSHMAT)
{
perror("shmat");
fprintf(stderr, "httpd: Could not call shmat\n");
#else
#else
! memset ((char*)scoreboard_image, 0, sizeof(scoreboard_image));
force_write (scoreboard_fd, (char*)scoreboard_image,
! sizeof(scoreboard_image));
#endif }
! memset ((char*)scoreboard_image, 0, sizeof(*scoreboard_image));
force_write (scoreboard_fd, (char*)scoreboard_image,
! sizeof(*scoreboard_image));
#endif }
! memcpy(&new_score_rec,&scoreboard_image[child_num],sizeof new_score_rec);
new_score_rec.pid = getpid();
old_status = new_score_rec.status;
new_score_rec.status = status;
--- 671,677 ----
if (child_num < 0)
return -1;
! memcpy(&new_score_rec,&scoreboard_image->servers[child_num],sizeof new_score_rec);
new_score_rec.pid = getpid();
old_status = new_score_rec.status;
new_score_rec.status = status;
#if defined(HAVE_MMAP) || defined(HAVE_SHMGET)
lseek (scoreboard_fd, (long)child_num * sizeof(short_score), 0);
force_write (scoreboard_fd, (char*)&new_score_rec, sizeof(short_score));
--- 702,708 ----
#endif
#if defined(HAVE_MMAP) || defined(HAVE_SHMGET)
lseek (scoreboard_fd, (long)child_num * sizeof(short_score), 0);
force_write (scoreboard_fd, (char*)&new_score_rec, sizeof(short_score));
int get_child_status (int child_num)
if (child_num<0 || child_num>=HARD_SERVER_LIMIT)
return -1;
else
! return scoreboard_image[child_num].status;
}
int count_busy_servers ()
return old_status;
+ void update_scoreboard_global()
+ {
+ #if !defined(HAVE_MMAP) && !defined(HAVE_SHMGET)
+ lseek(scoreboard_fd,
+ (char *)&scoreboard_image->global-(char *)scoreboard_image,0);
+ force_write(scoreboard_fd,(char *)&scoreboard_image->global,
+ sizeof scoreboard_image->global);
+ #endif
+ }
+
int get_child_status (int child_num) {
if (child_num<0 || child_num>=HARD_SERVER_LIMIT)
return -1;
else
! return scoreboard_image->servers[child_num].status;
}
int count_busy_servers ()
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image[i].status == SERVER_BUSY_READ ||
! scoreboard_image[i].status == SERVER_BUSY_WRITE ||
! scoreboard_image[i].status == SERVER_BUSY_KEEPALIVE ||
! scoreboard_image[i].status == SERVER_BUSY_LOG ||
! scoreboard_image[i].status == SERVER_BUSY_DNS)
++res;
return res;
}
short_score get_scoreboard_info(int i)
{
#if defined(STATUS)
int res = 0;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image->servers[i].status == SERVER_BUSY_READ ||
! scoreboard_image->servers[i].status == SERVER_BUSY_WRITE ||
! scoreboard_image->servers[i].status == SERVER_BUSY_KEEPALIVE ||
! scoreboard_image->servers[i].status == SERVER_BUSY_LOG ||
! scoreboard_image->servers[i].status == SERVER_BUSY_DNS)
++res;
return res;
}
+ int count_live_servers()
+ {
+ int i;
+ int res = 0;
+
+ for (i = 0; i < HARD_SERVER_LIMIT; ++i)
+ if (scoreboard_image->servers[i].status != SERVER_DEAD)
+ ++res;
+ return res;
+ }
+
short_score get_scoreboard_info(int i) { ! return (scoreboard_image->servers[i]); }
#if defined(STATUS)
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image[i].status == SERVER_READY
! || scoreboard_image[i].status == SERVER_STARTING)
++res;
return res;
--- 797,804 ----
int res = 0;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image->servers[i].status == SERVER_READY
! || scoreboard_image->servers[i].status == SERVER_STARTING)
++res;
return res;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image[i].status == SERVER_DEAD)
return i;
return -1;
--- 809,815 ----
int i;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image->servers[i].status == SERVER_DEAD)
return i;
return -1;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image[i].pid == pid)
return i;
return -1;
--- 820,826 ----
int i;
for (i = 0; i < HARD_SERVER_LIMIT; ++i)
! if (scoreboard_image->servers[i].pid == pid)
return i;
return -1;
sync_scoreboard_image();
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
! int pid = scoreboard_image[i].pid;
if (pid != my_pid && pid != 0)
! waitpid (scoreboard_image[i].pid, &status, 0);
}
}
sync_scoreboard_image();
for (i = 0; i < HARD_SERVER_LIMIT; ++i) {
! int pid = scoreboard_image->servers[i].pid;
if (pid != my_pid && pid != 0)
! waitpid (scoreboard_image->servers[i].pid, &status, 0);
}
}
+ void graceful_restart()
+ {
+ scoreboard_image->global.please_exit=1;
+ update_scoreboard_global();
+ }
+
void set_signals() { #ifndef NO_USE_SIGACTION struct sigaction sa;
sync_scoreboard_image(); + + if(scoreboard_image->global.please_exit) + exit(0); if ((count_idle_servers() >= daemons_max_free) || (max_requests_per_child > 0
sync_scoreboard_image();
! if ((count_idle_servers() < daemons_min_free)
&& (child_slot = find_free_child_num()) >= 0
&& child_slot <= daemons_limit) {
(void)update_child_status(child_slot,SERVER_STARTING,
(request_rec*)NULL);
make_child(server_conf, child_slot);
}
}
} /* standalone_main */
}
sync_scoreboard_image();
! if (!scoreboard_image->global.please_exit
! && (count_idle_servers() < daemons_min_free)
&& (child_slot = find_free_child_num()) >= 0
&& child_slot <= daemons_limit) {
(void)update_child_status(child_slot,SERVER_STARTING,
(request_rec*)NULL);
make_child(server_conf, child_slot);
+
}
+
+ if(scoreboard_image->global.please_exit && !count_live_servers())
+ #ifdef NEXT
+ longjmp(restart_buffer,1);
+ #else
+ siglongjmp(restart_buffer,1);
+ #endif + }
} /* standalone_main */
RCS file: /export/home/cvs/apache/src/scoreboard.h,v retrieving revision 1.12 diff -c -r1.12 scoreboard.h *** scoreboard.h 1996/06/07 17:39:26 1.12 --- scoreboard.h 1996/06/23 12:36:33
+ typedef struct
+ {
+ char please_exit; /* Set by the main process if a graceful
+ restart is required */
+ } global_score;
+
+ typedef struct
+ {
+ short_score servers[HARD_SERVER_LIMIT];
+ global_score global;
+ } scoreboard;
+
+ #define SCOREBOARD_SIZE sizeof(scoreboard)
+
extern void sync_scoreboard_image(void); short_score get_scoreboard_info(int x); + -- Ben Laurie Phone: +44 (181) 994 6435 Freelance Consultant and Fax: +44 (181) 994 6472 Technical Director Email: ben@algroup.co.uk A.L. Digital Ltd, URL: http://www.algroup.co.uk London, England.Received on Sun Jun 23 05:45:59 1996 This archive was generated by hypermail 2.1.8 : Thu Aug 24 2006 - 14:43:43 EDT |
||||||||||
|
|||||||||||