https://issues.apache.org/bugzilla/show_bug.cgi?id=57420

            Bug ID: 57420
           Summary: Wrong class names generated since URL_ENCODER in
                    DirContextURLConnection is not thread safe
           Product: Tomcat 7
           Version: 7.0.55
          Hardware: PC
            Status: NEW
          Severity: critical
          Priority: P2
         Component: Catalina
          Assignee: dev@tomcat.apache.org
          Reporter: matthias.kel...@ergon.ch

We've been debugging this for a long time. Sometimes when tomcat starts up, it
will fail to deploy a webapp since it cannot find a certain class. That class
name is always complete garbage.

The error stack trace always is:
SEVERE: Unable to process resource element
[jndi:/localhost/testapp/WEB-INF/classes/ch/blabli/dNlewrP.lculgiansDisalog$3.class]
for annotations
java.io.FileNotFoundException:
jndi:/localhost/testapp/WEB-INF/classes/ch/blabli/dNlewrP.lculgiansDisalog$3.class
        at
org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:389)

>From time to time we see, that the referenced class name is actually a mix of
the real class name and one or more other classes that exist in the vicinity of
that class.

Finally I was able to catch this exception with the debugger.
What I see is that the problem stems from
rg.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986):
- dcUrlConn (DirContextURLConnection) contains the correct entries of the WAR
file
- Enumeration<String> dirs = dcUrlConn.list()  however does not. Calling list()
again from the debugger yields the correct results.

Here's the contents of that dirs variable:

[lCsosn, oCrAopnpfliigcEadtiitoonr$AEpdpiltiocraMtoidoen.$c2l.acslsass, ,
tCioonnfi$gu4r.aticolnaLsosad, liconaftgiuroatni$o5n.LocadlLaisstsen,
cCaotnifiognur$a6.clastsi, lCaonsfsig, s, cluaiss,
CwoindgfetisegtEditorApplication$9.class,
ConfigEditorApplication$ApplicationConfigLoadListener.class,
ConfigEditorApplication$ConfigEditorToParameterHandlerIntegration.class,
ConfigEditorApplication$EditorMode$1.class,
ConfigEditorApplication$EditorMode$2.class,
ConfigEditorApplication$EditorMode.class, ConfigEditorApplication.class,
ConfigLoader$1.class, ConfigLoader.class,
ConfigurationLoadListener$ConfigType.class,
ConfigurationLoadListener$ConfigurationLoadedEvent.class,
ConfigurationLoadListener$FailedToLoadConfigurationEvent.class,
ConfigurationLoadListener.class, command, data, field, rendering, session, ui,
util, widgetset]

walking into the list() command leads to collection.list("/") which in turn is
encoded using an URL_ENCODER (class UEncoder). This URL_ENCODER is *not* thread
safe and can result in exactly such garbage if used concurrently.

It is interesting to note that every single failure we had at this step was
always caused by classes in the WEB-INF/classes directory, never in JAR files
in WEB-INF/lib.

To me it appears that there are two different DirContextURLConnections with
rare concurrency issues when both use the same URL_ENCODER.

Here's the full stacktrace when the error occurs:
        at
org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:389)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1994)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1902)
        at
org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1298)
        at
org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
        at
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
        at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5378)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at
org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1083)
        at
org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1880)
        at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

Jan 06, 2015 3:43:44 PM org.apache.catalina.startup.ContextConfig
processAnnotationsJndi
SEVERE: Unable to process resource element
[jndi:/localhost/medusa-config-editor-5.48.0/WEB-INF/classes/ch/ergon/medusa/configeditor/ui/dialog/TeerstRelgeaxsDialog.class]
for annotations
java.io.FileNotFoundException:
jndi:/localhost/medusa-config-editor-5.48.0/WEB-INF/classes/ch/ergon/medusa/configeditor/ui/dialog/TeerstRelgeaxsDialog.class
        at
org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:389)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1994)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1902)
        at
org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1298)
        at
org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
        at
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
        at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5378)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at
org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1083)
        at
org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1880)
        at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

Jan 06, 2015 3:43:44 PM org.apache.catalina.startup.ContextConfig
processAnnotationsJndi
SEVERE: Unable to process resource element
[jndi:/localhost/medusa-config-editor-5.48.0/WEB-INF/classes/ch/ergon/medusa/configeditor/ui/dialog/aTsesxtAreaDialog$2.class]
for annotations
java.io.FileNotFoundException:
jndi:/localhost/medusa-config-editor-5.48.0/WEB-INF/classes/ch/ergon/medusa/configeditor/ui/dialog/aTsesxtAreaDialog$2.class
        at
org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:389)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1994)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsJndi(ContextConfig.java:1986)
        at
org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1902)
        at
org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1298)
        at
org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:876)
        at
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:374)
        at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5378)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at
org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1083)
        at
org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1880)
        at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to