diff --git a/src/metabase/feature_extraction/async.clj b/src/metabase/feature_extraction/async.clj index d1fc9849c9ceffbfd47a66cc707e9c8b894cfcac..625d5a35e66c5c337dd5cb67acb7bb2dee67ea36 100644 --- a/src/metabase/feature_extraction/async.clj +++ b/src/metabase/feature_extraction/async.clj @@ -36,7 +36,7 @@ (defn- save-result [{:keys [id] :as job} payload callback] - (when-not (future-cancelled? (@running-jobs id)) + (when (some-> (@running-jobs id) future-cancelled? not) (db/transaction (db/insert! ComputationJobResult :job_id id @@ -54,7 +54,7 @@ (defn- save-error [{:keys [id] :as job} error callback] (let [error (Throwable->map error)] - (when-not (future-cancelled? (@running-jobs id)) + (when (some-> (@running-jobs id) future-cancelled? not) (log/warn (format "Async job %s encountered an error:\n%s." id error)) (db/transaction (db/insert! ComputationJobResult diff --git a/test/metabase/test/async.clj b/test/metabase/test/async.clj index 81ee5533aff6659e0e6b704e53129e220471262d..18cadc8edd765967c00a64f7a100e8a385112da1 100644 --- a/test/metabase/test/async.clj +++ b/test/metabase/test/async.clj @@ -20,6 +20,8 @@ (when (>= (- (System/currentTimeMillis) start#) *max-while-runtime*) (log/warn "While loop terminated due to exceeded max runtime.")))) +;; We collect when jobs finish so we don't have to spam the DB while +;; waiting/checking for the job to finish. (def ^:private job-done? (atom #{})) (add-watch (deref #'async/running-jobs) :done-watch @@ -32,10 +34,8 @@ (defn result! "Blocking version of async/result." [job-id] - (while-with-timeout (or (not (@job-done? job-id)) - (-> job-id - ComputationJob - async/result - (find :result) - nil?))) + (while-with-timeout (not (and (@job-done? job-id) + (let [job (ComputationJob job-id)] + (or (:result (async/result job)) + (async/canceled? job)))))) (async/result (ComputationJob job-id)))