Created
October 29, 2012 10:15
-
-
Save ijuma/3972753 to your computer and use it in GitHub Desktop.
SBT hang with forked tests
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Exception in thread "Thread-18" Exception in thread "main" java.io.EOFException | |
| at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571) | |
| at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315) | |
| at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:52) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:66) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.react$1(ForkTests.scala:56) | |
| at sbt.ForkTests$$anonfun$apply$2$Acceptor$2$.run(ForkTests.scala:84) | |
| at java.lang.Thread.run(Thread.java:722) | |
| java.util.NoSuchElementException: head of empty list | |
| at scala.collection.immutable.Nil$.head(List.scala:328) | |
| at scala.collection.immutable.Nil$.head(List.scala:325) |
Author
The later exception looks like it is coming from ScalaTestRunner.run, no? Sbt doesn't provide guards against frameworks throwing exceptions.
That stack trace is interesting for another reason. It looks like we're hit by the tailrec bug. react is annotated with tailrec:
https://github.com/harrah/xsbt/blob/0.12.1/main/actions/ForkTests.scala#L52
but the trace above shows it isn't optimized into a loop.
@vigdorchik I don't see why it is ok for sbt to avoid responsibility for handling exceptions from the test framework, especially if the error message that the user sees is the one in this gist, which gives no indication what the problem is. Are you saying that the new code provides a better error message?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
And the stacktrace before the user code is invoked: