Branch: refs/heads/master
  Home:   https://github.com/jenkinsci/remoting
  Commit: dc2dae86a8d800bff3a7158c746763aeeb91900f
      
https://github.com/jenkinsci/remoting/commit/dc2dae86a8d800bff3a7158c746763aeeb91900f
  Author: Kohsuke Kawaguchi <[email protected]>
  Date:   2013-07-05 (Fri, 05 Jul 2013)

  Changed paths:
    M src/main/java/hudson/remoting/Channel.java
    M src/main/java/hudson/remoting/MultiClassLoaderSerializer.java
    M src/main/java/hudson/remoting/RemoteInvocationHandler.java
    M src/test/java/hudson/remoting/PrefetchingTest.java

  Log Message:
  -----------
  dead lock prevention.

Access to JarLoader happens from inside classloading, and the act of
retrieving its proxy causes additional classloading. As a result, this
can sometimes cause a deadlock.

The classloader passed to
MultiClassLoaderSerializer$Input.resolveProxyClass (and hence to
Proxy.getProxyClass) is of RemoteClassLoader.

I first tried to force the eager proxy class creation, but this by
itself didn't work because the cache that Proxy maintains internally is
by ClassLoader.

So this is somewhat hack-ish, but in this change we look for a specific
proxy type that we use and resolve them outside Proxy.getProxyClass.

the following two threads illustrate a deadlock:

"Thread-1" daemon prio=10 tid=0x00007fac44036800 nid=0x54e3 waiting for monitor 
entry [0x00007fac90c71000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.reflect.Proxy.defineClass0(Native Method)
        at java.lang.reflect.Proxy.getProxyClass(Proxy.java:504)
        at 
hudson.remoting.MultiClassLoaderSerializer$Input.resolveProxyClass(MultiClassLoaderSerializer.java:127)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at hudson.remoting.UserRequest.deserialize(UserRequest.java:182)
        at hudson.remoting.UserResponse.retrieve(UserRequest.java:211)
        at hudson.remoting.Channel.call(Channel.java:719)
        at 
hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:162)
        at hudson.remoting.$Proxy0.waitForProperty(Unknown Source)
        at hudson.remoting.Channel.waitForRemoteProperty(Channel.java:1058)
        at 
hudson.remoting.JarCacheSupport.getJarLoader(JarCacheSupport.java:100)
        at 
hudson.remoting.FileSystemJarCache.retrieve(FileSystemJarCache.java:65)
        at hudson.remoting.JarCacheSupport$1.run(JarCacheSupport.java:62)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at 
hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:99)

"pool-1-thread-1" prio=10 tid=0x00007fac50003000 nid=0x54e2 in Object.wait() 
[0x00007fac90dac000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00000007ace50e48> (a java.util.HashMap)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.reflect.Proxy.getProxyClass(Proxy.java:436)
        - locked <0x00000007ace50e48> (a java.util.HashMap)
        at 
hudson.remoting.MultiClassLoaderSerializer$Input.resolveProxyClass(MultiClassLoaderSerializer.java:127)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at hudson.remoting.UserRequest.deserialize(UserRequest.java:182)
        at hudson.remoting.UserResponse.retrieve(UserRequest.java:211)
        at hudson.remoting.Channel.call(Channel.java:719)
        at 
hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:162)
        at hudson.remoting.$Proxy0.waitForProperty(Unknown Source)
        at hudson.remoting.Channel.waitForRemoteProperty(Channel.java:1058)
        at 
hudson.remoting.JarCacheSupport.getJarLoader(JarCacheSupport.java:100)
        at 
hudson.remoting.FileSystemJarCache.lookInCache(FileSystemJarCache.java:49)
        at hudson.remoting.JarCacheSupport.resolve(JarCacheSupport.java:43)
        at 
hudson.remoting.ResourceImageInJar._resolveJarURL(ResourceImageInJar.java:78)
        at 
hudson.remoting.ResourceImageInJar.resolve(ResourceImageInJar.java:42)
        at 
hudson.remoting.RemoteClassLoader.findClass(RemoteClassLoader.java:227)
        - locked <0x00000007acd17b20> (a hudson.remoting.RemoteClassLoader)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        - locked <0x00000007acd17b20> (a hudson.remoting.RemoteClassLoader)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.getDeclaredFields0(Native Method)
        at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
        at java.lang.Class.getDeclaredField(Class.java:1880)
        at 
java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1610)
        at java.io.ObjectStreamClass.access$700(ObjectStreamClass.java:52)
        at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:425)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:413)
        at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:310)
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:547)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at 
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
        at 
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at hudson.remoting.UserRequest.deserialize(UserRequest.java:182)
        at hudson.remoting.UserRequest.perform(UserRequest.java:98)
        at hudson.remoting.UserRequest.perform(UserRequest.java:48)
        at hudson.remoting.Request$2.run(Request.java:326)
        at 
hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)


  Commit: c4571d19c18e8edfaf0acd0098b484592f304db4
      
https://github.com/jenkinsci/remoting/commit/c4571d19c18e8edfaf0acd0098b484592f304db4
  Author: Kohsuke Kawaguchi <[email protected]>
  Date:   2013-07-05 (Fri, 05 Jul 2013)

  Changed paths:
    M pom.xml

  Log Message:
  -----------
  [maven-release-plugin] prepare release remoting-2.28


Compare: 
https://github.com/jenkinsci/remoting/compare/af77c9f7c916...c4571d19c18e

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Commits" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to