Uploaded image for project: 'HttpComponents HttpCore'
  1. HttpComponents HttpCore
  2. HTTPCORE-713

Optimize InetAddressUtils#isIPv6*Address checks

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 5.1.4, 5.2-beta2
    • HttpCore
    • None
    • Patch

    Description

      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:

      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)
      

      From JFR profile:

      Attachments

        Activity

          People

            Unassigned Unassigned
            schlosna David Schlosnagle
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 0.5h
                0.5h