-
Notifications
You must be signed in to change notification settings - Fork 39
java.lang.InterruptedException race in chiming functions. #37
Copy link
Copy link
Open
Description
There seems to be a race between closing a chime and the chiming function invocation that can lead to a java.lang.InterruptedException being thrown when functions are awaiting something coming from, for example, a future, or have consumed a function that does this somewhere along the call stack.
It'd be nice if either the chiming function was never called, or any inflight functions were allowed to complete before closing.
Example:
(let [now (Instant/now)
chiming (chime/chime-at (chime/periodic-seq now (Duration/ofSeconds 1))
(fn [time]
(log/info :future-task @(future (count {})))
(log/info :chime (str time)))
{:error-handler (fn [e]
(log/error :chime-failed e)
true)
:on-finished #(log/info :done)})]
(Thread/sleep 1000)
(.close chiming))
outputs:
2020-09-07 15:51:25.548 INFO :future-task 0
2020-09-07 15:51:25.549 INFO :chime 2020-09-07T14:51:25.547924Z
2020-09-07 15:51:26.550 INFO :done
2020-09-07 15:51:26.550 ERROR :chime-failed #error {
:cause nil
:via
[{:type java.lang.InterruptedException
:message nil
:at [java.util.concurrent.FutureTask awaitDone FutureTask.java 418]}]
:trace
[[java.util.concurrent.FutureTask awaitDone FutureTask.java 418]
[java.util.concurrent.FutureTask get FutureTask.java 190]
[clojure.core$deref_future invokeStatic core.clj 2300]
[clojure.core$future_call$reify__8454 deref core.clj 6974]
[clojure.core$deref invokeStatic core.clj 2320]
[clojure.core$deref invoke core.clj 2306]
...
[chime.core$chime_at$schedule_loop__13568$task__13572$fn__13573 invoke core.clj 91]
[chime.core$chime_at$schedule_loop__13568$task__13572 invoke core.clj 90]
[clojure.lang.AFn run AFn.java 22]
[java.util.concurrent.Executors$RunnableAdapter call Executors.java 515]
[java.util.concurrent.FutureTask run FutureTask.java 264]
[java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask run ScheduledThreadPoolExecutor.java 304]
[java.util.concurrent.ThreadPoolExecutor runWorker ThreadPoolExecutor.java 1128]
[java.util.concurrent.ThreadPoolExecutor$Worker run ThreadPoolExecutor.java 628]
[java.lang.Thread run Thread.java 834]]}
Note, might have to run this a couple of times to see the exception, as it doesn't always happen.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels