myGrid

Raven ArtifactClassLoader.findClass(*) not syncronized

Details

  • Type: Bug Bug
  • Status: Closed Closed
  • Priority: Major Major
  • Resolution: Cannot Reproduce
  • Affects Version/s: 1.5
  • Fix Version/s: 1.5.1
  • Component/s: Taverna Core
  • Labels:
    None

Description

The findClass of ArtifactClassLoader is not synchronised. It is theoretically possible that two concurrent threads (for instance threads that are loading SPIs) could call findClass() on the same class - in effect loading the class bytecode twice and constructing (and returning) two different Class instances.

However, just one of these will survive in the caching classMap. This means that on the next call a different Class object will be returned for the unlucky thread.

To complicate the picture, findClass() is a protected method, and is invoked by ClassLoader.loadClass() - which does cache. However, we have multiple class loaders, and it seems likely that each of these could cache the class object as it goes upstream. If two class instances has been made, they might survive in different class loaders, which will return them on future calls to loadClass().

In theory, two instances of the same class should be compatible if they have the same name and classloader (according to a random blog I found on Google on this). However, they will have separate static fields, and static initializers will be run for each of them, possibly creating havoc.

What is suggested is to create a test that for instance creates 100 threads that each try to load a class in a loop. If more than 1 instance of the class occurs, the test fails. Then, if this can be reproduced, we can try to to a quick-fix of findClass() by just making it protected. However, note that this will lock all classloaders pending down dependencies, and not just the classloader that is actually responsible for the artifact. This is partly because our internal findClass() calls findClass() directly on parent - and children classloaders - and not the synchronized loadClass(). (Why? to pass on seenLoaders to avoid cyclic trouble)

Issue Links

Activity

Hide
Stian Soiland-Reyes added a comment - 2006-11-08 09:34

We see stack traces suggesting that this is the case now and then:

DEBUG 2006-11-08 09:20:16,286 (org.embl.ebi.escience.scuflworkers.ProcessorHelper:310) - Attempting to load processor for: [Element: <s:processor [Namespace: http://org.embl.ebi.escience/xscufl/0.1alpha]/>]
DEBUG 2006-11-08 09:20:16,289 (org.embl.ebi.escience.scuflworkers.ProcessorHelper:319) - Possible help: [Element: <s:stringconstant [Namespace: http://org.embl.ebi.escience/xscufl/0.1alpha]/>] stringconstant -> org.embl.ebi.escience.scuflworkers.stringconstant.StringConstantXMLHandler@c5e055
Exception in thread "Thread-150" java.lang.IllegalArgumentException: org.embl.ebi.escience.scufl
        at java.lang.ClassLoader.definePackage(ClassLoader.java:1418)
        at java.net.URLClassLoader.definePackage(URLClassLoader.java:325)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:242)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:168)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:157)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:477)
Show
Stian Soiland-Reyes added a comment - 2006-11-08 09:34 We see stack traces suggesting that this is the case now and then:
DEBUG 2006-11-08 09:20:16,286 (org.embl.ebi.escience.scuflworkers.ProcessorHelper:310) - Attempting to load processor for: [Element: <s:processor [Namespace: http://org.embl.ebi.escience/xscufl/0.1alpha]/>]
DEBUG 2006-11-08 09:20:16,289 (org.embl.ebi.escience.scuflworkers.ProcessorHelper:319) - Possible help: [Element: <s:stringconstant [Namespace: http://org.embl.ebi.escience/xscufl/0.1alpha]/>] stringconstant -> org.embl.ebi.escience.scuflworkers.stringconstant.StringConstantXMLHandler@c5e055
Exception in thread "Thread-150" java.lang.IllegalArgumentException: org.embl.ebi.escience.scufl
        at java.lang.ClassLoader.definePackage(ClassLoader.java:1418)
        at java.net.URLClassLoader.definePackage(URLClassLoader.java:325)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:242)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:168)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:157)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:477)
Hide
Stian Soiland-Reyes added a comment - 2006-11-08 14:18

If we run Duncan's workflow, and synchronize loadClass() - we get a deadlock instead. This is not good either, so some more fine grained synchronization might do.

Show
Stian Soiland-Reyes added a comment - 2006-11-08 14:18 If we run Duncan's workflow, and synchronize loadClass() - we get a deadlock instead. This is not good either, so some more fine grained synchronization might do.
Hide
Stian Soiland-Reyes added a comment - 2006-11-08 14:49

Duncan's workflow "Genome annotation pipeline demonstrator workflow for Nucleic Acids Research" attached

Show
Stian Soiland-Reyes added a comment - 2006-11-08 14:49 Duncan's workflow "Genome annotation pipeline demonstrator workflow for Nucleic Acids Research" attached
Hide
Stian Soiland-Reyes added a comment - 2006-11-15 14:50
ERROR 2006-11-15 13:45:53,291 (org.embl.ebi.escience.scuflui.workbench.WorkbenchPerspectives:387) - ScuflModel: Untitled workflow urn:lsid:net.sf.taverna:wfDefinition:7e97694f-157d-4bec-8659-7756276ce799 is not an PerspectiveSPI instance
Exception in thread "Thread-159" java.lang.LinkageError: duplicate class definition: org/embl/ebi/escience/scufl/XScufl
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:180)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:165)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:477)
Show
Stian Soiland-Reyes added a comment - 2006-11-15 14:50
ERROR 2006-11-15 13:45:53,291 (org.embl.ebi.escience.scuflui.workbench.WorkbenchPerspectives:387) - ScuflModel: Untitled workflow urn:lsid:net.sf.taverna:wfDefinition:7e97694f-157d-4bec-8659-7756276ce799 is not an PerspectiveSPI instance
Exception in thread "Thread-159" java.lang.LinkageError: duplicate class definition: org/embl/ebi/escience/scufl/XScufl
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:180)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.loadClass(LocalRepository.java:220)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:193)
        at net.sf.taverna.raven.repository.impl.LocalRepository$ArtifactClassLoader.findClass(LocalRepository.java:165)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:477)
Hide
Stian Soiland-Reyes added a comment - 2006-11-15 15:15

from hotspot/src/share/vm/memory/systemDictionary.cpp

// In custom class loaders, the usual findClass calls
// findLoadedClass, which directly searches the SystemDictionary, then
// defineClass. If these are not atomic with respect to other threads,
// the findLoadedClass can fail, but the defineClass can get a
// LinkageError:: duplicate class definition.
// If they got a linkageError, check if a parallel class load succeeded.
// If it did, then for bytecode resolution the specification requires
// that we return the same result we did for the other thread, i.e. the
// successfully loaded instanceKlass
// Note: Class can not be unloaded as long as any classloader refs exist

Show
Stian Soiland-Reyes added a comment - 2006-11-15 15:15 from hotspot/src/share/vm/memory/systemDictionary.cpp // In custom class loaders, the usual findClass calls // findLoadedClass, which directly searches the SystemDictionary, then // defineClass. If these are not atomic with respect to other threads, // the findLoadedClass can fail, but the defineClass can get a // LinkageError:: duplicate class definition. // If they got a linkageError, check if a parallel class load succeeded. // If it did, then for bytecode resolution the specification requires // that we return the same result we did for the other thread, i.e. the // successfully loaded instanceKlass // Note: Class can not be unloaded as long as any classloader refs exist
Hide
Stian Soiland-Reyes added a comment - 2006-11-20 11:52

synchronized (loaderMap) seems to fix the LinkageError problems. Test now tries to load XScufl / jdom, with a hack to include xerces in the path.

Note that the unit test still fails with Maven, but works within Eclipse and running with JUnit 4 main(). (Try moving init() out of synchronized-block)

Still not quite sure if we have fixed the LinkageError: duplicate class definition exception as I have not been able to reproduce that in tests, probably because I would need to run the unit tests through Raven, which probably IS possible if we make the correct artifacts.

Show
Stian Soiland-Reyes added a comment - 2006-11-20 11:52 synchronized (loaderMap) seems to fix the LinkageError problems. Test now tries to load XScufl / jdom, with a hack to include xerces in the path. Note that the unit test still fails with Maven, but works within Eclipse and running with JUnit 4 main(). (Try moving init() out of synchronized-block) Still not quite sure if we have fixed the LinkageError: duplicate class definition exception as I have not been able to reproduce that in tests, probably because I would need to run the unit tests through Raven, which probably IS possible if we make the correct artifacts.
Hide
Stian Soiland-Reyes added a comment - 2006-11-22 09:33

Exception in thread "Thread-159" java.lang.LinkageError: duplicate class definition: org/embl/ebi/escience/scufl/XScufl
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:154)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:141)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at org.embl.ebi.escience.scuflworkers.stringconstant.StringConstantXMLHandler.loadProcessorFromXML(StringConstantXMLHandler.java:44)
at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:478)

Show
Stian Soiland-Reyes added a comment - 2006-11-22 09:33 Exception in thread "Thread-159" java.lang.LinkageError: duplicate class definition: org/embl/ebi/escience/scufl/XScufl at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:154) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:141) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at org.embl.ebi.escience.scuflworkers.stringconstant.StringConstantXMLHandler.loadProcessorFromXML(StringConstantXMLHandler.java:44) at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322) at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:478)
Hide
Stian Soiland-Reyes added a comment - 2006-11-23 08:30
FINER: No 'net.sf.taverna.raven.log.Log' in loader{uk.org.mygrid.taverna:taverna-core:1.5-SNAPSHOT} from 1733270
Exception in thread "Thread-164" java.lang.IllegalArgumentException: org.embl.ebi.escience.scufl
        at java.lang.ClassLoader.definePackage(ClassLoader.java:1418)
        at java.net.URLClassLoader.definePackage(URLClassLoader.java:325)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:242)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:154)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:141)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479)
Show
Stian Soiland-Reyes added a comment - 2006-11-23 08:30
FINER: No 'net.sf.taverna.raven.log.Log' in loader{uk.org.mygrid.taverna:taverna-core:1.5-SNAPSHOT} from 1733270
Exception in thread "Thread-164" java.lang.IllegalArgumentException: org.embl.ebi.escience.scufl
        at java.lang.ClassLoader.definePackage(ClassLoader.java:1418)
        at java.net.URLClassLoader.definePackage(URLClassLoader.java:325)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:242)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:154)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:193)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:166)
        at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:141)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:53)
        at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
        at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479)
Hide
Stuart Owen added a comment - 2006-11-24 15:20

Refactored and generally tidied up findClass.
Stores result in map at the end of the method.
Synchronise over classMap.

So far so good, no LinkageError after many tests!

Show
Stuart Owen added a comment - 2006-11-24 15:20 Refactored and generally tidied up findClass. Stores result in map at the end of the method. Synchronise over classMap. So far so good, no LinkageError after many tests!
Hide
Stuart Owen added a comment - 2006-11-24 16:13

Spoke too soon - had to remove the synchronisation of classMap as it caused deadlocks when running a workflow

Show
Stuart Owen added a comment - 2006-11-24 16:13 Spoke too soon - had to remove the synchronisation of classMap as it caused deadlocks when running a workflow
Hide
Stuart Owen added a comment - 2006-11-27 09:53

Moved the sychronisation up to the calling findClass, i.e. out of the recursive loop - this removed any deadlock problems.
However, still continued to get LinkageErrors - so sychronisation over the map doesn't seem to be the problem.

Put some trace in to check that we always get the same ACL for the classes XScufl, Namespace and even when getting the error
it appears that we do - so that is not the cause of the problem either.

Finally, refactored LocalServiceXMLHandler to store a local reference of the Namespace, rather than keep querying XScufl. This should
stop the error occuring for the purposes of getting a release out - but it doesn't solve the root of the problem.

Show
Stuart Owen added a comment - 2006-11-27 09:53 Moved the sychronisation up to the calling findClass, i.e. out of the recursive loop - this removed any deadlock problems. However, still continued to get LinkageErrors - so sychronisation over the map doesn't seem to be the problem. Put some trace in to check that we always get the same ACL for the classes XScufl, Namespace and even when getting the error it appears that we do - so that is not the cause of the problem either. Finally, refactored LocalServiceXMLHandler to store a local reference of the Namespace, rather than keep querying XScufl. This should stop the error occuring for the purposes of getting a release out - but it doesn't solve the root of the problem.
Hide
Stuart Owen added a comment - 2006-11-29 15:25

Just got it again:

java.lang.LinkageError: duplicate class definition: org/apache/commons/logging/LogFactory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:155)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:204)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:161)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:140)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at org.apache.axis.components.logger.LogFactory.class$(LogFactory.java:45)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
at org.apache.axis.handlers.BasicHandler.<clinit>(BasicHandler.java:43)
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.<init>(Service.java:113)
at org.embl.ebi.escience.scuflworkers.soaplab.Soap.callWebService(Soap.java:55)
at org.embl.ebi.escience.scuflworkers.soaplab.Soap.callWebService(Soap.java:29)
at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.generatePorts(SoaplabProcessor.java:240)
at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.setEndpoint(SoaplabProcessor.java:196)
at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.<init>(SoaplabProcessor.java:147)
at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabXMLHandler.loadProcessorFromXML(SoaplabXMLHandler.java:66)
at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479)

Show
Stuart Owen added a comment - 2006-11-29 15:25 Just got it again: java.lang.LinkageError: duplicate class definition: org/apache/commons/logging/LogFactory at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:155) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:204) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:161) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:140) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:164) at org.apache.axis.components.logger.LogFactory.class$(LogFactory.java:45) at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45) at java.security.AccessController.doPrivileged(Native Method) at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41) at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33) at org.apache.axis.handlers.BasicHandler.<clinit>(BasicHandler.java:43) at org.apache.axis.client.Service.getAxisClient(Service.java:104) at org.apache.axis.client.Service.<init>(Service.java:113) at org.embl.ebi.escience.scuflworkers.soaplab.Soap.callWebService(Soap.java:55) at org.embl.ebi.escience.scuflworkers.soaplab.Soap.callWebService(Soap.java:29) at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.generatePorts(SoaplabProcessor.java:240) at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.setEndpoint(SoaplabProcessor.java:196) at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabProcessor.<init>(SoaplabProcessor.java:147) at org.embl.ebi.escience.scuflworkers.soaplab.SoaplabXMLHandler.loadProcessorFromXML(SoaplabXMLHandler.java:66) at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322) at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479)
Hide
June Finch added a comment - 2006-12-04 11:18

Now more rare. Can't force it, doesn't happen when logging is on. Need to comment on this on the release notes.

Show
June Finch added a comment - 2006-12-04 11:18 Now more rare. Can't force it, doesn't happen when logging is on. Need to comment on this on the release notes.
Hide
June Finch added a comment - 2006-12-06 14:37

This is left on the 1.5 todo list to ensure the comment goes on the release notes. There is a workaround (try again) which is sufficient if explained clearly int he release notes, and we don't have any mechanism available to reproduce. This won't actually be resolved for 1.5

Show
June Finch added a comment - 2006-12-06 14:37 This is left on the 1.5 todo list to ensure the comment goes on the release notes. There is a workaround (try again) which is sufficient if explained clearly int he release notes, and we don't have any mechanism available to reproduce. This won't actually be resolved for 1.5
Hide
June Finch added a comment - 2007-01-03 10:56

No user has reported this against 1.5 as at 3rd January 2007.

Show
June Finch added a comment - 2007-01-03 10:56 No user has reported this against 1.5 as at 3rd January 2007.
Hide
June Finch added a comment - 2007-01-22 11:39

Can no longer be reproduced. If it raises it's ugly head again will reinvestigate/open a new bug at that time.

Show
June Finch added a comment - 2007-01-22 11:39 Can no longer be reproduced. If it raises it's ugly head again will reinvestigate/open a new bug at that time.
Hide
Stian Soiland-Reyes added a comment - 2007-05-16 09:42

Happened to me now using executeworkflow.sh:

INFO 2007-05-16 09:30:29,354 org.embl.ebi.escience.utils.TavernaSPIRegistry (TavernaSPIRegistry$1:92) Registry updated <org.embl.ebi.escience.scuflworkers.ProcessorInfoBean> :
INFO 2007-05-16 09:30:29,575 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl
INFO 2007-05-16 09:30:29,575 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl
INFO 2007-05-16 09:30:29,576 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl
INFO 2007-05-16 09:30:29,576 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl
INFO 2007-05-16 09:30:29,627 org.embl.ebi.escience.utils.TavernaSPIRegistry (TavernaSPIRegistry$1:92) Registry updated <org.embl.ebi.escience.scuflworkers.java.LocalWorker> :
ERROR 2007-05-16 09:30:29,632 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Error finding class uk.ac.soton.itinnovation.taverna.enactor.entities.TaskExecutionException ACL=loader{uk.org.mygrid.taverna.scufl:scufl-model:1.5.1} from 10451601
java.lang.LinkageError: duplicate class definition: uk/ac/soton/itinnovation/taverna/enactor/entities/TaskExecutionException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:168)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174)
at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:144)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
at org.embl.ebi.escience.scuflworkers.java.LocalServiceProcessor.<init>(LocalServiceProcessor.java:88)
at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:61)
at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322)
at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479)
INFO 2007-05-16 09:30:29,637 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Could not find uk.ac.soton.itinnovation.taverna.enactor.entities.TaskExecutionException in uk.org.mygrid.taverna.processors:taverna-localworkers:1.5.1.1
INFO 2007-05-16 09:30:29,786 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Could not find org.apache.axis.i18n.resource in uk.org.mygrid.resources:axis:1.4-taverna

Show
Stian Soiland-Reyes added a comment - 2007-05-16 09:42 Happened to me now using executeworkflow.sh: INFO 2007-05-16 09:30:29,354 org.embl.ebi.escience.utils.TavernaSPIRegistry (TavernaSPIRegistry$1:92) Registry updated <org.embl.ebi.escience.scuflworkers.ProcessorInfoBean> : INFO 2007-05-16 09:30:29,575 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl INFO 2007-05-16 09:30:29,575 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl INFO 2007-05-16 09:30:29,576 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl INFO 2007-05-16 09:30:29,576 org.embl.ebi.escience.scuflworkers.wsdl.parser.WSDLParser (WSDLParser:99) Initialising WSDLParser for http://www.ebi.ac.uk/Tools/webservices/wsdl/WSWUBlast.wsdl INFO 2007-05-16 09:30:29,627 org.embl.ebi.escience.utils.TavernaSPIRegistry (TavernaSPIRegistry$1:92) Registry updated <org.embl.ebi.escience.scuflworkers.java.LocalWorker> : ERROR 2007-05-16 09:30:29,632 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Error finding class uk.ac.soton.itinnovation.taverna.enactor.entities.TaskExecutionException ACL=loader{uk.org.mygrid.taverna.scufl:scufl-model:1.5.1} from 10451601 java.lang.LinkageError: duplicate class definition: uk/ac/soton/itinnovation/taverna/enactor/entities/TaskExecutionException at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:168) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.loadClass(LocalArtifactClassLoader.java:221) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:174) at net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader.findClass(LocalArtifactClassLoader.java:144) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328) at java.lang.Class.getConstructor0(Class.java:2640) at java.lang.Class.newInstance0(Class.java:321) at java.lang.Class.newInstance(Class.java:303) at org.embl.ebi.escience.scuflworkers.java.LocalServiceProcessor.<init>(LocalServiceProcessor.java:88) at org.embl.ebi.escience.scuflworkers.java.LocalServiceXMLHandler.loadProcessorFromXML(LocalServiceXMLHandler.java:61) at org.embl.ebi.escience.scuflworkers.ProcessorHelper.loadProcessorFromXML(ProcessorHelper.java:322) at org.embl.ebi.escience.scufl.parser.ProcessorLoaderThread.run(XScuflParser.java:479) INFO 2007-05-16 09:30:29,637 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Could not find uk.ac.soton.itinnovation.taverna.enactor.entities.TaskExecutionException in uk.org.mygrid.taverna.processors:taverna-localworkers:1.5.1.1 INFO 2007-05-16 09:30:29,786 net.sf.taverna.raven.repository.impl.LocalArtifactClassLoader (Log4jLog:60) Could not find org.apache.axis.i18n.resource in uk.org.mygrid.resources:axis:1.4-taverna

People

Vote (0)
Watch (0)

Dates

  • Created:
    2006-11-03 11:38
    Updated:
    2007-05-16 09:52
    Resolved:
    2007-01-22 11:39