The spymemcached library used by Datomic has been shaded to the package name datomic.spy.memcached to avoid conflict with other forks of spymemcached.
There has been update in the value of system property “net.spy.log.LoggerImpl”
It got updated from “net.spy.memcached.compat.log.Log4JLogger” to “datomic.spy.memcached.compat.log.Log4JLogger”
Ideally the key should also have been updated to “datomic.spy.log.LoggerImpl”.
It is causing problem with original net.spy memcached library, as Logger class instantiation is failing.
net.spy.memcached.compat.log.Log4JLogger class is expected, but datomic.spy.memcached.compat.log.Log4JLogger is returned from the constructor, and eventually it fails in type casting.
Thanks for the report. I am looking to reproduce to understand what we missed.
Does your constructor ultimately result in you setting something like this in logback.xml? Or can you get the same results by just setting the properties on the client/transactor side?
In our datomic peer app, we use an application cache (memcached) as well.
We are using net.spy.memcached client library to connect with it.
With updated datomic version, we are not able to initialize memcached client.
Error stacktrace:
java.lang.RuntimeException: Problem getting logger
at net.spy.memcached.compat.log.LoggerFactory.internalGetLogger(LoggerFactory.java:100)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:87)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:73)
at net.spy.memcached.compat.SpyThread.getLogger(SpyThread.java:60)
at net.spy.memcached.MemcachedConnection.createConnections(MemcachedConnection.java:345)
at net.spy.memcached.MemcachedConnection.(MemcachedConnection.java:282)
at net.spy.memcached.DefaultConnectionFactory.createConnection(DefaultConnectionFactory.java:209)
at net.spy.memcached.MemcachedClient.(MemcachedClient.java:209)
at clojurewerkz.spyglass.client$text_connection.invokeStatic(client.clj:75)
at clojurewerkz.spyglass.client$text_connection.invoke(client.clj:72)
at repl_opstools$fn__2144.invokeStatic(repl_opstools.clj:1)
at repl_opstools$fn__2144.invoke(repl_opstools.clj:1)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:4178)
at clojure.lang.Compiler$DefExpr.eval(Compiler.java:464)
at clojure.lang.Compiler.eval(Compiler.java:7705)
at clojure.lang.Compiler.eval(Compiler.java:7655)
at clojure.core$eval.invokeStatic(core.clj:3232)
at clojure.core$eval.invoke(core.clj:3228)
at nrepl.middleware.interruptible_eval$evaluate$fn__966$fn__967.invoke(interruptible_eval.clj:87)
at clojure.lang.AFn.applyToHelper(AFn.java:152)
at clojure.lang.AFn.applyTo(AFn.java:144)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
at clojure.lang.RestFn.invoke(RestFn.java:428)
at nrepl.middleware.interruptible_eval$evaluate$fn__966.invoke(interruptible_eval.clj:87)
at clojure.main$repl$read_eval_print__9244$fn__9247.invoke(main.clj:437)
at clojure.main$repl$read_eval_print__9244.invoke(main.clj:437)
at clojure.main$repl$fn__9253.invoke(main.clj:459)
at clojure.main$repl.invokeStatic(main.clj:459)
at clojure.main$repl.doInvoke(main.clj:368)
at clojure.lang.RestFn.invoke(RestFn.java:1526)
at nrepl.middleware.interruptible_eval$evaluate.invokeStatic(interruptible_eval.clj:84)
at nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:56)
at nrepl.middleware.interruptible_eval$interruptible_eval$fn__997$fn__1001.invoke(interruptible_eval.clj:152)
at clojure.lang.AFn.run(AFn.java:22)
at nrepl.middleware.session$session_exec$main_loop__1065$fn__1069.invoke(session.clj:202)
at nrepl.middleware.session$session_exec$main_loop__1065.invoke(session.clj:201)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.lang.ClassCastException: class datomic.spy.memcached.compat.log.Log4JLogger cannot be cast to class net.spy.memcached.compat.log.Logger (datomic.spy.memcached.compat.log.Log4JLogger and net.spy.memcached.compat.log.Logger are in unnamed module of loader ‘app’)
at net.spy.memcached.compat.log.LoggerFactory.getNewInstance(LoggerFactory.java:118)
at net.spy.memcached.compat.log.LoggerFactory.internalGetLogger(LoggerFactory.java:98)
… 41 common frames omitted
As I checked, name of the Logger is retrieved via system property “net.spy.log.LoggerImpl”.
With datomic upgrade, it’s value has been updated (we are not updating its value explicitly from anywhere).