David Schlosnagle created HTTPCORE-713:
------------------------------------------

             Summary: Optimize InetAddressUtils#isIPv6*Address checks
                 Key: HTTPCORE-713
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-713
             Project: HttpComponents HttpCore
          Issue Type: Improvement
          Components: HttpCore
            Reporter: David Schlosnagle
         Attachments: 166573589-2c814d53-9639-4b14-82d0-9238f285be0b.png

See https://github.com/apache/httpcomponents-core/pull/347

Check input colon count before performing IPv6 regex validation.

{{org.apache.hc.core5.net.InetAddressUtils.isIPv6Address}} is used when 
constructing the {{host}} header for requests, and currently allocates a regex 
matcher when checking if the provided address is an IPv6 address. This is 
generates excess garbage and CPU cycles, especially in environments with mostly 
IPv4 addresses. By checking the colon count first, we see a 50x improvement 
checking {{InetAddressUtils.isIPv6Address}} for an IPv4 address.

The specific call backtrace seen looks like:
{code:java}
void java.util.regex.Matcher.<init>(Pattern, CharSequence)
   Matcher java.util.regex.Pattern.matcher(CharSequence)
   boolean 
org.apache.hc.core5.net.InetAddressUtils.isIPv6HexCompressedAddress(String)
      boolean org.apache.hc.core5.net.InetAddressUtils.isIPv6Address(String)
      void org.apache.hc.core5.net.Host.format(StringBuilder, NamedEndpoint)
      void org.apache.hc.core5.net.URIAuthority.format(StringBuilder, 
URIAuthority)
         String org.apache.hc.core5.net.URIAuthority.format(URIAuthority)
         String org.apache.hc.core5.net.URIAuthority.toString()
         String java.util.Objects.toString(Object, String)
         void org.apache.hc.core5.http.message.BasicHeader.<init>(String, 
Object, boolean)
         void org.apache.hc.core5.http.message.BasicHeader.<init>(String, 
Object)
         void 
org.apache.hc.core5.http.message.BasicHttpRequest.addHeader(String, Object)
         void 
org.apache.hc.core5.http.protocol.RequestTargetHost.process(HttpRequest, 
EntityDetails, HttpContext)
         void 
org.apache.hc.core5.http.protocol.DefaultHttpProcessor.process(HttpRequest, 
EntityDetails, HttpContext)
         ClassicHttpResponse 
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ClassicHttpRequest,
 ExecChain$Scope, ExecChain)
         ClassicHttpResponse 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ClassicHttpRequest,
 ExecChain$Scope)
         ClassicHttpResponse 
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ClassicHttpRequest,
 ExecChain$Scope)
         ClassicHttpResponse 
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(ClassicHttpRequest,
 ExecChain$Scope, ExecChain)
         ClassicHttpResponse 
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ClassicHttpRequest,
 ExecChain$Scope)
         CloseableHttpResponse 
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(HttpHost, 
ClassicHttpRequest, HttpContext)
         CloseableHttpResponse 
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(ClassicHttpRequest,
 HttpContext)
         CloseableHttpResponse 
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(ClassicHttpRequest)
{code}

>From JFR profile: 
!166573589-2c814d53-9639-4b14-82d0-9238f285be0b.png! 




--
This message was sent by Atlassian Jira
(v8.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to