RestComm / jain-slee

The World's #1 Open Source JAIN-SLEE (JSLEE) 1.1 Implementation
http://www.restcomm.com/
GNU Affero General Public License v3.0
24 stars 50 forks source link

Synchronization regression in class loading #150

Open vp-elitnet opened 2 years ago

vp-elitnet commented 2 years ago

The issue manifested itself with the following symptom (exception at the top of the stack): "javax.xml.transform.TransformerFactoryConfigurationError: Provider for class javax.xml.transform.TransformerFactory cannot be created". The full call stack below could be teased out only with a debug-enabled build of "xalan".

2021-11-19 11:14:16,972 ERROR [stderr] (I/O dispatcher 2) java.lang.IllegalMonitorStateException
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.Object.wait(Native Method)
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at org.restcomm.slee.container.lib//org.mobicents.slee.container.component.deployment.classloading.URLClassLoaderDomainImpl.acquireGlobalLock(URLClassLoaderDomainImpl.java:123)
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at org.restcomm.slee.container.lib//org.mobicents.slee.container.component.deployment.classloading.URLClassLoaderDomainImpl.loadClass(URLClassLoaderDomainImpl.java:161)
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
2021-11-19 11:14:16,973 ERROR [stderr] (I/O dispatcher 2)       at org.apache.xalan//org.apache.xalan.xsltc.dom.ObjectFactory.findProviderClass(ObjectFactory.java:513)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at org.apache.xalan//org.apache.xalan.xsltc.dom.ObjectFactory.lookUpFactoryClass(ObjectFactory.java:219)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at org.apache.xalan//org.apache.xalan.xsltc.dom.XSLTCDTMManager.getDTMManagerClass(XSLTCDTMManager.java:97)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at org.apache.xalan//org.apache.xalan.xsltc.trax.TransformerFactoryImpl.(TransformerFactoryImpl.java:209)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at jdk.internal.reflect.GeneratedConstructorAccessor119.newInstance(Unknown Source)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2021-11-19 11:14:16,974 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
2021-11-19 11:14:16,975 ERROR [stderr] (I/O dispatcher 2)       at __redirected.ConstructorSupplier.get(ConstructorSupplier.java:34)
2021-11-19 11:14:16,975 ERROR [stderr] (I/O dispatcher 2)       at __redirected.__TransformerFactory.(__TransformerFactory.java:74)
2021-11-19 11:14:16,975 ERROR [stderr] (I/O dispatcher 2)       at jdk.internal.reflect.GeneratedConstructorAccessor118.newInstance(Unknown Source)
2021-11-19 11:14:16,975 ERROR [stderr] (I/O dispatcher 2)       at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:780)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:722)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1395)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.xml/javax.xml.transform.FactoryFinder$1.run(FactoryFinder.java:276)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.security.AccessController.doPrivileged(Native Method)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.xml/javax.xml.transform.FactoryFinder.findServiceProvider(FactoryFinder.java:271)
2021-11-19 11:14:16,976 ERROR [stderr] (I/O dispatcher 2)       at java.xml/javax.xml.transform.FactoryFinder.find(FactoryFinder.java:247)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at java.xml/javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:126)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.util.transform.EfficientStreamingTransformer.(EfficientStreamingTransformer.java:83)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.util.transform.EfficientStreamingTransformer.newTransformer(EfficientStreamingTransformer.java:449)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.soap.EnvelopeFactory.parseEnvelopeSax(EnvelopeFactory.java:201)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:122)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:85)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:172)
2021-11-19 11:14:16,977 ERROR [stderr] (I/O dispatcher 2)       at com.sun.xml.messaging.saaj//com.sun.xml.messaging.saaj.soap.MessageImpl.getSOAPBody(MessageImpl.java:1455)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at lt.elitnet.mobicents.soapra.http.SoapRequestHandler.parseSoapBody(SoapRequestHandler.java:240)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at lt.elitnet.mobicents.soapra.http.SoapRequestHandler.processPost(SoapRequestHandler.java:175)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at lt.elitnet.mobicents.soapra.http.SoapRequestHandler.handle(SoapRequestHandler.java:101)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at lt.elitnet.mobicents.soapra.http.SoapRequestHandler.handle(SoapRequestHandler.java:53)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.nio.protocol.HttpAsyncService.responseReady(HttpAsyncService.java:480)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.DefaultNHttpServerConnection.produceOutput(DefaultNHttpServerConnection.java:306)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.DefaultHttpServerIODispatch.onOutputReady(DefaultHttpServerIODispatch.java:248)
2021-11-19 11:14:16,978 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.DefaultHttpServerIODispatch.onOutputReady(DefaultHttpServerIODispatch.java:57)
2021-11-19 11:14:16,979 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.AbstractIODispatch.outputReady(AbstractIODispatch.java:145)
2021-11-19 11:14:16,979 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:187)
2021-11-19 11:14:16,979 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:341)
2021-11-19 11:14:16,979 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
2021-11-19 11:14:16,980 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
2021-11-19 11:14:16,980 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
2021-11-19 11:14:16,980 ERROR [stderr] (I/O dispatcher 2)       at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
2021-11-19 11:14:16,981 ERROR [stderr] (I/O dispatcher 2)       at java.base/java.lang.Thread.run(Thread.java:829)

This reaches user code as javax.xml.transform.TransformerFactoryConfigurationError. Given that applications are not supposed to handle java.lang.Error the issue is likely to cause resource leaks and eventually threaten SLEE server stability.

The root cause is the wait(long) method call at the top of the call stack without holding the object's monitor lock. Synchronization has been dropped in attempt to fix #114, making the wait() call invalid. #114 was caused by feature #49.