On Tue, 15 Nov 2011, [email protected] 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);




Reply via email to