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)))