> On Nov 16, 2015, at 12:38 PM, Yann Ylavic <[email protected]> wrote:
>
> On Mon, Nov 16, 2015 at 5:53 PM, jean-frederic clere <[email protected]>
> wrote:
>> On 01/09/2015 09:37 PM, [email protected] wrote:
>>>
>>> Modified: httpd/httpd/branches/2.4.x/modules/proxy/proxy_util.c
>>> URL:
>>> http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/proxy/proxy_util.c?rev=1650655&r1=1650654&r2=1650655&view=diff
>>> ==============================================================================
>>> --- httpd/httpd/branches/2.4.x/modules/proxy/proxy_util.c (original)
>>> +++ httpd/httpd/branches/2.4.x/modules/proxy/proxy_util.c Fri Jan 9
>>> 20:37:50 2015
>>> @@ -1683,6 +1683,9 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
>>>
>>> memset(wshared, 0, sizeof(proxy_worker_shared));
>>>
>>> + if (uri.port && uri.port == ap_proxy_port_of_scheme(uri.scheme)) {
>>> + uri.port = 0;
>>> + }
>>
>>
>> I must be doing something wrong but the above seems to hurt by 30% more
>> CPU one for the tests we are doing, any hints?
>
> Looks like you are quite heavy testing this path...
>
> Could you please try the following patch and see if it helps?
>
> Index: modules/proxy/proxy_util.c
> ===================================================================
> --- modules/proxy/proxy_util.c (revision 1714617)
> +++ modules/proxy/proxy_util.c (working copy)
> @@ -3663,35 +3663,51 @@ PROXY_DECLARE(int) ap_proxy_pass_brigade(apr_bucke
> return OK;
> }
>
> -/* Fill in unknown schemes from apr_uri_port_of_scheme() */
>
> -typedef struct proxy_schemes_t {
> - const char *name;
> - apr_port_t default_port;
> -} proxy_schemes_t ;
> -
> -static proxy_schemes_t pschemes[] =
> -{
> - {"fcgi", 8000},
> - {"ajp", AJP13_DEF_PORT},
> - {"scgi", SCGI_DEF_PORT},
> - { NULL, 0xFFFF } /* unknown port */
> -};
> -
> PROXY_DECLARE(apr_port_t) ap_proxy_port_of_scheme(const char *scheme)
> {
> if (scheme) {
> - apr_port_t port;
> - if ((port = apr_uri_port_of_scheme(scheme)) != 0) {
> - return port;
> - } else {
> - proxy_schemes_t *pscheme;
> - for (pscheme = pschemes; pscheme->name != NULL; ++pscheme) {
> - if (strcasecmp(scheme, pscheme->name) == 0) {
> - return pscheme->default_port;
> + /* Fill in unknown schemes from apr_uri_port_of_scheme(),
> + * and try a fast path for common schemes.
> + */
> + switch (ap_tolower(*scheme)) {
> + case 'a':
> + if (strcasecmp(scheme + 1, "jp") == 0) {
> + return AJP13_DEF_PORT;
> + }
> + break;
> + case 'f':
> + if (strcasecmp(scheme + 1, "cgi") == 0) {
> + return 8000;
> + }
> + if (strcasecmp(scheme + 1, "tp") == 0) {
> + return APR_URI_FTP_DEFAULT_PORT;
> + }
> + break;
> + case 'h':
> + if (strncasecmp(scheme + 1, "ttp", 4) == 0) {
Should be 3, shouldn't it?
> + int s4 = ap_tolower(scheme[4]);
> + if (!s4) {
> + return APR_URI_HTTP_DEFAULT_PORT;
> }
> + else if (s4 == 's' && !scheme[5]) {
> + return APR_URI_HTTPS_DEFAULT_PORT;
> + }
> }
If we are really trying to optimize the heck out of this, certainly
we should not ap_tolower s4 until we know it's not '\0'.
> + break;
> + case 'n':
> + if (strcasecmp(scheme + 1, "ntp") == 0) {
> + return APR_URI_NNTP_DEFAULT_PORT;
> + }
> + break;
> + case 's':
> + if (strcasecmp(scheme + 1, "cgi") == 0) {
> + return SCGI_DEF_PORT;
> + }
> + break;
> }
> +
> + return apr_uri_port_of_scheme(scheme);
> }
> return 0;
> }
> --
>
> Regards,
> Yann.