Re: [weld-dev] Thread deadlock with osgi refresh
Well, when looking at Niclas's answer - it is true that Weld's ClassFileUtils holds 0xfd03aa50 and also waiting in another thread to release this lock. But the weld-worker-1 thread (which holds the lock) is in state WAITING (on object monitor) due to org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5332) which calls m_bundleLock.wait(). Martin Dne 9.5.2017 v 11:45 Alex Sviridov napsal(a): > Hi Martin > > Thank you very much for your answer. Yes, I asked them. Please see > https://groups.google.com/forum/#!topic/ops4j/msmgHq0B1l8 > > > Вторник, 9 мая 2017, 12:22 +03:00 от Martin Kouba: > > Hi Alex, > > I don't know much about Felix and OSGi but it seems the > org.apache.felix.framework.Felix.acquireGlobalLock() is waiting to wake > up and the thread holds lock on > org.jboss.weld.util.bytecode.ClassFileUtils. Have you tried PAX CDI > guys > already? > > Martin > > Dne 9.5.2017 v 09:04 Alex Sviridov napsal(a): > > Hi all > > > > I use pax-cdi 1.0.0.RC2 with weld-osgi-bundle 2.3.5. And I have two > > bundles: bundleA and bundleB. > > > > BundleB has CDI beans and CDI container is created for bundleB. > Besides > > bundleB depends on bundleA. > > > > Now I update bundleA and do osgi refresh using this code > > > > |Bundle systemBundle = bundleContext.getBundle(0); > > FrameworkWiring frameworkWiring = > > systemBundle.adapt(FrameworkWiring.class); > > frameworkWiring.refreshBundles(null); > > > > What I see in log of bundle B. > > > > |2017-05-08 12:31:42,831 | DEBUG | xFrameworkWiring | ? | > BundleEvent STOPPING - com.bundleB > > 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | > ServiceEvent UNREGISTERING - [java.lang.Object] - com.bundleB > > 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | > BundleEvent STOPPED - com.bundleB > > 2017-05-08 12:31:42,845 | DEBUG | xFrameworkWiring | ? | > BundleEvent UNRESOLVED - com.bundleB > > 2017-05-08 12:31:42,885 | DEBUG | xFrameworkWiring | ? | > BundleEvent RESOLVED - com.bundleB > > 2017-05-08 12:31:42,886 | DEBUG | xFrameworkWiring | ? | > BundleEvent STARTING - com.bundleB > > 2017-05-08 12:31:43,164 | DEBUG | xFrameworkWiring | ? | > ServiceEvent REGISTERED - [java.lang.Object] - com.bundleB > > | > > Please,note that bundleB didn't change state to STARTED. When I don't > > use in bundleB CDI > > beans and CDI container is not created for bundleB then everything > is ok > > - after bundleA > > update and osgi refresh bundleB reaches STARTED state. > > > > Is this a bug of weld or something else? This is some thread dump: > > > > "weld-worker-3" #146 daemon prio=5 os_prio=0 tid=0x7f3e08044000 > > nid=0x1dc8 waiting for monitor entry [0x7f3dd867a000] > > java.lang.Thread.State: BLOCKED (on object monitor) > > at > > > > org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108) > > - waiting to lock <0xfd03aa50> (a java.lang.Class for > > org.jboss.weld.util.bytecode.ClassFileUtils) > > at > > > > org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97) > > at > > > > org.jboss.weld.bean.proxy.ProxyFactory.createProxyClass(ProxyFactory.java:491) > > at > > > > org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:364) > > at > > > > org.jboss.weld.bean.builtin.AbstractFacadeBean.initializeAfterBeanDiscovery(AbstractFacadeBean.java:61) > > at > > > > org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:136) > > at > > > > org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:127) > > at > > > > org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) > > at > > > > org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) > > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > > at > > > > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > > at > > > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > > at java.lang.Thread.run(Thread.java:745) > > > > "weld-worker-1" #144 daemon prio=5 os_prio=0 tid=0x7f3e08042800 > > nid=0x1dc6 in Object.wait() [0x7f3dd967e000] > > java.lang.Thread.State: WAITING (on object monitor) > > at java.lang.Object.wait(Native Method) > > at java.lang.Object.wait(Object.java:502) > > at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5332) > > - locked <0xed6de970> (a [Ljava.lang.Object;) > > at
Re: [weld-dev] Thread deadlock with osgi refresh
Hi Martin Thank you very much for your answer. Yes, I asked them. Please see https://groups.google.com/forum/#!topic/ops4j/msmgHq0B1l8 >Вторник, 9 мая 2017, 12:22 +03:00 от Martin Kouba: > >Hi Alex, > >I don't know much about Felix and OSGi but it seems the >org.apache.felix.framework.Felix.acquireGlobalLock() is waiting to wake >up and the thread holds lock on >org.jboss.weld.util.bytecode.ClassFileUtils. Have you tried PAX CDI guys >already? > >Martin > >Dne 9.5.2017 v 09:04 Alex Sviridov napsal(a): >> Hi all >> >> I use pax-cdi 1.0.0.RC2 with weld-osgi-bundle 2.3.5. And I have two >> bundles: bundleA and bundleB. >> >> BundleB has CDI beans and CDI container is created for bundleB. Besides >> bundleB depends on bundleA. >> >> Now I update bundleA and do osgi refresh using this code >> >> |Bundle systemBundle = bundleContext.getBundle(0); >> FrameworkWiring frameworkWiring = >> systemBundle.adapt(FrameworkWiring.class); >> frameworkWiring.refreshBundles(null); >> >> What I see in log of bundle B. >> >> |2017-05-08 12:31:42,831 | DEBUG | xFrameworkWiring | ? | BundleEvent >> STOPPING - com.bundleB >> 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | ServiceEvent >> UNREGISTERING - [java.lang.Object] - com.bundleB >> 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | BundleEvent STOPPED >> - com.bundleB >> 2017-05-08 12:31:42,845 | DEBUG | xFrameworkWiring | ? | BundleEvent >> UNRESOLVED - com.bundleB >> 2017-05-08 12:31:42,885 | DEBUG | xFrameworkWiring | ? | BundleEvent >> RESOLVED - com.bundleB >> 2017-05-08 12:31:42,886 | DEBUG | xFrameworkWiring | ? | BundleEvent >> STARTING - com.bundleB >> 2017-05-08 12:31:43,164 | DEBUG | xFrameworkWiring | ? | ServiceEvent >> REGISTERED - [java.lang.Object] - com.bundleB >> | >> Please,note that bundleB didn't change state to STARTED. When I don't >> use in bundleB CDI >> beans and CDI container is not created for bundleB then everything is ok >> - after bundleA >> update and osgi refresh bundleB reaches STARTED state. >> >> Is this a bug of weld or something else? This is some thread dump: >> >> "weld-worker-3" #146 daemon prio=5 os_prio=0 tid=0x7f3e08044000 >> nid=0x1dc8 waiting for monitor entry [0x7f3dd867a000] >> java.lang.Thread.State: BLOCKED (on object monitor) >> at >> org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108) >> - waiting to lock <0xfd03aa50> (a java.lang.Class for >> org.jboss.weld.util.bytecode.ClassFileUtils) >> at >> org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97) >> at >> org.jboss.weld.bean.proxy.ProxyFactory.createProxyClass(ProxyFactory.java:491) >> at >> org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:364) >> at >> org.jboss.weld.bean.builtin.AbstractFacadeBean.initializeAfterBeanDiscovery(AbstractFacadeBean.java:61) >> at >> org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:136) >> at >> org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:127) >> at >> org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) >> at >> org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) >> at java.util.concurrent.FutureTask.run(FutureTask.java:266) >> at >> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) >> at >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) >> at java.lang.Thread.run(Thread.java:745) >> >> "weld-worker-1" #144 daemon prio=5 os_prio=0 tid=0x7f3e08042800 >> nid=0x1dc6 in Object.wait() [0x7f3dd967e000] >> java.lang.Thread.State: WAITING (on object monitor) >> at java.lang.Object.wait(Native Method) >> at java.lang.Object.wait(Object.java:502) >> at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5332) >> - locked <0xed6de970> (a [Ljava.lang.Object;) >> at >> org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:481) >> at >> org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1652) >> at >> org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1552) >> at >> org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) >> at >> org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) >> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) >> at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925) >> at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978) >> at >> org.apache.xbean.osgi.bundle.util.DelegatingBundle.loadClass(DelegatingBundle.java:170) >> at >> org.apache.xbean.osgi.bundle.util.BundleClassLoader.loadClass(BundleClassLoader.java:75) >> at
Re: [weld-dev] Thread deadlock with osgi refresh
Hi Alex, I don't know much about Felix and OSGi but it seems the org.apache.felix.framework.Felix.acquireGlobalLock() is waiting to wake up and the thread holds lock on org.jboss.weld.util.bytecode.ClassFileUtils. Have you tried PAX CDI guys already? Martin Dne 9.5.2017 v 09:04 Alex Sviridov napsal(a): > Hi all > > I use pax-cdi 1.0.0.RC2 with weld-osgi-bundle 2.3.5. And I have two > bundles: bundleA and bundleB. > > BundleB has CDI beans and CDI container is created for bundleB. Besides > bundleB depends on bundleA. > > Now I update bundleA and do osgi refresh using this code > > |Bundle systemBundle = bundleContext.getBundle(0); > FrameworkWiring frameworkWiring = > systemBundle.adapt(FrameworkWiring.class); > frameworkWiring.refreshBundles(null); > > What I see in log of bundle B. > > |2017-05-08 12:31:42,831 | DEBUG | xFrameworkWiring | ? | BundleEvent > STOPPING - com.bundleB > 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | ServiceEvent > UNREGISTERING - [java.lang.Object] - com.bundleB > 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | BundleEvent STOPPED > - com.bundleB > 2017-05-08 12:31:42,845 | DEBUG | xFrameworkWiring | ? | BundleEvent > UNRESOLVED - com.bundleB > 2017-05-08 12:31:42,885 | DEBUG | xFrameworkWiring | ? | BundleEvent RESOLVED > - com.bundleB > 2017-05-08 12:31:42,886 | DEBUG | xFrameworkWiring | ? | BundleEvent STARTING > - com.bundleB > 2017-05-08 12:31:43,164 | DEBUG | xFrameworkWiring | ? | ServiceEvent > REGISTERED - [java.lang.Object] - com.bundleB > | > Please,note that bundleB didn't change state to STARTED. When I don't > use in bundleB CDI > beans and CDI container is not created for bundleB then everything is ok > - after bundleA > update and osgi refresh bundleB reaches STARTED state. > > Is this a bug of weld or something else? This is some thread dump: > > "weld-worker-3" #146 daemon prio=5 os_prio=0 tid=0x7f3e08044000 > nid=0x1dc8 waiting for monitor entry [0x7f3dd867a000] > java.lang.Thread.State: BLOCKED (on object monitor) > at > org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108) > - waiting to lock <0xfd03aa50> (a java.lang.Class for > org.jboss.weld.util.bytecode.ClassFileUtils) > at > org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97) > at > org.jboss.weld.bean.proxy.ProxyFactory.createProxyClass(ProxyFactory.java:491) > at > org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:364) > at > org.jboss.weld.bean.builtin.AbstractFacadeBean.initializeAfterBeanDiscovery(AbstractFacadeBean.java:61) > at > org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:136) > at > org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:127) > at > org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) > at > org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > > "weld-worker-1" #144 daemon prio=5 os_prio=0 tid=0x7f3e08042800 > nid=0x1dc6 in Object.wait() [0x7f3dd967e000] > java.lang.Thread.State: WAITING (on object monitor) > at java.lang.Object.wait(Native Method) > at java.lang.Object.wait(Object.java:502) > at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5332) > - locked <0xed6de970> (a [Ljava.lang.Object;) > at > org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:481) > at > org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1652) > at > org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1552) > at > org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) > at > org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) > at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925) > at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978) > at > org.apache.xbean.osgi.bundle.util.DelegatingBundle.loadClass(DelegatingBundle.java:170) > at > org.apache.xbean.osgi.bundle.util.BundleClassLoader.loadClass(BundleClassLoader.java:75) > at java.lang.ClassLoader.loadClass(ClassLoader.java:411) > - locked <0xfb14e428> (a > org.ops4j.pax.cdi.weld.impl.util.BundleClassLoader) > at > org.ops4j.pax.cdi.weld.impl.util.BundleClassLoader.loadClass(BundleClassLoader.java:193) > at java.lang.ClassLoader.loadClass(ClassLoader.java:357) > at java.lang.ClassLoader.defineClass1(Native Method) > at
[weld-dev] Thread deadlock with osgi refresh
Hi all I use pax-cdi 1.0.0.RC2 with weld-osgi-bundle 2.3.5. And I have two bundles: bundleA and bundleB. BundleB has CDI beans and CDI container is created for bundleB. Besides bundleB depends on bundleA. Now I update bundleA and do osgi refresh using this code Bundle systemBundle = bundleContext.getBundle(0); FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class); frameworkWiring.refreshBundles(null); What I see in log of bundle B. 2017-05-08 12:31:42,831 | DEBUG | xFrameworkWiring | ? | BundleEvent STOPPING - com.bundleB 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | ServiceEvent UNREGISTERING - [java.lang.Object] - com.bundleB 2017-05-08 12:31:42,832 | DEBUG | xFrameworkWiring | ? | BundleEvent STOPPED - com.bundleB 2017-05-08 12:31:42,845 | DEBUG | xFrameworkWiring | ? | BundleEvent UNRESOLVED - com.bundleB 2017-05-08 12:31:42,885 | DEBUG | xFrameworkWiring | ? | BundleEvent RESOLVED - com.bundleB 2017-05-08 12:31:42,886 | DEBUG | xFrameworkWiring | ? | BundleEvent STARTING - com.bundleB 2017-05-08 12:31:43,164 | DEBUG | xFrameworkWiring | ? | ServiceEvent REGISTERED - [java.lang.Object] - com.bundleB Please,note that bundleB didn't change state to STARTED. When I don't use in bundleB CDI beans and CDI container is not created for bundleB then everything is ok - after bundleA update and osgi refresh bundleB reaches STARTED state. Is this a bug of weld or something else? This is some thread dump: "weld-worker-3" #146 daemon prio=5 os_prio=0 tid=0x7f3e08044000 nid=0x1dc8 waiting for monitor entry [0x7f3dd867a000] java.lang.Thread.State: BLOCKED (on object monitor) at org.jboss.weld.util.bytecode.ClassFileUtils.toClass2(ClassFileUtils.java:108) - waiting to lock <0xfd03aa50> (a java.lang.Class for org.jboss.weld.util.bytecode.ClassFileUtils) at org.jboss.weld.util.bytecode.ClassFileUtils.toClass(ClassFileUtils.java:97) at org.jboss.weld.bean.proxy.ProxyFactory.createProxyClass(ProxyFactory.java:491) at org.jboss.weld.bean.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:364) at org.jboss.weld.bean.builtin.AbstractFacadeBean.initializeAfterBeanDiscovery(AbstractFacadeBean.java:61) at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:136) at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$AfterBeanDiscoveryInitializerFactory.doWork(ConcurrentBeanDeployer.java:127) at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) "weld-worker-1" #144 daemon prio=5 os_prio=0 tid=0x7f3e08042800 nid=0x1dc6 in Object.wait() [0x7f3dd967e000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:502) at org.apache.felix.framework.Felix.acquireGlobalLock(Felix.java:5332) - locked <0xed6de970> (a [Ljava.lang.Object;) at org.apache.felix.framework.StatefulResolver.resolve(StatefulResolver.java:481) at org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1652) at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1552) at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925) at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978) at org.apache.xbean.osgi.bundle.util.DelegatingBundle.loadClass(DelegatingBundle.java:170) at org.apache.xbean.osgi.bundle.util.BundleClassLoader.loadClass(BundleClassLoader.java:75) at java.lang.ClassLoader.loadClass(ClassLoader.java:411) - locked <0xfb14e428> (a org.ops4j.pax.cdi.weld.impl.util.BundleClassLoader) at org.ops4j.pax.cdi.weld.impl.util.BundleClassLoader.loadClass(BundleClassLoader.java:193) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:760) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at