Uploaded image for project: 'Felix'
  1. Felix
  2. FELIX-5816

Switch to java.util.Random for startup performance

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: framework-5.6.10
    • Fix Version/s: framework-6.0.0
    • Component/s: Framework
    • Labels:
      None

      Description

      Mailing list thread:

      https://www.mail-archive.com/users@felix.apache.org/msg18083.html

      When starting Felix up and on my Windows machines I'm seeing a significant slowdown in startup time due to accessing my Windows network adapter in order to read the Mac address as part of SecureRandom which is used to generate a UUID for each Felix instance.By significant slowdown, I'm talking about 1.5 seconds, which may go unnoticed in a server startup, but is a week in CLI-startup years. Java libs that want to access my network adapter's Mac address are a common nemesis of my startup times, mostly due to Windows sucking from what I can tell. This line here is where things start to go south:

      https://github.com/apache/felix/blob/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java#L675

      And the stack traces usually look similar to this right here:

      java.lang.Thread.State: RUNNABLE
        at java.net.NetworkInterface.getMacAddr0(Native Method)
        at java.net.NetworkInterface.getHardwareAddress(NetworkInterface.java:460)
        at 
      sun.security.provider.SeedGenerator.addNetworkAdapterInfo(SeedGenerator.java:238)
        at sun.security.provider.SeedGenerator.access$000(SeedGenerator.java:80)
        at sun.security.provider.SeedGenerator$1.run(SeedGenerator.java:183)
        at sun.security.provider.SeedGenerator$1.run(SeedGenerator.java:168)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
      sun.security.provider.SeedGenerator.getSystemEntropy(SeedGenerator.java:168)
        at 
      sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:201)
        at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:221)
        - locked <0x00000007415f5f40> (a sun.security.provider.SecureRandom)
        at java.security.SecureRandom.nextBytes(SecureRandom.java:468)
        at org.apache.felix.framework.util.Util.randomUUID(Util.java:795)
        at org.apache.felix.framework.Felix.init(Felix.java:675)
        at org.apache.felix.framework.Felix.init(Felix.java:626)
        at org.apache.felix.framework.Felix.start(Felix.java:964)
        ... unrelated bootstrapping code...
      

      As was suggested on the mailing list, switch to java.util.random.

      As a workaround on my machine, I was able to implement this code from Stackoverflow which avoids SecureRandom entirely.

      Optional.ofNullable( Security.getProvider( "SunMSCAPI" ) ).ifPresent( p->{
          Security.removeProvider( p.getName() );
          Security.insertProviderAt( p, 1 );
      } );
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                karlpauls Karl Pauls
                Reporter:
                bdw429s Bradley D Wood
              • Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: