As of version 1.2.254 of org.clojure/core.cache, using a value-fn that throws will cause an entry to be added to the cache associated with a Delay with :status :failed and the exception as a value.
The code below can be used to compare the behavior between versions 1.1.234 and 1.2.254.
(require '[clojure.core.cache.wrapped :as cw])
(def counter (atom 0))
(defn value-fn [v]
(prn :value-fn-called)
(swap! counter inc)
(if (= @counter 1)
(throw (ex-info "thrown" {}))
v))
(def test-cache (cw/lu-cache-factory {} :threshold 10))
(reset! counter 0)
; this will throw
(cw/lookup-or-miss test-cache "throw" value-fn)
; in 1.1.234 this will call value-fn again and not throw; in 1.2.254, it won't call and return
; the cached delay result, which is an exception
(cw/lookup-or-miss test-cache "throw" value-fn)
; evict to force call to value-fn
(cw/evict test-cache "throw")
This is related to work done in CCACHE-65 to avoid cache stampede in multi-threaded applications, and could be related to what has been reported in CMEMOIZE-31.
This was initially reported in Clojurians Slack.