Actually, it hangs sporadically.
Just happened again.
hmmm....

On Fri, Nov 18, 2011 at 21:25, Guillaume Laforge <glafo...@gmail.com> wrote:

> I'm still wondering if that could be something in my codebase also that
> could be influencing that strange behaviour.
> My code base has evolved since when it was failing a few days ago, and
> I've tried running again the build with gradle test, and then it wasn't
> hanging anymore.
> Perhaps going back through an older revision I could find a point where it
> was failing.
> In my tests, I'm using the unit testing classes of the Google App Engine
> SDK, which use thread locals and probably other tricks... perhaps it could
> be launching some daemon threads or something (but I'd expect to see them
> though in the traces).
> Could you think of something that a test could be doing, that could
> prevent Gradle from doing its job?
> And interesting... something that would not prevent IntelliJ from
> exhibiting the same behaviour...
>
> Guillaume
>
> On Fri, Nov 18, 2011 at 20:03, Luke Daley <luke.da...@gradleware.com>wrote:
>
>>
>>
>> Begin forwarded message:
>>
>> *From: *Guillaume Laforge <glafo...@gmail.com>
>> *Subject: **Re: [gradle-user] Build hanging at test execution*
>> *Date: *15 November 2011 10:02:19 PM GMT
>> *To: *u...@gradle.codehaus.org
>> *Reply-To: *u...@gradle.codehaus.org
>>
>> Hi Adam,
>>
>> So with milestone 5, I just did a kill -3 on the two Gradle processes
>> that I was seeing running with ps aux on my Mac, and here's what I get,
>> below.
>> I see no trace of my own code there (Gaelyk), nor of the library I'm
>> using (the Google App Engine SDK), and only see Gradle stuff :-(
>>
>>
>> After looking through the stacks, my only conclusion is that the worker
>> process never received the stop method call.
>>
>> A couple of interesting parts:
>>
>> "socket connection at /0:0:0:0:0:0:0:1%0:51890 with
>> /0:0:0:0:0:0:0:1:51874 receive" prio=5 tid=1018d6000 nid=0x109e4a000
>> runnable [109e48000]
>>    java.lang.Thread.State: RUNNABLE
>> at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
>> at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:136)
>>  at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:69)
>> at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
>>  - locked <7f45905c0> (a sun.nio.ch.Util$2)
>> - locked <7f45905a8> (a java.util.Collections$UnmodifiableSet)
>>  - locked <7f44e1ce8> (a sun.nio.ch.KQueueSelectorImpl)
>> at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
>>  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:84)
>> at
>> org.gradle.messaging.remote.internal.inet.SocketConnection$SocketInputStream.read(SocketConnection.java:142)
>>  at java.io.DataInputStream.read(DataInputStream.java:132)
>> at
>> java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2265)
>>  at
>> java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2278)
>> at
>> java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
>>  at
>> java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
>> at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
>>  at
>> org.gradle.util.ClassLoaderObjectInputStream.<init>(ClassLoaderObjectInputStream.java:27)
>> at
>> org.gradle.messaging.remote.internal.Message$ExceptionReplacingObjectInputStream.<init>(Message.java:151)
>>  at org.gradle.messaging.remote.internal.Message.receive(Message.java:37)
>> at
>> org.gradle.messaging.remote.internal.DefaultMessageSerializer.read(DefaultMessageSerializer.java:31)
>>  at
>> org.gradle.messaging.remote.internal.inet.SocketConnection.receive(SocketConnection.java:75)
>> at
>> org.gradle.messaging.remote.internal.DelegatingConnection.receive(DelegatingConnection.java:31)
>>  at
>> org.gradle.messaging.remote.internal.MessageHub$EeamConnection.receive(MessageHub.java:210)
>> at
>> org.gradle.messaging.remote.internal.MessageHub$EndOfStreamConnection.receive(MessageHub.java:195)
>>  at
>> org.gradle.messaging.remote.internal.AsyncConnectionAdapter$ConnectionReceive.receive(AsyncConnectionAdapter.java:77)
>> at
>> org.gradle.messaging.dispatch.AsyncReceive.receiveMessages(AsyncReceive.java:125)
>>  at
>> org.gradle.messaging.dispatch.AsyncReceive.access$000(AsyncReceive.java:32)
>> at org.gradle.messaging.dispatch.AsyncReceive$1.run(AsyncReceive.java:74)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>> 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:680)
>>
>>
>> [worker process] - this looks like the message consumer thread, blocked
>> in a read
>>
>> "main" prio=5 tid=101801800 nid=0x100501000 waiting on condition
>> [100500000]
>>    java.lang.Thread.State: WAITING (parking)
>> at sun.misc.Unsafe.park(Native Method)
>> - parking to wait for  <7f4572288> (a
>> java.util.concurrent.CountDownLatch$Sync)
>>  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
>> at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
>>  at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
>> at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
>>  at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:207)
>> at
>> org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:74)
>>  at
>> org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:35)
>> at
>> org.gradle.process.internal.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:77)
>>  at
>> org.gradle.process.internal.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:35)
>> at
>> org.gradle..internal.child.ImplementationClassLoaderWorker.execute(ImplementationClassLoaderWorker.java:79)
>>  at
>> org.gradle.process.internal.child.ImplementationClassLoaderWorker.execute(ImplementationClassLoaderWorker.java:35)
>> at
>> org.gradle.process.internal.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:56)
>>  at
>> org.gradle.process.internal.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:38)
>> at
>> org.gradle.process.internal.launcher.BootstrapClassLoaderWorker.call(BootstrapClassLoaderWorker.java:52)
>>  at
>> org.gradle.process.internal.launcher.BootstrapClassLoaderWorker.call(BootstrapClassLoaderWorker.java:33)
>> at
>> org.gradle.process.internal.launcher.GradleWorkerMain.run(GradleWorkerMain.java:30)
>>  at
>> org.gradle.process.internal.launcher.GradleWorkerMain.main(GradleWorkerMain.java:35)
>>
>>
>> [worker process] - this is the “main” thread, it's waiting on a latch
>> that gets triggered when the worker process sees message to stop.
>>
>> Now for the other side…
>>
>> "socket connection at /0:0:0:0:0:0:0:1%0:51874 with
>> /0:0:0:0:0:0:0:1%0:51890 receive" prio=5 tid=101adf000 nid=0x10b3fc000
>> runnable [10b3fa000]
>>    java.lang.Thread.State: RUNNABLE
>> at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
>> at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:136)
>>  at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:69)
>> at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
>>  - locked <7f3ad4598> (a sun.nio.ch.Util$2)
>> - locked <7f3ad4588> (a java.util.Collections$UnmodifiableSet)
>>  - locked <7f3ad4380> (a sun.nio.ch.KQueueSelectorImpl)
>> at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
>>  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:84)
>> at
>> org.gradle.messaging.remote.internal.inet.SocketConnection$SocketInputStream.read(SocketConnection.java:142)
>>  at java.io.DataInputStream.read(DataInputStream.java:132)
>> at
>> java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2265)
>>  at
>> java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2278)
>> at
>> java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
>>  at
>> java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
>> at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
>>  at
>> org.gradle.util.ClassLoaderObjectInputStream.<init>(ClassLoaderObjectInputStream.java:27)
>> at
>> org.gradle.messaging.remote.internal.Message$ExceptionReplacingObjectInputStream.<init>(Message.java:151)
>>  at org.gradle.messaging.remote.internal.Message.receive(Message.java:37)
>> at
>> org.gradle.messaging.remote.internal.DefaultMessageSerializer.read(DefaultMessageSerializer.java:31)
>>  at
>> org.gradle.messaging.remote.internal.inet.SocketConnection.receive(SocketConnection.java:75)
>> at
>> org.gradle.messaging.remote.internal.DelegatingConnection.receive(DelegatingConnection.java:31)
>>  at
>> org.gradle.messaging.remote.internal.MessageHub$EndOfStreamConnection.receive(MessageHub.java:210)
>> at
>> org.gradle.messaging.remote.internal.MessageHub$EndOfStreamConnection.receive(MessageHub.java:195)
>>  at
>> org.gradle.messaging.remote.internal.AsyncConnectionAdapter$ConnectionReceive.receive(AsyncConnectionAdapter.java:77)
>> at
>> org.gradle.messaging.dispatch.AsyncReceive.receiveMessages(AsyncReceive.java:125)
>>  at
>> org.gradle.messaging.dispatch.AsyncReceive.access$000(AsyncReceive.java:32)
>> at org.gradle.messaging.dispatch.AsyncReceive$1.run(AsyncReceive.java:74)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>> 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:680)
>>
>>
>> [build process] - looks like the read side of the connection to the
>> worker, blocked in a read
>>
>> "Run Gradle Worker 1 Thread 4" prio=5 tid=101acc000 nid=0x10b2f9000
>> runnable [10b2f8000]
>>    java.lang.Thread.State: RUNNABLE
>> at java.io.FileInputStream.readBytes(Native Method)
>> at java.io.FileInputStream.read(FileInputStream.java:198)
>>  at
>> java.lang.UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:218)
>> at
>> org.gradle.process.internal.ExecOutputHandleRunner.run(ExecOutputHandleRunner.java:46)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>> 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:680)
>>
>>
>> [build process] - unsure what this is
>>
>> "Run Gradle Worker 1 Thread 3" prio=5 tid=101acb000 nid=0x10b19c000
>> runnable [10b19b000]
>>    java.lang.Thread.State: RUNNABLE
>> at java.io.FileInputStream.readBytes(Native Method)
>>  at java.io.FileInputStream.read(FileInputStream.java:220)
>> at
>> java.lang.UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:227)
>>  at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
>> at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
>>  at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
>> - locked <7f30e37f8> (a java.io.BufferedInputStream)
>>  at java.io.FilterInputStream.read(FilterInputStream.java:90)
>> at
>> org.gradle.process.internal.ExecOutputHandleRunner.run(ExecOutputHandleRunner.java:46)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>> 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:680)
>>
>>
>> [build process] - unsure about this one too
>>
>>
>> "Run Gradle Worker 1 Thread 2" prio=5 tid=101ac8000 nid=0x10a8bd000 in
>> Object.wait() [10a8bc000]
>>    java.lang.Thread.State: WAITING (on object monitor)
>> at java.lang.Object.wait(Native Method)
>>  - waiting on <7f30e1278> (a java.lang.UNIXProcess)
>> at java.lang.Object.wait(Object.java:485)
>>  at java.lang.UNIXProcess.waitFor(UNIXProcess.java:115)
>> - locked <7f30e1278> (a java.lang.UNIXProcess)
>>  at
>> org.gradle.process.internal.ExecHandleRunner.run(ExecHandleRunner.java:88)
>> at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>>  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:680)
>>
>>
>> [build process] - this must be our handle on the worker process
>>
>> "Dispatch
>> org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor@49dc11af"
>> prio=5 tid=101ab7000 nid=0x109a8d000 waiting on condition [109a8b000]
>>    java.lang.Thread.State: TIMED_WAITING (parking)
>>  at sun.misc.Unsafe.park(Native Method)
>> - parking to wait for  <7f42b39d0> (a
>> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>>  at
>> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
>> at
>> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
>>  at
>> java.util.concurrent.ThreadPoolExecutor.awaitTermination(ThreadPoolExecutor.java:1253)
>> at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl.stop(DefaultExecutorFactory.java:89)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl.stop(DefaultExecutorFactory.java:79)
>> at
>> org.gradle.process.internal.DefaultExecHandle.waitForFinish(DefaultExecHandle.java:274)
>>  at
>> org.gradle.process.internal.DefaultWorkerProcess.waitForStop(DefaultWorkerProcess.java:132)
>> at
>> org.gradle.api.internal.tasks.testing.worker.ForkingTestClassProcessor.stop(ForkingTestClassProcessor.java:77)
>>  at
>> org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.endBatch(RestartEveryNTestClassProcessor.java:60)
>> at
>> org.gradle.api.internal.tasks.testing.processors.RestartEveryNTestClassProcessor.stop(RestartEveryNTestClassProcessor.java:54)
>>  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> at
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>  at
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> at java.lang.reflect.Method.invoke(Method.java:597)
>>  at
>> org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
>> at
>> org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
>>  at
>> org.gradle.messaging.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:29)
>> at
>> org.gradle.messaging.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:132)
>>  at
>> org.gradle.messaging.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:33)
>> at
>> org.gradle.messaging.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:72)
>>  at
>> org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
>> 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:680)
>>
>>
>> [build process] - this is the worker controller effectively. It *has*
>> asked the worker to stop
>> [ForkingTestClassProcessor.stop(ForkingTestClassProcessor.java:77)] which
>> seems to have been dispatched, now it's waiting for the process to die.
>>
>>
>> So the question is, where is the stop message? The build process has sent
>> it, but there is no trace of the worker ever receiving it. This leads me to
>> think that either it never got to the worker, or an error occurred trying
>> to process it that prevented it from getting to the receive proxy. If the
>> stop message made it through the messaging infrastructure, it would get to:
>>
>>
>> http://github.com/gradle/gradle/tree/master/subprojects/plugins/src/main/groovy/org/gradle/api/internal/tasks/testing/worker/TestWorker.java#L89
>>
>> This simply means it did not get that far. If it had, that latch would
>> have been triggered and we wouldn't see the thread in the worker sitting
>> and waiting on it at
>>
>>
>> http://github.com/gradle/gradle/tree/master/subprojects/plugins/src/main/groovy/org/gradle/api/internal/tasks/testing/worker/TestWorker.java#L74
>>
>>
>> I think the next thing we need is debug trace for both sides. I'm unsure
>> how to get debug trace for the worker threads though.
>>
>> --
>> Luke Daley
>> Principal Engineer, Gradleware
>> http://gradleware.com
>>
>>
>
>
> --
> Guillaume Laforge
> Groovy Project Manager
> SpringSource, a division of VMware
>
> Blog: http://glaforge.appspot.com/
> Twitter: @glaforge <http://twitter.com/glaforge>
> Google+: http://gplus.to/glaforge
>
>


-- 
Guillaume Laforge
Groovy Project Manager
SpringSource, a division of VMware

Blog: http://glaforge.appspot.com/
Twitter: @glaforge <http://twitter.com/glaforge>
Google+: http://gplus.to/glaforge

Reply via email to