[FIXED JENKINS-24309] Caching class loads and misses from UberClassLoader.

This commit is contained in:
Jesse Glick committed 2014-08-18 15:36:56 -04:00
1 parent 6d298b0a49
commit cd33cdd8b7
2 files changed
+35 -2

No files matched your search

+32 -2
View File
@@ -435,6 +435,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
plugins.add(p);
activePlugins.add(p);
synchronized (((UberClassLoader) uberClassLoader).loaded) {
((UberClassLoader) uberClassLoader).loaded.clear();
}
try {
p.resolvePluginDependencies();
@@ -1015,6 +1018,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* Keyed by the generated class name.
*/
private ConcurrentMap<String, WeakReference<Class>> generatedClasses = new ConcurrentHashMap<String, WeakReference<Class>>();
/** Cache of loaded, or known to be unloadable, classes. */
private final Map<String,Class<?>> loaded = new HashMap<String,Class<?>>();
public UberClassLoader() {
super(PluginManager.class.getClassLoader());
@@ -1033,13 +1038,35 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
else generatedClasses.remove(name,wc);
}
if (name.startsWith("SimpleTemplateScript")) { // cf. groovy.text.SimpleTemplateEngine
throw new ClassNotFoundException("ignoring " + name);
}
synchronized (loaded) {
if (loaded.containsKey(name)) {
Class<?> c = loaded.get(name);
if (c != null) {
return c;
} else {
throw new ClassNotFoundException("cached miss for " + name);
}
}
}
if (FAST_LOOKUP) {
for (PluginWrapper p : activePlugins) {
try {
Class<?> c = ClassLoaderReflectionToolkit._findLoadedClass(p.classLoader, name);
if (c!=null) return c;
if (c != null) {
synchronized (loaded) {
loaded.put(name, c);
}
return c;
}
// calling findClass twice appears to cause LinkageError: duplicate class def
return ClassLoaderReflectionToolkit._findClass(p.classLoader, name);
c = ClassLoaderReflectionToolkit._findClass(p.classLoader, name);
synchronized (loaded) {
loaded.put(name, c);
}
return c;
} catch (ClassNotFoundException e) {
//not found. try next
}
@@ -1053,6 +1080,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
}
}
}
synchronized (loaded) {
loaded.put(name, null);
}
// not found in any of the classloader. delegate.
throw new ClassNotFoundException(name);
}