Loading modules/proxy/mod_proxy.c +20 −0 Changes for modules/proxy/mod_proxy.c: 20 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -218,6 +218,26 @@ static const char *set_worker_param(apr_pool_t *p, } } } else if (!strcasecmp(key, "ajpflushpackets")) { if (!strcasecmp(val, "on")) worker->ajp_flush_packets = ajp_flush_on; else if (!strcasecmp(val, "off")) worker->ajp_flush_packets = ajp_flush_off; else if (!strcasecmp(val, "auto")) worker->ajp_flush_packets = ajp_flush_auto; else return "FlushPackets must be On|Off|Auto"; } else if (!strcasecmp(key, "ajpflushwait")) { ival = atoi(val); if (ival > 1000 || ival < 0) { return "AJPFlushWait must be <= 1000, or 0 for system default of 10 millseconds."; } if (ival == 0) worker->ajp_flush_wait = AJP_FLUSH_WAIT; else worker->ajp_flush_wait = ival * 1000; /* change to microseconds */ } else { return "unknown Worker parameter"; } Loading modules/proxy/mod_proxy.h +12 −0 Changes for modules/proxy/mod_proxy.h: 12 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -302,8 +302,20 @@ struct proxy_worker { apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */ #endif void *context; /* general purpose storage */ enum { ajp_flush_off, ajp_flush_on, ajp_flush_auto } ajp_flush_packets; /* control AJP flushing */ int ajp_flush_wait; /* poll wait time in microseconds if flush_auto */ }; /* * Wait 10000 microseconds to find out if more data is currently * available at the backend. Just an arbitrary choose. */ #define AJP_FLUSH_WAIT 10000 struct proxy_balancer { apr_array_header_t *workers; /* array of proxy_workers */ const char *name; /* name of the load balancer */ Loading modules/proxy/mod_proxy_ajp.c +8 −23 Changes for modules/proxy/mod_proxy_ajp.c: 8 added lines, 23 removed lines. Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ static int proxy_ajp_canon(request_rec *r, char *url) } /* * XXX: Flushing bandaid * XXX: AJP Auto Flushing * * When processing CMD_AJP13_SEND_BODY_CHUNK AJP messages we will do a poll * with FLUSH_WAIT miliseconds timeout to determine if more data is currently Loading @@ -105,15 +105,6 @@ static int proxy_ajp_canon(request_rec *r, char *url) * For further discussion see PR37100. * http://issues.apache.org/bugzilla/show_bug.cgi?id=37100 */ #define FLUSHING_BANDAID 1 #ifdef FLUSHING_BANDAID /* * Wait 10000 microseconds to find out if more data is currently * available at the backend. Just an arbitrary choose. */ #define FLUSH_WAIT 10000 #endif /* * process the request and write the response. Loading @@ -140,10 +131,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, apr_off_t bb_len; int data_sent = 0; int rv = 0; #ifdef FLUSHING_BANDAID apr_int32_t conn_poll_fd; apr_pollfd_t *conn_poll; #endif /* * Send the AJP request to the remote server Loading Loading @@ -250,9 +239,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, result = ajp_parse_type(r, conn->data); output_brigade = apr_brigade_create(p, r->connection->bucket_alloc); #ifdef FLUSHING_BANDAID /* * Prepare apr_pollfd_t struct for later check if there is currently * Prepare apr_pollfd_t struct for possible later check if there is currently * data available from the backend (do not flush response to client) * or not (flush response to client) */ Loading @@ -260,7 +248,6 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, conn_poll->reqevents = APR_POLLIN; conn_poll->desc_type = APR_POLL_SOCKET; conn_poll->desc.s = conn->sock; #endif bufsiz = AJP13_MAX_SEND_BODY_SZ; while (isok) { Loading Loading @@ -330,17 +317,14 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); #ifdef FLUSHING_BANDAID /* * If there is no more data available from backend side * currently, flush response to client. */ if (apr_poll(conn_poll, 1, &conn_poll_fd, FLUSH_WAIT) == APR_TIMEUP) { if ( (conn->worker->ajp_flush_packets == ajp_flush_on) || ( (conn->worker->ajp_flush_packets == ajp_flush_auto) && (apr_poll(conn_poll, 1, &conn_poll_fd, conn->worker->ajp_flush_wait) == APR_TIMEUP) ) ) { e = apr_bucket_flush_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); } #endif apr_brigade_length(output_brigade, 0, &bb_len); if (bb_len != -1) conn->worker->s->read += bb_len; Loading @@ -366,6 +350,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, "proxy: error processing body"); isok = 0; } /* XXX: what about flush here? See mod_jk */ data_sent = 1; break; default: Loading modules/proxy/proxy_util.c +2 −0 Changes for modules/proxy/proxy_util.c: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -1318,6 +1318,8 @@ PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker, (*worker)->hostname = uri.hostname; (*worker)->port = uri.port; (*worker)->id = proxy_lb_workers; (*worker)->ajp_flush_packets = ajp_flush_off; (*worker)->ajp_flush_wait = AJP_FLUSH_WAIT; /* Increase the total worker count */ proxy_lb_workers++; init_conn_pool(p, *worker); Loading Loading
modules/proxy/mod_proxy.c +20 −0 Changes for modules/proxy/mod_proxy.c: 20 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -218,6 +218,26 @@ static const char *set_worker_param(apr_pool_t *p, } } } else if (!strcasecmp(key, "ajpflushpackets")) { if (!strcasecmp(val, "on")) worker->ajp_flush_packets = ajp_flush_on; else if (!strcasecmp(val, "off")) worker->ajp_flush_packets = ajp_flush_off; else if (!strcasecmp(val, "auto")) worker->ajp_flush_packets = ajp_flush_auto; else return "FlushPackets must be On|Off|Auto"; } else if (!strcasecmp(key, "ajpflushwait")) { ival = atoi(val); if (ival > 1000 || ival < 0) { return "AJPFlushWait must be <= 1000, or 0 for system default of 10 millseconds."; } if (ival == 0) worker->ajp_flush_wait = AJP_FLUSH_WAIT; else worker->ajp_flush_wait = ival * 1000; /* change to microseconds */ } else { return "unknown Worker parameter"; } Loading
modules/proxy/mod_proxy.h +12 −0 Changes for modules/proxy/mod_proxy.h: 12 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -302,8 +302,20 @@ struct proxy_worker { apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */ #endif void *context; /* general purpose storage */ enum { ajp_flush_off, ajp_flush_on, ajp_flush_auto } ajp_flush_packets; /* control AJP flushing */ int ajp_flush_wait; /* poll wait time in microseconds if flush_auto */ }; /* * Wait 10000 microseconds to find out if more data is currently * available at the backend. Just an arbitrary choose. */ #define AJP_FLUSH_WAIT 10000 struct proxy_balancer { apr_array_header_t *workers; /* array of proxy_workers */ const char *name; /* name of the load balancer */ Loading
modules/proxy/mod_proxy_ajp.c +8 −23 Changes for modules/proxy/mod_proxy_ajp.c: 8 added lines, 23 removed lines. Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ static int proxy_ajp_canon(request_rec *r, char *url) } /* * XXX: Flushing bandaid * XXX: AJP Auto Flushing * * When processing CMD_AJP13_SEND_BODY_CHUNK AJP messages we will do a poll * with FLUSH_WAIT miliseconds timeout to determine if more data is currently Loading @@ -105,15 +105,6 @@ static int proxy_ajp_canon(request_rec *r, char *url) * For further discussion see PR37100. * http://issues.apache.org/bugzilla/show_bug.cgi?id=37100 */ #define FLUSHING_BANDAID 1 #ifdef FLUSHING_BANDAID /* * Wait 10000 microseconds to find out if more data is currently * available at the backend. Just an arbitrary choose. */ #define FLUSH_WAIT 10000 #endif /* * process the request and write the response. Loading @@ -140,10 +131,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, apr_off_t bb_len; int data_sent = 0; int rv = 0; #ifdef FLUSHING_BANDAID apr_int32_t conn_poll_fd; apr_pollfd_t *conn_poll; #endif /* * Send the AJP request to the remote server Loading Loading @@ -250,9 +239,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, result = ajp_parse_type(r, conn->data); output_brigade = apr_brigade_create(p, r->connection->bucket_alloc); #ifdef FLUSHING_BANDAID /* * Prepare apr_pollfd_t struct for later check if there is currently * Prepare apr_pollfd_t struct for possible later check if there is currently * data available from the backend (do not flush response to client) * or not (flush response to client) */ Loading @@ -260,7 +248,6 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, conn_poll->reqevents = APR_POLLIN; conn_poll->desc_type = APR_POLL_SOCKET; conn_poll->desc.s = conn->sock; #endif bufsiz = AJP13_MAX_SEND_BODY_SZ; while (isok) { Loading Loading @@ -330,17 +317,14 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); #ifdef FLUSHING_BANDAID /* * If there is no more data available from backend side * currently, flush response to client. */ if (apr_poll(conn_poll, 1, &conn_poll_fd, FLUSH_WAIT) == APR_TIMEUP) { if ( (conn->worker->ajp_flush_packets == ajp_flush_on) || ( (conn->worker->ajp_flush_packets == ajp_flush_auto) && (apr_poll(conn_poll, 1, &conn_poll_fd, conn->worker->ajp_flush_wait) == APR_TIMEUP) ) ) { e = apr_bucket_flush_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); } #endif apr_brigade_length(output_brigade, 0, &bb_len); if (bb_len != -1) conn->worker->s->read += bb_len; Loading @@ -366,6 +350,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, "proxy: error processing body"); isok = 0; } /* XXX: what about flush here? See mod_jk */ data_sent = 1; break; default: Loading
modules/proxy/proxy_util.c +2 −0 Changes for modules/proxy/proxy_util.c: 2 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -1318,6 +1318,8 @@ PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker, (*worker)->hostname = uri.hostname; (*worker)->port = uri.port; (*worker)->id = proxy_lb_workers; (*worker)->ajp_flush_packets = ajp_flush_off; (*worker)->ajp_flush_wait = AJP_FLUSH_WAIT; /* Increase the total worker count */ proxy_lb_workers++; init_conn_pool(p, *worker); Loading