riemann/riemann

Reloading configuration with OpenJDK 10 throws a java.lang.NoClassDefFoundError

miikka opened this issue · 8 comments

Hi! I just started using Riemann and it looks really nice. I'm running it inside Docker with the provided riemannio/riemann image. Unfortunately reloading the configuration does not seem to work.

Steps to reproduce:

  1. Start Riemann inside Docker: docker run -it --rm --name riemann riemannio/riemann:0.3.1
  2. Send SIGHUP: docker kill --signal=HUP riemann

What I expected? That Riemann reloads /etc/riemann.config.
What happens instead?

INFO [2018-06-13 07:43:39,950] SIGHUP handler - riemann.bin - Caught SIGHUP, reloading
INFO [2018-06-13 07:43:39,953] SIGHUP handler - riemann.pubsub - Sweeping transient subscriptions.
ERROR [2018-06-13 07:43:39,958] SIGHUP handler - riemann.bin - Couldn't reload:
clojure.lang.Compiler$CompilerException: java.lang.NoClassDefFoundError: clojure/lang/AFunction, compiling:(/etc/riemann.config:4:1)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:7010)
	at clojure.lang.Compiler.analyze(Compiler.java:6773)
	at clojure.lang.Compiler.eval(Compiler.java:7059)
	at clojure.lang.Compiler.load(Compiler.java:7514)
	at clojure.lang.Compiler.loadFile(Compiler.java:7452)
	at clojure.lang.RT$3.invoke(RT.java:325)
	at riemann.config$include.invokeStatic(config.clj:449)
	at riemann.config$include.invoke(config.clj:426)
	at riemann.bin$reload_BANG_.invokeStatic(bin.clj:46)
	at riemann.bin$reload_BANG_.invoke(bin.clj:36)
	at riemann.bin$handle_signals$fn__14078.invoke(bin.clj:62)
	at riemann.bin.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
	at jdk.unsupported/sun.misc.Signal$InternalMiscHandler.handle(Signal.java:198)
	at java.base/jdk.internal.misc.Signal$1.run(Signal.java:220)
	at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.NoClassDefFoundError: clojure/lang/AFunction
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1009)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:870)
	at clojure.lang.DynamicClassLoader.defineClass(DynamicClassLoader.java:46)
	at clojure.lang.Compiler$ObjExpr.getCompiledClass(Compiler.java:4979)
	at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4109)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001)
	... 14 common frames omitted
Caused by: java.lang.ClassNotFoundException: clojure.lang.AFunction
	at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
	at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:69)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
	at clojure.lang.DynamicClassLoader.loadClass(DynamicClassLoader.java:77)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
	... 21 common frames omitted

I wasn't able to reproduce this when running directly on the host.

Ah, probably the culprit is not Docker but Java 10! I tried rebuilding the Docker image against openjdk:8-jre-slim (instead of openjdk:10-jre-slim) and reloading works as expected.

I faced similar java.lang.NoClassDefFoundError when tried to add Monger dependency via pomegranate. Seemed to be somehow related to the version of plexus-utils dependency.

sigproblems in docker are often related to the entrypoint being run as PID=1

This should be fixed in 0.3.2.

morj commented

I'm still experiencing the same issue with the riemannio/riemann:0.3.2 docker image

Okay - I think I've found the issue. Let me do some testing.

Released in 0.3.3.

morj commented

Thanks a lot for the quick patch!