On Tue, Sep 7, 2021 at 6:08 PM Ruediger Pluem <rpl...@apache.org> wrote:
>
> On 9/7/21 11:34 AM, yla...@apache.org wrote:
> > Author: ylavic
> > Date: Tue Sep  7 09:34:09 2021
> > New Revision: 1893014
> >
> > URL: http://svn.apache.org/viewvc?rev=1893014&view=rev
> > Log:
> > mpm_event: Fix children processes possibly not stopped on graceful restart.
> >
> > The number of children spawned can go above active_daemons_limit due to
> > exponential idle_spawn_rate growth (x 2), enforce the upper limit in
> > perform_idle_server_maintenance().  PR 63169.
> >
> > Proposed by: Joel Self <joelself gmail.com>
> >
> > Added:
> >     httpd/httpd/trunk/changes-entries/event_maintenance_spawn_limit.txt
> > Modified:
> >     httpd/httpd/trunk/server/mpm/event/event.c
> >
> > Added: httpd/httpd/trunk/changes-entries/event_maintenance_spawn_limit.txt
> > URL: 
> > http://svn.apache.org/viewvc/httpd/httpd/trunk/changes-entries/event_maintenance_spawn_limit.txt?rev=1893014&view=auto
> > ==============================================================================
> > --- httpd/httpd/trunk/changes-entries/event_maintenance_spawn_limit.txt 
> > (added)
> > +++ httpd/httpd/trunk/changes-entries/event_maintenance_spawn_limit.txt Tue 
> > Sep  7 09:34:09 2021
> > @@ -0,0 +1,2 @@
> > +  *) mpm_event: Fix children processes possibly not stopped on graceful
> > +     restart.  PR 63169.  [Joel Self <joelself gmail.com>]
> > \ No newline at end of file
> >
> > Modified: httpd/httpd/trunk/server/mpm/event/event.c
> > URL: 
> > http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1893014&r1=1893013&r2=1893014&view=diff
> > ==============================================================================
> > --- httpd/httpd/trunk/server/mpm/event/event.c (original)
> > +++ httpd/httpd/trunk/server/mpm/event/event.c Tue Sep  7 09:34:09 2021
> > @@ -3237,6 +3237,9 @@ static void perform_idle_server_maintena
> >              if (free_length > retained->idle_spawn_rate[child_bucket]) {
> >                  free_length = retained->idle_spawn_rate[child_bucket];
> >              }
> > +            if (free_length + active_daemons > active_daemons_limit) {
> > +                free_length = active_daemons_limit - active_daemons;
>
> Are we sure that we can't have cases where active_daemons_limit < 
> active_daemons and free_length gets below zero?

If free_length (signed int) gets negative we'll do nothing in the "for
(i = 0; i < free_length; ...)" loop below, so I think we are safe?

Cheers;
Yann.

Reply via email to