Any reason why the patch below is not commited yet?
I stumbled across this problem today and reminded myself of this discussion,
but was astonished to find out that it never had been commited.
Regards
RĂ¼diger
Joe Orton wrote:
> As discussed previously; this patch stops killing piped loggers; except
> that prefork still kills them at shutdown and ungraceful restart since
> it signals the entire process group, so it's not entirely consistent.
>
> In all other cases (graceful restart with prefork; shutdown and both
> types of restart with worker and derivatives):
>
> - piped loggers are not explicitly killed. Once all the pipes to the
> piped logger are closed, the logger will read EOF from stdin and know to
> exit. This is subtle interface change for piped loggers.
>
> - piped loggers will survive across generations; you may have several
> sets running concurrently
>
> The effect is that during a graceful restart, log entries processed by
> lingering children are correctly handled by piped loggers. In all
> previous releases, they are just thrown away. I think the importance of
> this issue warrants the interface change for 2.2.
>
> Index: server/log.c
> ===================================================================
> --- server/log.c (revision 170945)
> +++ server/log.c (working copy)
> @@ -819,7 +819,6 @@
> NULL, procattr, pl->p);
>
> if (status == APR_SUCCESS) {
> - pl->pid = procnew;
> /* procnew->in was dup2'd from ap_piped_log_write_fd(pl);
> * since the original fd is still valid, close the copy to
> * avoid a leak. */
> @@ -851,9 +850,6 @@
> switch (reason) {
> case APR_OC_REASON_DEATH:
> case APR_OC_REASON_LOST:
> - pl->pid = NULL; /* in case we don't get it going again, this
> - * tells other logic not to try to kill it
> - */
> apr_proc_other_child_unregister(pl);
> stats = ap_mpm_query(AP_MPMQ_MPM_STATE, &mpm_state);
> if (stats != APR_SUCCESS) {
> @@ -880,13 +876,12 @@
> case APR_OC_REASON_UNWRITABLE:
> /* We should not kill off the pipe here, since it may only be full.
> * If it really is locked, we should kill it off manually. */
> - break;
> + break;
>
> case APR_OC_REASON_RESTART:
> - if (pl->pid != NULL) {
> - apr_proc_kill(pl->pid, SIGTERM);
> - pl->pid = NULL;
> - }
> + /* At restart time, just forget about existing piped loggers.
> + * When the last child closes the pipe, the logger will read
> + * EOF and exit. */
> break;
>
> case APR_OC_REASON_UNREGISTER:
> @@ -895,27 +890,14 @@
> }
>
>
> -static apr_status_t piped_log_cleanup_for_exec(void *data)
> +static apr_status_t piped_log_cleanup(void *data)
> {
> piped_log *pl = data;
> -
> apr_file_close(ap_piped_log_read_fd(pl));
> apr_file_close(ap_piped_log_write_fd(pl));
> return APR_SUCCESS;
> }
>
> -
> -static apr_status_t piped_log_cleanup(void *data)
> -{
> - piped_log *pl = data;
> -
> - if (pl->pid != NULL) {
> - apr_proc_kill(pl->pid, SIGTERM);
> - }
> - return piped_log_cleanup_for_exec(data);
> -}
> -
> -
> AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
> {
> piped_log *pl;
> @@ -928,8 +910,7 @@
> &ap_piped_log_write_fd(pl), p) != APR_SUCCESS) {
> return NULL;
> }
> - apr_pool_cleanup_register(p, pl, piped_log_cleanup,
> - piped_log_cleanup_for_exec);
> + apr_pool_cleanup_register(p, pl, piped_log_cleanup, piped_log_cleanup);
> if (piped_log_spawn(pl) != APR_SUCCESS) {
> apr_pool_cleanup_kill(p, pl, piped_log_cleanup);
> apr_file_close(ap_piped_log_read_fd(pl));
>
>