[ 
https://issues.apache.org/jira/browse/FELIX-3262?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sergey Epik updated FELIX-3262:
-------------------------------

    Attachment: getHosts-osgiextender.txt

Thread dump that demonstrates problem.
                
> Startup delay due to URLHandlersBundleStreamHandler 
> ----------------------------------------------------
>
>                 Key: FELIX-3262
>                 URL: https://issues.apache.org/jira/browse/FELIX-3262
>             Project: Felix
>          Issue Type: Improvement
>          Components: Framework
>    Affects Versions: framework-3.0.9
>         Environment: Karaf 2.2.3 with spring-dm, spring
>            Reporter: Sergey Epik
>         Attachments: getHosts-osgiextender.txt
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> Problem: slow startup of bundles that use spring and spring-dm.
> When spring-dm starts spring application context, it puts a lot of objects 
> that contain URL into set/map structures.
> URL.hashCode delegates call to handler. 
> URLHandlersBundleStreamHandler does not implement hashCode(URL u), but 
> URLStreamHandler (parent) calls InetAddress.getByName(name) with bundle 
> number. 
> This call is very slow and method URLStreamHandler.getHostAddress is 
> synchronized.
> We have found that Equinox's handler 
> org.eclipse.osgi.framework.internal.core.BundleResourceHandler overrides 
> hashCode(URL u).
> Here is thread dump that demonstrates problem:
> [...]
> "SpringOsgiExtenderThread-14" - Thread t@43
>    java.lang.Thread.State: BLOCKED
>       at java.net.URLStreamHandler.getHostAddress(URLStreamHandler.java:412)
>       - waiting to lock <2a6cb4c8> (a 
> org.apache.felix.framework.URLHandlersBundleStreamHandler) owned by 
> "SpringOsgiExtenderThread-2" t@31
>       at java.net.URLStreamHandler.hashCode(URLStreamHandler.java:337)
>       at java.net.URL.hashCode(URL.java:857)
>       - locked <430eaae5> (a java.net.URL)
>       at 
> org.springframework.core.io.UrlResource.hashCode(UrlResource.java:217)
>       at java.util.HashMap.put(HashMap.java:372)
>       at java.util.HashSet.add(HashSet.java:200)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.doRetrieveMatchingBundleEntries(OsgiBundleResourcePatternResolver.java:707)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.doFindPathMatchingFileResources(OsgiBundleResourcePatternResolver.java:634)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.findPathMatchingResources(OsgiBundleResourcePatternResolver.java:577)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.findResources(OsgiBundleResourcePatternResolver.java:167)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.getResources(OsgiBundleResourcePatternResolver.java:197)
>       at 
> org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.getResources(AbstractOsgiBundleApplicationContext.java:425)
>       at 
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:177)
>       at 
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
>       at 
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:164)
>       at 
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:136)
>       at 
> org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
>       at 
> org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:69)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:269)
>       - locked <77f5c2c7> (a java.lang.Object)
>       at 
> org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:247)
>       at 
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:214)
>       at 
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:169)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:175)
>       at 
> org.springframework.osgi.extender.internal.activator.ContextLoaderListener$2.run(ContextLoaderListener.java:716)
>       at java.lang.Thread.run(Thread.java:662)
>    Locked ownable synchronizers:
>       - None
> "SpringOsgiExtenderThread-13" - Thread t@42
>    java.lang.Thread.State: BLOCKED
>       at java.net.URLStreamHandler.getHostAddress(URLStreamHandler.java:412)
>       - waiting to lock <2a6cb4c8> (a 
> org.apache.felix.framework.URLHandlersBundleStreamHandler) owned by 
> "SpringOsgiExtenderThread-2" t@31
>       at java.net.URLStreamHandler.hashCode(URLStreamHandler.java:337)
>       at java.net.URL.hashCode(URL.java:857)
>       - locked <6e9ef1ce> (a java.net.URL)
>       at 
> org.springframework.core.io.UrlResource.hashCode(UrlResource.java:217)
>       at java.util.HashMap.put(HashMap.java:372)
>       at java.util.HashSet.add(HashSet.java:200)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.doRetrieveMatchingBundleEntries(OsgiBundleResourcePatternResolver.java:707)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.doFindPathMatchingFileResources(OsgiBundleResourcePatternResolver.java:634)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.findPathMatchingResources(OsgiBundleResourcePatternResolver.java:577)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.findResources(OsgiBundleResourcePatternResolver.java:167)
>       at 
> org.springframework.osgi.io.OsgiBundleResourcePatternResolver.getResources(OsgiBundleResourcePatternResolver.java:197)
>       at 
> org.springframework.osgi.context.support.AbstractOsgiBundleApplicationContext.getResources(AbstractOsgiBundleApplicationContext.java:425)
>       at 
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:177)
>       at 
> org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
>       at 
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:164)
>       at 
> org.springframework.osgi.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:136)
>       at 
> org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
>       at 
> org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:69)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:269)
>       - locked <515441f> (a java.lang.Object)
>       at 
> org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:247)
>       at 
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:214)
>       at 
> org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:169)
>       at 
> org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:175)
>       at 
> org.springframework.osgi.extender.internal.activator.ContextLoaderListener$2.run(ContextLoaderListener.java:716)
>       at java.lang.Thread.run(Thread.java:662)
>    Locked ownable synchronizers:
>       - None
> [...]

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to