[
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