...

On 27 December 2011 01:40, Peter Firmstone <j...@zeus.net.au> wrote:
> The following is specific to:
>
> com/sun/jini/test/impl/start/aggregatepolicyprovider/GetContextTest.td
>
> I've just come across the concurrency issue (experienced randomly when
> attempting to debug any of the failing tests) in the existing River trunk
> code, after exiting the debugger, the test is in a deadlocked state, here's
> the thread dump:
>

Two threads arriving at the same point doesn't imply deadlock, in fact
it can mean quite the opposite. Deadlock requires two threads taking
resources in opposite orders so T1 takes a and tries to take b, T2
takes b and tries to take a. Thus I wouldn't expect both threads to be
blocking in implies.

So both threads arrived at AggregatePolicyProvider.implies but note
that method is not synchronized and the stack does not include mention
of getCurrentSubPolicy which does take a lock.

Thing is, the debugger itself could be the culprit, especially given
what you do below in terms of attempting a print.

If at all possible, it's going to be better to leave the debugger out
and wait for the test to deadlock, after which using jstack will give
a full dump and include a note of locks taken as well (something it
looks like the debugger above, doesn't do).

> In this case I've tried to print the domain (ProtectionDomain), as you can
> see two threads have arrived at the same breakpoint.
>
> jdb -attach 8000
> Set uncaught java.lang.Throwable
> Set deferred uncaught java.lang.Throwable
> Initializing jdb ...
>>
> VM Started: No frames on the current call stack
>
> main[1] stop in com.sun.jini.start.AggregatePolicyProvider.implies
> Deferring breakpoint com.sun.jini.start.AggregatePolicyProvider.implies.
> It will be set after the class is loaded.
> main[1] run
>> Set deferred breakpoint com.sun.jini.start.AggregatePolicyProvider.implies
>
>
> Breakpoint hit: "thread=main",
> com.sun.jini.start.AggregatePolicyProvider.implies(), line=201 bci=0
>
> main[1] print domain
>
> Breakpoint hit: "thread=main",
> com.sun.jini.start.AggregatePolicyProvider.implies(), line=201 bci=0
>
> main[1] where all
> Signal Dispatcher:
> Finalizer:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:118)
>  [3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:134)
>  [4] java.lang.ref.Finalizer$FinalizerThread.run (Finalizer.java:159)
> Reference Handler:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.Object.wait (Object.java:485)
>  [3] java.lang.ref.Reference$ReferenceHandler.run (Reference.java:116)
> main:
>  [1] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [2] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [3] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [4] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [5] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [6] java.security.ProtectionDomain.seeAllp (ProtectionDomain.java:295)
>  [7] java.security.ProtectionDomain.toString (ProtectionDomain.java:255)
>  [8] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [9] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [10] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [11] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [12] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [13] java.lang.SecurityManager.checkCreateClassLoader
> (SecurityManager.java:594)
>  [14] java.lang.ClassLoader.checkCreateClassLoader (ClassLoader.java:177)
>  [15] java.lang.ClassLoader.<init> (ClassLoader.java:225)
>  [16] java.security.SecureClassLoader.<init> (SecureClassLoader.java:93)
>  [17] java.net.URLClassLoader.<init> (URLClassLoader.java:115)
>  [18]
> com.sun.jini.test.impl.start.aggregatepolicyprovider.GetContextTest.run
> (GetContextTest.java:85)
>  [19] com.sun.jini.qa.harness.MasterTest.doTest (MasterTest.java:252)
>  [20] com.sun.jini.qa.harness.MasterTest.main (MasterTest.java:142)
> no heart without soul:
>  [1] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [2] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [3] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [4] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [5] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [6] java.lang.SecurityManager.checkRead (SecurityManager.java:871)
>  [7] java.io.File.exists (File.java:731)
>  [8] com.sun.jini.qa.harness.HeartOfTheMachine.hasReasonToLive
> (HeartOfTheMachine.java:56)
>  [9] com.sun.jini.qa.harness.HeartOfTheMachine.ticktack
> (HeartOfTheMachine.java:62)
>  [10] com.sun.jini.qa.harness.HeartOfTheMachine.access$000
> (HeartOfTheMachine.java:29)
>  [11] com.sun.jini.qa.harness.HeartOfTheMachine$1.run
> (HeartOfTheMachine.java:45)
>  [12] java.lang.Thread.run (Thread.java:662)
> Thread-2:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-3:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-4:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> RequestHandler:
>  [1] java.io.FileInputStream.readBytes (native method)
>  [2] java.io.FileInputStream.read (FileInputStream.java:220)
>  [3] java.io.BufferedInputStream.fill (BufferedInputStream.java:218)
>  [4] java.io.BufferedInputStream.read1 (BufferedInputStream.java:258)
>  [5] java.io.BufferedInputStream.read (BufferedInputStream.java:317)
>  [6] java.io.ObjectInputStream$PeekInputStream.read
> (ObjectInputStream.java:2,265)
>  [7] java.io.ObjectInputStream$PeekInputStream.readFully
> (ObjectInputStream.java:2,278)
>  [8] java.io.ObjectInputStream$BlockDataInputStream.readShort
> (ObjectInputStream.java:2,749)
>  [9] java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:779)
>  [10] java.io.ObjectInputStream.<init> (ObjectInputStream.java:279)
>  [11] com.sun.jini.qa.harness.MasterTest$RequestHandler.run
> (MasterTest.java:323)
>  [12] java.lang.Thread.run (Thread.java:662)
> main[1] monitor
> main[1] step
>
>>
> Breakpoint hit: "thread=no heart without soul",
> com.sun.jini.start.AggregatePolicyProvider.implies(), line=201 bci=0
>
> no heart without soul[1] where all
> Signal Dispatcher:
> Finalizer:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:118)
>  [3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:134)
>  [4] java.lang.ref.Finalizer$FinalizerThread.run (Finalizer.java:159)
> Reference Handler:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.Object.wait (Object.java:485)
>  [3] java.lang.ref.Reference$ReferenceHandler.run (Reference.java:116)
> main:
>  [1] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [2] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [3] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [4] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [5] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [6] java.security.ProtectionDomain.seeAllp (ProtectionDomain.java:295)
>  [7] java.security.ProtectionDomain.toString (ProtectionDomain.java:255)
>  [8] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [9] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [10] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [11] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [12] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [13] java.lang.SecurityManager.checkCreateClassLoader
> (SecurityManager.java:594)
>  [14] java.lang.ClassLoader.checkCreateClassLoader (ClassLoader.java:177)
>  [15] java.lang.ClassLoader.<init> (ClassLoader.java:225)
>  [16] java.security.SecureClassLoader.<init> (SecureClassLoader.java:93)
>  [17] java.net.URLClassLoader.<init> (URLClassLoader.java:115)
>  [18]
> com.sun.jini.test.impl.start.aggregatepolicyprovider.GetContextTest.run
> (GetContextTest.java:85)
>  [19] com.sun.jini.qa.harness.MasterTest.doTest (MasterTest.java:252)
>  [20] com.sun.jini.qa.harness.MasterTest.main (MasterTest.java:142)
> no heart without soul:
>  [1] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [2] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [3] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [4] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [5] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [6] java.lang.SecurityManager.checkRead (SecurityManager.java:871)
>  [7] java.io.File.exists (File.java:731)
>  [8] com.sun.jini.qa.harness.HeartOfTheMachine.hasReasonToLive
> (HeartOfTheMachine.java:56)
>  [9] com.sun.jini.qa.harness.HeartOfTheMachine.ticktack
> (HeartOfTheMachine.java:62)
>  [10] com.sun.jini.qa.harness.HeartOfTheMachine.access$000
> (HeartOfTheMachine.java:29)
>  [11] com.sun.jini.qa.harness.HeartOfTheMachine$1.run
> (HeartOfTheMachine.java:45)
>  [12] java.lang.Thread.run (Thread.java:662)
> Thread-2:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-3:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-4:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> RequestHandler:
>  [1] java.io.FileInputStream.readBytes (native method)
>  [2] java.io.FileInputStream.read (FileInputStream.java:220)
>  [3] java.io.BufferedInputStream.fill (BufferedInputStream.java:218)
>  [4] java.io.BufferedInputStream.read1 (BufferedInputStream.java:258)
>  [5] java.io.BufferedInputStream.read (BufferedInputStream.java:317)
>  [6] java.io.ObjectInputStream$PeekInputStream.read
> (ObjectInputStream.java:2,265)
>  [7] java.io.ObjectInputStream$PeekInputStream.readFully
> (ObjectInputStream.java:2,278)
>  [8] java.io.ObjectInputStream$BlockDataInputStream.readShort
> (ObjectInputStream.java:2,749)
>  [9] java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:779)
>  [10] java.io.ObjectInputStream.<init> (ObjectInputStream.java:279)
>  [11] com.sun.jini.qa.harness.MasterTest$RequestHandler.run
> (MasterTest.java:323)
>  [12] java.lang.Thread.run (Thread.java:662)
> no heart without soul[1] step
>
>>
> Breakpoint hit: "thread=main",
> com.sun.jini.start.AggregatePolicyProvider.implies(), line=201 bci=0
>
> main[1] where all
> Signal Dispatcher:
> Finalizer:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:118)
>  [3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:134)
>  [4] java.lang.ref.Finalizer$FinalizerThread.run (Finalizer.java:159)
> Reference Handler:
>  [1] java.lang.Object.wait (native method)
>  [2] java.lang.Object.wait (Object.java:485)
>  [3] java.lang.ref.Reference$ReferenceHandler.run (Reference.java:116)
> main:
>  [1] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [2] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [3] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [4] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [5] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [6] java.security.ProtectionDomain.seeAllp (ProtectionDomain.java:295)
>  [7] java.security.ProtectionDomain.toString (ProtectionDomain.java:255)
>  [8] com.sun.jini.start.AggregatePolicyProvider.implies
> (AggregatePolicyProvider.java:201)
>  [9] java.security.ProtectionDomain.implies (ProtectionDomain.java:224)
>  [10] java.security.AccessControlContext.checkPermission
> (AccessControlContext.java:352)
>  [11] java.security.AccessController.checkPermission
> (AccessController.java:546)
>  [12] java.lang.SecurityManager.checkPermission (SecurityManager.java:532)
>  [13] java.lang.SecurityManager.checkCreateClassLoader
> (SecurityManager.java:594)
>  [14] java.lang.ClassLoader.checkCreateClassLoader (ClassLoader.java:177)
>  [15] java.lang.ClassLoader.<init> (ClassLoader.java:225)
>  [16] java.security.SecureClassLoader.<init> (SecureClassLoader.java:93)
>  [17] java.net.URLClassLoader.<init> (URLClassLoader.java:115)
>  [18]
> com.sun.jini.test.impl.start.aggregatepolicyprovider.GetContextTest.run
> (GetContextTest.java:85)
>  [19] com.sun.jini.qa.harness.MasterTest.doTest (MasterTest.java:252)
>  [20] com.sun.jini.qa.harness.MasterTest.main (MasterTest.java:142)
> no heart without soul:
>  [1] java.lang.SecurityManager.checkRead (SecurityManager.java:873)
>  [2] java.io.File.exists (File.java:731)
>  [3] com.sun.jini.qa.harness.HeartOfTheMachine.hasReasonToLive
> (HeartOfTheMachine.java:56)
>  [4] com.sun.jini.qa.harness.HeartOfTheMachine.ticktack
> (HeartOfTheMachine.java:62)
>  [5] com.sun.jini.qa.harness.HeartOfTheMachine.access$000
> (HeartOfTheMachine.java:29)
>  [6] com.sun.jini.qa.harness.HeartOfTheMachine$1.run
> (HeartOfTheMachine.java:45)
>  [7] java.lang.Thread.run (Thread.java:662)
> Thread-2:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-3:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> Thread-4:
>  [1] java.net.PlainSocketImpl.socketAccept (native method)
>  [2] java.net.PlainSocketImpl.accept (PlainSocketImpl.java:408)
>  [3] java.net.ServerSocket.implAccept (ServerSocket.java:462)
>  [4] java.net.ServerSocket.accept (ServerSocket.java:430)
>  [5] com.sun.jini.tool.ClassServer.run (ClassServer.java:396)
> RequestHandler:
>  [1] java.io.FileInputStream.readBytes (native method)
>  [2] java.io.FileInputStream.read (FileInputStream.java:220)
>  [3] java.io.BufferedInputStream.fill (BufferedInputStream.java:218)
>  [4] java.io.BufferedInputStream.read1 (BufferedInputStream.java:258)
>  [5] java.io.BufferedInputStream.read (BufferedInputStream.java:317)
>  [6] java.io.ObjectInputStream$PeekInputStream.read
> (ObjectInputStream.java:2,265)
>  [7] java.io.ObjectInputStream$PeekInputStream.readFully
> (ObjectInputStream.java:2,278)
>  [8] java.io.ObjectInputStream$BlockDataInputStream.readShort
> (ObjectInputStream.java:2,749)
>  [9] java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:779)
>  [10] java.io.ObjectInputStream.<init> (ObjectInputStream.java:279)
>  [11] com.sun.jini.qa.harness.MasterTest$RequestHandler.run
> (MasterTest.java:323)
>  [12] java.lang.Thread.run (Thread.java:662)
> main[1] dump this
> this = {
>   mainPolicyClassProperty:
> "com.sun.jini.start.AggregatePolicyProvider.mainPolicyClass"
>   defaultMainPolicyClass: "net.jini.security.policy.DynamicPolicyProvider"
>   trustGetCCL: instance of java.util.WeakHashMap(id=962)
>   myDomain: instance of java.security.ProtectionDomain(id=963)
>   subPolicies: instance of com.sun.jini.collection.WeakIdentityMap(id=964)
>   subPolicyCache: instance of
> com.sun.jini.collection.WeakIdentityMap(id=965)
>   mainPolicy: instance of
> net.jini.security.policy.DynamicPolicyProvider(id=966)
>   $assertionsDisabled: true
>   java.security.Policy.UNSUPPORTED_EMPTY_COLLECTION: instance of
> java.security.Policy$UnsupportedEmptyCollection(id=967)
>   java.security.Policy.policy: instance of
> com.sun.jini.start.AggregatePolicyProvider(id=959)
>   java.security.Policy.debug: null
>   java.security.Policy.pdMapping: instance of java.util.WeakHashMap(id=968)
> }
> main[1] exit
>

Reply via email to