java.lang.ExceptionInInitializerError during pod cleanup
Problem Description
When using boot-tools-deps and boot-test, sometimes a java.lang.ExceptionInInitializerError will occur after the test has completed.
I don't know if this is specific to boot-tools-deps and boot-test, but that's where I came across the error and can reproduce it.
Steps to reproduce
git clone https://github.com/grzm/ex.boot-tools-deps-alt-test
cd ex.boot-tools-deps-alt-test
boot deps -Q test
On occassion, I'll get the following stacktrace (a full example is also provided in the repo). Over the course of 10 runs, I'll see it at least twice, if not more often.
java.lang.Thread.run Thread.java: 844
java.util.concurrent.ThreadPoolExecutor$Worker.run Exception in thread "Thread-19" java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at clojure.lang.RT.classForName(RT.java:2204)
at clojure.lang.RT.classForName(RT.java:2213)
at clojure.lang.RT.loadClassForName(RT.java:2232)
at clojure.lang.RT.load(RT.java:450)
at clojure.lang.RT.load(RT.java:426)
at clojure.lang.RT.doInit(RT.java:468)
at clojure.lang.RT.<clinit>(RT.java:336)
at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.init(ClojureRuntimeShimImpl.java:23)
at org.projectodd.shimdandy.ClojureRuntimeShim.newRuntime(ClojureRuntimeShim.java:26)
at org.projectodd.shimdandy.ClojureRuntimeShim.newRuntime(ClojureRuntimeShim.java:32)
at boot.App.newShim(App.java:309)
at boot.pod$make_pod.doInvoke(pod.clj:895)
at clojure.lang.RestFn.invoke(RestFn.java:410)
at boot.pod$pod_pool$fn__1867.invoke(pod.clj:960)
at boot.pod$lifecycle_pool$fill__1810.invoke(pod.clj:822)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.io.IOException: Stream closed, compiling:(clojure/core_instant18.clj:15:1)
at clojure.lang.Compiler.load(Compiler.java:7526)
at clojure.lang.RT.loadResourceScript(RT.java:379)
at clojure.lang.RT.loadResourceScript(RT.java:370)
at clojure.lang.RT.load(RT.java:460)
at clojure.lang.RT.load(RT.java:426)
at clojure.core$load$fn__6548.invoke(core.clj:6046)
at clojure.core$load.invokeStatic(core.clj:6045)
at clojure.core$load.doInvoke(core.clj:6029)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$fn__8055.invokeStatic(core.clj:6709)
at clojure.core$fn__8055.invoke(core.clj:6708)
at clojure.core__init.load(Unknown Source)
at clojure.core__init.<clinit>(Unknown Source)
... 19 more
Caused by: java.io.IOException: Stream closed
at java.base/java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:68)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:143)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.read(BufferedReader.java:182)
at java.base/java.io.LineNumberReader.read(LineNumberReader.java:126)
at java.base/java.io.FilterReader.read(FilterReader.java:65)
at java.base/java.io.PushbackReader.read(PushbackReader.java:90)
at clojure.lang.LineNumberingPushbackReader.read(LineNumberingPushbackReader.java:66)
at clojure.lang.LispReader.read1(LispReader.java:160)
at clojure.lang.Compiler.consumeWhitespaces(Compiler.java:7467)
at clojure.lang.Compiler.load(Compiler.java:7511)
... 31 more
ThreadPoolExecutor.java: 641
java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java: 1167
java.util.concurrent.FutureTask.run FutureTask.java: 264
...
clojure.core/binding-conveyor-fn/fn core.clj: 2022
boot.core/boot/fn core.clj: 1031
boot.core/run-tasks core.clj: 1021
adzerk.boot-test/eval253/fn/fn/fn boot_test.clj: 105
adzerk.boot-test/eval318/fn/fn/fn boot_test.clj: 184
clojure.core/ex-info core.clj: 4739
Platform details
λ uname -v
Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64
λ system_profiler SPSoftwareDataType | ack -v Name
Software:
System Software Overview:
System Version: macOS 10.13.3 (17D47)
Kernel Version: Darwin 17.4.0
Boot Volume: Macintosh HD
Boot Mode: Normal
Secure Virtual Memory: Enabled
System Integrity Protection: Enabled
Time since boot: 7 days 18:11
λ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)
Boot details
λ boot --version
#http://boot-clj.com
#Fri Feb 02 15:20:28 CST 2018
BOOT_VERSION=2.7.2
BOOT_CLOJURE_VERSION=1.10.0-alpha2
BOOT_CLOJURE_NAME=org.clojure/clojure
build.boot present? Yes.
~/.boot/profile present? No.
Task name? boot deps -Q test
Duplicated from the repo:
build.boot
(def project 'com.grzm/ex.tools-deps-alt-test)
(def version "0.1.0-SNAPSHOT")
(set-env! :resource-paths #{"src"}
:source-paths #{"test"}
:dependencies '[[org.clojure/clojure "RELEASE"]
[adzerk/boot-test "RELEASE" :scope "test"]
[metosin/boot-alt-test "0.3.2" :scope "test"]
[com.stuartsierra/dependency "0.2.0"]
[seancorfield/boot-tools-deps "0.3.0"]])
(task-options!
pom {:project project
:version version
:description "FIXME: write description"
:url "http://example/FIXME"
:scm {:url "https://github.com/yourname/ex.tools-deps-alt-test"}
:license {"Eclipse Public License"
"http://www.eclipse.org/legal/epl-v10.html"}})
(deftask build
"Build and install the project locally."
[]
(comp (pom) (jar) (install)))
(require '[adzerk.boot-test :refer [test]])
(require '[metosin.boot-alt-test :refer (alt-test)])
(require '[boot-tools-deps.core :refer [deps]])
deps.edn
{:deps {org.clojure/java.jdbc {:mvn/version "0.7.5"}}
:aliases {:test
{:extra-deps {org.clojure/math.combinatorics {:mvn/version "0.1.4"}}}}}
From a first glance, it looks like something happens to the stream opened for reading Clojure in the LispReader.
Because things in boot run concurrently in pods, I feel there is some resource contention going on on the sources or build.boot itself.
I might be completely off of course :smile:
Just wanted to say that I hit this too, occasionally. The exception is the same, Caused by: java.io.IOException: Stream closed, compiling:(clojure/core_instant18.clj:15:1) and so on.
It doesn't happen with every project, in fact I have only seen one project yet where this happens (but it happened a few times there already). I use boot-test to test it and run (clojure.spec.test.alpha/instrument (clojure.spec.test.alpha/enumerate-namespace 'my.namespace)) before running the tests.