Changes with Apache 2.3.2
[ When backported to 2.2.x, remove entry from this file ]
+ *) prefork: Fix child process hang during graceful restart/stop in
+ configurations with multiple listening sockets. PR 42829. [Joe Orton,
+ Jeff Trawick]
+
*) prefork: Log an error instead of segfaulting when child startup fails
due to pollset creation failures. PR 46467. [Jeff Trawick]
apr_int32_t numdesc;
const apr_pollfd_t *pdesc;
- /* timeout == -1 == wait forever */
- status = apr_pollset_poll(pollset, -1, &numdesc, &pdesc);
+ /* check for termination first so we don't sleep for a while in
+ * poll if already signalled
+ */
+ if (one_process && shutdown_pending) {
+ SAFE_ACCEPT(accept_mutex_off());
+ return;
+ }
+ else if (die_now) {
+ /* In graceful stop/restart; drop the mutex
+ * and terminate the child. */
+ SAFE_ACCEPT(accept_mutex_off());
+ clean_child_exit(0);
+ }
+ /* timeout == 10 seconds to avoid a hang at graceful restart/stop
+ * caused by the closing of sockets by the signal handler
+ */
+ status = apr_pollset_poll(pollset, apr_time_from_sec(10),
+ &numdesc, &pdesc);
if (status != APR_SUCCESS) {
- if (APR_STATUS_IS_EINTR(status)) {
- if (one_process && shutdown_pending) {
- SAFE_ACCEPT(accept_mutex_off());
- return;
- }
- else if (die_now) {
- /* In graceful stop/restart; drop the mutex
- * and terminate the child. */
- SAFE_ACCEPT(accept_mutex_off());
- clean_child_exit(0);
- }
+ if (APR_STATUS_IS_TIMEUP(status) ||
+ APR_STATUS_IS_EINTR(status)) {
continue;
}
/* Single Unix documents select as returning errnos