Welcome! Please see the About page for a little more info on how this works.

0 votes
in On-Prem by

I'm getting the following error in the transactor when trying to transact some data using a transaction function. It only happens for a specific query and set of data.

I'm not sure about the correct place to report errors like this, so feel free to direct me to another place if this is not the correct place.

Also let me know if you need any other information.

I am using datomic version 1.0.7075, peer and transactor have the same version.

I'm using JDK 21, Temurin (datomic transactor is running inside clojure:temurin-21-tools-deps-alpine docker container)

taskfeed-datomic  | java.lang.IllegalStateException: Can't set!: *io-index* from non-binding thread
taskfeed-datomic  |     at clojure.lang.Var.set(Var.java:223)
taskfeed-datomic  |     at datomic.measure.io_stats$using_index_BANG_.invokeStatic(io_stats.clj:57)
taskfeed-datomic  |     at datomic.measure.io_stats$using_index_BANG_.invoke(io_stats.clj:54)
taskfeed-datomic  |     at datomic.index.Index.seek(index.clj:553)
taskfeed-datomic  |     at datomic.btset$seek.invokeStatic(btset.clj:399)
taskfeed-datomic  |     at datomic.btset$seek.invoke(btset.clj:394)
taskfeed-datomic  |     at datomic.db.Db.seekEAVT(db.clj:2410)
taskfeed-datomic  |     at datomic.query$eav.invokeStatic(query.clj:78)
taskfeed-datomic  |     at datomic.query$eav.invoke(query.clj:69)
taskfeed-datomic  |     at datomic.query.EntityMap.valAt(query.clj:213)                                                                                                                               taskfeed-datomic  |     at datomic.query.EntityMap.entryAt(query.clj:199)                                                                                                                             taskfeed-datomic  |     at clojure.lang.RT.find(RT.java:860)
taskfeed-datomic  |     at clojure.core$select_keys.invokeStatic(core.clj:1562)
taskfeed-datomic  |     at clojure.core$select_keys.invoke(core.clj:1555)
taskfeed-datomic  |     at ns_272$eval273$fn__274$fn__275$fn__276.invoke(NO_SOURCE_FILE:143)
taskfeed-datomic  |     at clojure.walk$prewalk.invokeStatic(walk.clj:65)
taskfeed-datomic  |     at clojure.walk$prewalk.invoke(walk.clj:61)
taskfeed-datomic  |     at clojure.core$partial$fn__5908.invoke(core.clj:2641)
taskfeed-datomic  |     at clojure.core$map$fn__5935.invoke(core.clj:2770)
taskfeed-datomic  |     at clojure.lang.LazySeq.sval(LazySeq.java:42)
taskfeed-datomic  |     at clojure.lang.LazySeq.seq(LazySeq.java:51)
taskfeed-datomic  |     at clojure.lang.RT.seq(RT.java:535)
taskfeed-datomic  |     at clojure.core$seq__5467.invokeStatic(core.clj:139)
taskfeed-datomic  |     at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:24)
taskfeed-datomic  |     at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
taskfeed-datomic  |     at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
taskfeed-datomic  |     at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
taskfeed-datomic  |     at clojure.core$reduce.invokeStatic(core.clj:6886)
taskfeed-datomic  |     at clojure.core$into.invokeStatic(core.clj:6958)
taskfeed-datomic  |     at clojure.walk$walk.invokeStatic(walk.clj:50)
taskfeed-datomic  |     at clojure.walk$prewalk.invokeStatic(walk.clj:65)
taskfeed-datomic  |     at clojure.walk$prewalk.invoke(walk.clj:61)
taskfeed-datomic  |     at clojure.core$partial$fn__5908.invoke(core.clj:2641)
taskfeed-datomic  |     at clojure.core$map$fn__5935.invoke(core.clj:2772)
taskfeed-datomic  |     at clojure.lang.LazySeq.sval(LazySeq.java:42)
taskfeed-datomic  |     at clojure.lang.LazySeq.seq(LazySeq.java:51)
taskfeed-datomic  |     at clojure.lang.Cons.next(Cons.java:39)
taskfeed-datomic  |     at clojure.lang.RT.next(RT.java:713)                                                                                                                                          taskfeed-datomic  |     at clojure.core$next__5451.invokeStatic(core.clj:64)
taskfeed-datomic  |     at clojure.core.protocols$fn__8249.invokeStatic(protocols.clj:169)
taskfeed-datomic  |     at clojure.core.protocols$fn__8249.invoke(protocols.clj:124)
taskfeed-datomic  |     at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
taskfeed-datomic  |     at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
taskfeed-datomic  |     at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
taskfeed-datomic  |     at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
taskfeed-datomic  |     at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
taskfeed-datomic  |     at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)                                                                                                        [3165/9184]
taskfeed-datomic  |     at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
taskfeed-datomic  |     at clojure.core$reduce.invokeStatic(core.clj:6886)
taskfeed-datomic  |     at clojure.core$into.invokeStatic(core.clj:6958)
taskfeed-datomic  |     at clojure.walk$walk.invokeStatic(walk.clj:50)
taskfeed-datomic  |     at clojure.walk$prewalk.invokeStatic(walk.clj:65)
taskfeed-datomic  |     at clojure.walk$prewalk.invoke(walk.clj:61)
taskfeed-datomic  |     at ns_272$eval273$fn__274$fn__275.invoke(NO_SOURCE_FILE:93)
taskfeed-datomic  |     at clojure.core$pmap$fn__8552$fn__8553.invoke(core.clj:7089)
taskfeed-datomic  |     at clojure.core$binding_conveyor_fn$fn__5823.invoke(core.clj:2047)
taskfeed-datomic  |     at clojure.lang.AFn.call(AFn.java:18)
taskfeed-datomic  |     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
taskfeed-datomic  |     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
taskfeed-datomic  |     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
taskfeed-datomic  |     at java.base/java.lang.Thread.run(Thread.java:1583)

On the client side, I get the following error:

taskfeed-1  | 01:09:47 [clojure-agent-send-off-pool-21] WARN  datomic.connector - {:message "error executing future", :pid 1, :tid 97} {  }
taskfeed-1  | java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Throwable (java.lang.String and java.lang.Throwable are in module java.base of loader 'bootstrap'
)
taskfeed-1  |   at user$eval172500$fn__172501.invoke(NO_SOURCE_FILE)
taskfeed-1  |   at datomic.error$deserialize_exception.invokeStatic(error.clj:178)
taskfeed-1  |   at datomic.error$deserialize_exception.invoke(error.clj:160)
taskfeed-1  |   at datomic.peer.Connection.notify_error(peer.clj:388)
taskfeed-1  |   at datomic.connector$fn__16648.invokeStatic(connector.clj:154)
taskfeed-1  |   at datomic.connector$fn__16648.invoke(connector.clj:152)
taskfeed-1  |   at clojure.lang.MultiFn.invoke(MultiFn.java:234)
taskfeed-1  |   at datomic.connector$create_hornet_notifier$fn__16654$fn__16655$fn__16659$fn__16660.invoke(connector.clj:178)
taskfeed-1  |   at datomic.connector$create_hornet_notifier$fn__16654$fn__16655$fn__16659.invoke(connector.clj:173)
taskfeed-1  |   at datomic.connector$create_hornet_notifier$fn__16654$fn__16655.invoke(connector.clj:171)
taskfeed-1  |   at clojure.core$binding_conveyor_fn$fn__5823.invoke(core.clj:2047)
taskfeed-1  |   at clojure.lang.AFn.call(AFn.java:18)
taskfeed-1  |   at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
taskfeed-1  |   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
taskfeed-1  |   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
taskfeed-1  |   at java.base/java.lang.Thread.run(Thread.java:1583)

And then a few seconds later, it throws the following error:

taskfeed-1  | Caused by:  :db.error/transaction-timeout Transaction timed out.
taskfeed-1  | clojure.lang.ExceptionInfo: :db.error/transaction-timeout Transaction timed out.                                                                                                        taskfeed-1  | #:db{:error :db.error/transaction-timeout}
taskfeed-1  |  at datomic.error$raise.invokeStatic (error.clj:70)
taskfeed-1  |     datomic.error$raise.invoke (error.clj:58)
taskfeed-1  |     datomic.error$raise.invokeStatic (error.clj:68)
taskfeed-1  |     datomic.error$raise.invoke (error.clj:58)
taskfeed-1  |     datomic.peer$await_tx_result.invokeStatic (peer.clj:79)
taskfeed-1  |     datomic.peer$await_tx_result.invoke (peer.clj:70)
taskfeed-1  |     datomic.peer.Connection.transact (peer.clj:315)
taskfeed-1  |     datomic.api$transact.invokeStatic (api.clj:107)
taskfeed-1  |     datomic.api$transact.doInvoke (api.clj:105)

1 Answer

0 votes
by
 
Best answer

I figured out this was caused by a custom transaction function that used pmap to concurrently do d/q queries.

This used to work, but I assume it was never supported and stopped in recent releases.

Just leaving this here in case anyone else hits this issue in the future.

Welcome to the Datomic Knowledgebase, where you can make features requests, ask questions and receive answers from other members of the community.
...