You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2015/03/09 16:59:30 UTC

svn commit: r1665270 - in /httpd/httpd/trunk/server/mpm/motorz: motorz.c motorz.h

Author: jim
Date: Mon Mar  9 15:59:29 2015
New Revision: 1665270

URL: http://svn.apache.org/r1665270
Log:
we need sbh and might as well have some debug

Modified:
    httpd/httpd/trunk/server/mpm/motorz/motorz.c
    httpd/httpd/trunk/server/mpm/motorz/motorz.h

Modified: httpd/httpd/trunk/server/mpm/motorz/motorz.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/motorz/motorz.c?rev=1665270&r1=1665269&r2=1665270&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/motorz/motorz.c (original)
+++ httpd/httpd/trunk/server/mpm/motorz/motorz.c Mon Mar  9 15:59:29 2015
@@ -114,7 +114,7 @@ static void *motorz_io_setup_conn(apr_th
     motorz_conn_t *scon = (motorz_conn_t *) baton;
     
     ap_create_sb_handle(&sbh, scon->pool, 0, 0);
-    
+    scon->sbh = sbh;
     scon->ba = apr_bucket_alloc_create(scon->pool);
     
     scon->c = ap_run_create_connection(scon->pool, ap_server_conf, scon->sock,
@@ -299,8 +299,14 @@ static apr_status_t motorz_io_process(mo
     while (!c->aborted) {
         
         if (scon->pfd.reqevents != 0) {
+            /*
+             * Some of the pollset backends, like KQueue or Epoll
+             * automagically remove the FD if the socket is closed,
+             * therefore, we can accept _SUCCESS or _NOTFOUND,
+             * and we still want to keep going
+             */
             rv = apr_pollcb_remove(mz->pollcb, &scon->pfd);
-            if (rv) {
+            if (rv != APR_SUCCESS && !APR_STATUS_IS_NOTFOUND(rv)) {
                 ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, APLOGNO()
                              "motorz_io_process: apr_pollcb_remove failure");
                 /*AP_DEBUG_ASSERT(rv == APR_SUCCESS);*/
@@ -323,6 +329,7 @@ static apr_status_t motorz_io_process(mo
         
         if (scon->cs.state == CONN_STATE_WRITE_COMPLETION) {
             ap_filter_t *output_filter = c->output_filters;
+            ap_update_child_status_from_conn(scon->sbh, SERVER_BUSY_WRITE, c);
             while (output_filter->next != NULL) {
                 output_filter = output_filter->next;
             }
@@ -331,7 +338,7 @@ static apr_status_t motorz_io_process(mo
                                                            NULL);
             
             if (rv != APR_SUCCESS) {
-                ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, APLOGNO(00249)
+                ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, APLOGNO()
                              "network write failure in core output filter");
                 scon->cs.state = CONN_STATE_LINGER;
             }
@@ -358,9 +365,8 @@ static apr_status_t motorz_io_process(mo
                 
                 if (rv != APR_SUCCESS) {
                     ap_log_error(APLOG_MARK, APLOG_WARNING, rv,
-                                 ap_server_conf, APLOGNO(00250)
+                                 ap_server_conf, APLOGNO()
                                  "apr_pollcb_add: failed in write completion");
-                    AP_DEBUG_ASSERT(rv == APR_SUCCESS);
                 }
                 return APR_SUCCESS;
             }
@@ -397,10 +403,9 @@ static apr_status_t motorz_io_process(mo
             
             rv = apr_pollcb_add(mz->pollcb, &scon->pfd);
             
-            if (rv) {
+            if (rv != APR_SUCCESS) {
                 ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, APLOGNO()
                              "process_socket: apr_pollcb_add failure in read request line");
-                AP_DEBUG_ASSERT(rv == APR_SUCCESS);
             }
             
             return APR_SUCCESS;
@@ -438,18 +443,32 @@ static int motorz_setup_pollcb(motorz_co
     int i;
     apr_status_t rv;
     int good_methods[] = {APR_POLLSET_KQUEUE, APR_POLLSET_PORT, APR_POLLSET_EPOLL};
+    char *methods[] = {"kqueue", "port", "epoll"};
     
     for (i = 0; i < sizeof(good_methods) / sizeof(void*); i++) {
-        rv = apr_pollcb_create_ex(&mz->pollcb, 512,
-                                  mz->pool, APR_POLLSET_NODEFAULT, good_methods[i]);
-        if (!rv) {
+        rv = apr_pollcb_create_ex(&mz->pollcb,
+                                  512,
+                                  mz->pool,
+                                  APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY | APR_POLLSET_NODEFAULT,
+                                  good_methods[i]);
+        if (rv == APR_SUCCESS) {
+            ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, ap_server_conf, APLOGNO()
+                         "motorz_setup_pollcb: apr_pollcb_create_ex using %s", methods[i]);
+
             break;
         }
     }
-    if (rv) {
-        ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, APLOGNO()
+    if (rv != APR_SUCCESS) {
+        ap_log_error(APLOG_MARK, APLOG_INFO, rv, ap_server_conf, APLOGNO()
+                     "motorz_setup_pollcb: apr_pollcb_create_ex failed for all possible backends!");
+        rv = apr_pollcb_create(&mz->pollcb,
+                                    512,
+                                    mz->pool,
+                                    APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY);
+    }
+    if (rv != APR_SUCCESS) {
+        ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, APLOGNO()
                      "motorz_setup_pollcb: apr_pollcb_create failed for all possible backends!");
-        return rv;
     }
     return rv;
 }
@@ -833,7 +852,7 @@ static void child_main(motorz_core_t *mz
 
     status = motorz_setup_workers(mz);
     if (status != APR_SUCCESS) {
-        ap_log_error(APLOG_MARK, APLOG_CRIT, status, NULL, APLOGNO()
+        ap_log_error(APLOG_MARK, APLOG_CRIT, status, ap_server_conf, APLOGNO()
                      "child_main: motorz_setup_workers failed");
         clean_child_exit(APEXIT_CHILDSICK);
     }

Modified: httpd/httpd/trunk/server/mpm/motorz/motorz.h
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/motorz/motorz.h?rev=1665270&r1=1665269&r2=1665270&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/motorz/motorz.h (original)
+++ httpd/httpd/trunk/server/mpm/motorz/motorz.h Mon Mar  9 15:59:29 2015
@@ -178,6 +178,7 @@ struct motorz_conn_t
     motorz_core_t *mz;
     apr_socket_t *sock;
     apr_bucket_alloc_t *ba;
+    ap_sb_handle_t *sbh;
     conn_rec *c;
     /** poll file descriptor information */
     apr_pollfd_t pfd;