boot-clj / boot

Build tooling for Clojure.
https://boot-clj.github.io/
Eclipse Public License 1.0
1.75k stars 179 forks source link

java.lang.ExceptionInInitializerError during pod cleanup #689

Open grzm opened 6 years ago

grzm commented 6 years ago

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"}}}}}
arichiardi commented 6 years ago

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:

alexander-yakushev commented 5 years ago

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.