boot icon indicating copy to clipboard operation
boot copied to clipboard

java.lang.ExceptionInInitializerError during pod cleanup

Open grzm opened this issue 8 years ago • 2 comments

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"}}}}}

grzm avatar Feb 03 '18 00:02 grzm

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:

arichiardi avatar Feb 03 '18 04:02 arichiardi

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.

alexander-yakushev avatar Sep 03 '18 13:09 alexander-yakushev