ASF Bugzilla – Attachment 20941 Details for
Bug 43359
trunk EventMPM's graceful restart/stop are not graceful
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
conn counter using conn pool
event.c.patch (text/plain), 6.41 KB, created by
Takashi Sato
on 2007-10-08 02:58:29 UTC
(
hide
)
Description:
conn counter using conn pool
Filename:
MIME Type:
Creator:
Takashi Sato
Created:
2007-10-08 02:58:29 UTC
Size:
6.41 KB
patch
obsolete
>Index: trunk/server/mpm/experimental/event/event.c >=================================================================== >--- trunk/server/mpm/experimental/event/event.c (revision 582710) >+++ trunk/server/mpm/experimental/event/event.c (working copy) >@@ -55,6 +55,7 @@ > #include "apr_poll.h" > #include "apr_ring.h" > #include "apr_queue.h" >+#include "apr_atomic.h" > #define APR_WANT_STRFUNC > #include "apr_want.h" > >@@ -396,7 +397,13 @@ > static int volatile is_graceful; > static volatile int child_fatal; > ap_generation_t volatile ap_my_generation = 0; >+static volatile apr_uint32_t connection_count = 0; > >+static apr_status_t decrement_connection_count(void *dummy){ >+ apr_atomic_dec32(&connection_count); >+ return APR_SUCCESS; >+} >+ > /* > * ap_start_shutdown() and ap_start_restart(), below, are a first stab at > * functions to initiate shutdown or restart without relying on signals. >@@ -569,6 +576,7 @@ > ap_create_sb_handle(&sbh, p, my_child_num, my_thread_num); > > if (cs == NULL) { /* This is a new connection */ >+ > > cs = apr_pcalloc(p, sizeof(conn_state_t)); > >@@ -577,6 +585,8 @@ > cs->bucket_alloc = apr_bucket_alloc_create(p); > c = ap_run_create_connection(p, ap_server_conf, sock, > conn_id, sbh, cs->bucket_alloc); >+ apr_atomic_inc32(&connection_count); >+ apr_pool_cleanup_register(c->pool, NULL, decrement_connection_count, apr_pool_cleanup_null); > cs->c = c; > c->cs = cs; > cs->p = p; >@@ -885,6 +895,29 @@ > } > } > >+static void close_listeners(int process_slot, int *closed){ >+ if(!*closed){ >+ ap_listen_rec *lr; >+ int i; >+ for (lr = ap_listeners; lr != NULL; lr = lr->next) { >+ apr_pollfd_t *pfd = apr_pcalloc(pchild, sizeof(*pfd)); >+ pfd->desc_type = APR_POLL_SOCKET; >+ pfd->desc.s = lr->sd; >+ apr_pollset_remove(event_pollset, pfd); >+ } >+ ap_close_listeners(); >+ *closed = 1; >+ dying = 1; >+ ap_scoreboard_image->parent[process_slot].quiescing = 1; >+ for(i = 0; i < ap_threads_per_child; ++i){ >+ ap_update_child_status_from_indexes(process_slot, i, >+ SERVER_DEAD, NULL); >+ } >+ /* wake up the main thread */ >+ kill(ap_my_pid, SIGTERM); >+ } >+} >+ > static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy) > { > apr_status_t rc; >@@ -902,6 +935,7 @@ > apr_interval_time_t timeout_interval; > apr_time_t timeout_time; > listener_poll_type *pt; >+ int closed = 0; > > free(ti); > >@@ -935,7 +969,12 @@ > unblock_signal(LISTENER_SIGNAL); > apr_signal(LISTENER_SIGNAL, dummy_signal_handler); > >- while (!listener_may_exit) { >+ for(;;) { >+ if(listener_may_exit){ >+ close_listeners(process_slot, &closed); >+ if(terminate_mode == ST_UNGRACEFUL || apr_atomic_read32(&connection_count) == 0) >+ break; >+ } > > if (requests_this_child <= 0) { > check_infinite_requests(); >@@ -956,8 +995,11 @@ > } > } > >- if (listener_may_exit) >- break; >+ if(listener_may_exit){ >+ close_listeners(process_slot, &closed); >+ if(terminate_mode == ST_UNGRACEFUL || apr_atomic_read32(&connection_count) == 0) >+ break; >+ } > > while (num && get_worker(&have_idle_worker)) { > pt = (listener_poll_type *) out_pfd->client_data; >@@ -1128,14 +1170,9 @@ > > } /* listener main loop */ > >- ap_close_listeners(); >+ close_listeners(process_slot, &closed); > ap_queue_term(worker_queue); >- dying = 1; >- ap_scoreboard_image->parent[process_slot].quiescing = 1; > >- /* wake up the main thread */ >- kill(ap_my_pid, SIGTERM); >- > apr_thread_exit(thd, APR_SUCCESS); > return NULL; > } >@@ -1180,7 +1217,7 @@ > } > > ap_update_child_status_from_indexes(process_slot, thread_slot, >- SERVER_READY, NULL); >+ dying ? SERVER_GRACEFUL : SERVER_READY, NULL); > worker_pop: > if (workers_may_exit) { > break; >@@ -1385,48 +1422,11 @@ > return NULL; > } > >-static void join_workers(apr_thread_t * listener, apr_thread_t ** threads) >+static void join_workers(apr_thread_t ** threads) > { > int i; > apr_status_t rv, thread_rv; > >- if (listener) { >- int iter; >- >- /* deal with a rare timing window which affects waking up the >- * listener thread... if the signal sent to the listener thread >- * is delivered between the time it verifies that the >- * listener_may_exit flag is clear and the time it enters a >- * blocking syscall, the signal didn't do any good... work around >- * that by sleeping briefly and sending it again >- */ >- >- iter = 0; >- while (iter < 10 && >-#ifdef HAVE_PTHREAD_KILL >- pthread_kill(*listener_os_thread, 0) >-#else >- kill(ap_my_pid, 0) >-#endif >- == 0) { >- /* listener not dead yet */ >- apr_sleep(apr_time_make(0, 500000)); >- wakeup_listener(); >- ++iter; >- } >- if (iter >= 10) { >- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, >- "the listener thread didn't exit"); >- } >- else { >- rv = apr_thread_join(&thread_rv, listener); >- if (rv != APR_SUCCESS) { >- ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, >- "apr_thread_join: unable to join listener thread"); >- } >- } >- } >- > for (i = 0; i < ap_threads_per_child; i++) { > if (threads[i]) { /* if we ever created this thread */ > rv = apr_thread_join(&thread_rv, threads[i]); >@@ -1565,7 +1565,7 @@ > * If the worker hasn't exited, then this blocks until > * they have (then cleans up). > */ >- join_workers(ts->listener, threads); >+ join_workers(threads); > } > else { /* !one_process */ > /* remove SIGTERM from the set of blocked signals... if one of >@@ -1606,7 +1606,7 @@ > * If the worker hasn't exited, then this blocks until > * they have (then cleans up). > */ >- join_workers(ts->listener, threads); >+ join_workers(threads); > } > > free(threads);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 43359
:
20925
|
20932
|
20941
|
20950