httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Fritsch ...@sfritsch.de>
Subject Re: svn commit: r1202256 - /httpd/httpd/trunk/server/mpm/event/event.c
Date Tue, 15 Nov 2011 17:28:28 GMT
On Tue, 15 Nov 2011, pquerna@apache.org wrote:

> Author: pquerna
> Date: Tue Nov 15 15:50:09 2011
> New Revision: 1202256
>
> URL: http://svn.apache.org/viewvc?rev=1202256&view=rev
> Log:
> Instead of disabling the listening sockets from the pollset when under 
> load, just stop calling the accept call, but leave the sockets in the 
> pollset.

Won't that mean that the listener thread will loop because the 
apr_pollset_poll call returns immediately?

> Modified:
>    httpd/httpd/trunk/server/mpm/event/event.c
>
> Modified: httpd/httpd/trunk/server/mpm/event/event.c
> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1202256&r1=1202255&r2=1202256&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/mpm/event/event.c (original)
> +++ httpd/httpd/trunk/server/mpm/event/event.c Tue Nov 15 15:50:09 2011
> @@ -1533,35 +1533,35 @@ static void * APR_THREAD_FUNC listener_t
>                 }
>             }
>             else if (pt->type == PT_ACCEPT) {
> +                int skip_accept = 0;
> +                int connection_count_local = connection_count;

connection_count is read/written atomically. While a normal read of a 
32bit int is atomic on most architectures, IMHO you cannot assume that 
this is the case on all architectures.

> +
>                 /* A Listener Socket is ready for an accept() */
>                 if (workers_were_busy) {
> -                    if (!listeners_disabled)
> -                        disable_listensocks(process_slot);
> -                    listeners_disabled = 1;
> +                    skip_accept = 1;
>                     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf,
>                                  "All workers busy, not accepting new conns"
>                                  "in this process");
>                 }
> -                else if (apr_atomic_read32(&connection_count) > threads_per_child
> +                else if (listeners_disabled) {
> +                    listeners_disabled = 0;
> +                    enable_listensocks(process_slot);
> +                }
> +                else if (connection_count_local > threads_per_child
>                          + ap_queue_info_get_idlers(worker_queue_info) *
>                            worker_factor / WORKER_FACTOR_SCALE)
>                 {
> -                    if (!listeners_disabled)
> -                        disable_listensocks(process_slot);
> +                    skip_accept = 1;
>                     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf,
>                                  "Too many open connections (%u), "
>                                  "not accepting new conns in this process",
> -                                 apr_atomic_read32(&connection_count));
> +                                 connection_count_local);
>                     ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, ap_server_conf,
>                                  "Idle workers: %u",
>                                  ap_queue_info_get_idlers(worker_queue_info));
> -                    listeners_disabled = 1;
>                 }
> -                else if (listeners_disabled) {
> -                    listeners_disabled = 0;
> -                    enable_listensocks(process_slot);
> -                }
> -                if (!listeners_disabled) {
> +
> +                if (skip_accept == 0) {
>                     lr = (ap_listen_rec *) pt->baton;
>                     ap_pop_pool(&ptrans, worker_queue_info);
>
>
>
>

Mime
View raw message