diff --git a/src/metabase/task/analyze_queries.clj b/src/metabase/task/analyze_queries.clj index 0a69b3934c42d6df791c34a41762bc63ac1675d1..69d2e5d8060a39c7f9e8b037546b05722bb61ce0 100644 --- a/src/metabase/task/analyze_queries.clj +++ b/src/metabase/task/analyze_queries.clj @@ -38,29 +38,32 @@ (max fail-wait-ms (wait-proportional time-taken-ms))) (defn- analyzer-loop* [stop-after next-card-id-fn] - (loop [remaining stop-after] - (when (public-settings/query-analysis-enabled) + (try + (loop [remaining stop-after] (let [card-or-id (next-card-id-fn) card-id (u/the-id card-or-id) timer (u/start-timer) card (query-analysis/->analyzable card-or-id)] - (if (failure-map/non-retryable? card) - (log/warnf "Skipping analysis of Card %s as its query has caused failures in the past." card-id) - (try - (query-analysis/analyze-card! card) - (failure-map/track-success! card) - (let [taken-ms (Math/ceil (u/since-ms timer)) - sleep-ms (wait-proportional taken-ms)] - (log/debugf "Query analysis for Card %s took %sms (incl. persisting)" card-id taken-ms) - (log/debugf "Waiting %sms before analysing further cards" sleep-ms) - (Thread/sleep sleep-ms)) - (catch Exception e - (log/errorf e "Error analysing and updating query for Card %s" card-id) - (failure-map/track-failure! card) - (Thread/sleep (wait-fail (u/since-ms timer)))))) - (cond - (nil? remaining) (recur nil) - (> remaining 1) (recur (dec remaining))))))) + (when (public-settings/query-analysis-enabled) + (if (failure-map/non-retryable? card) + (log/warnf "Skipping analysis of Card %s as its query has caused failures in the past." card-id) + (try + (query-analysis/analyze-card! card) + (failure-map/track-success! card) + (let [taken-ms (Math/ceil (u/since-ms timer)) + sleep-ms (wait-proportional taken-ms)] + (log/debugf "Query analysis for Card %s took %sms (incl. persisting)" card-id taken-ms) + (log/debugf "Waiting %sms before analysing further cards" sleep-ms) + (Thread/sleep sleep-ms)) + (catch Exception e + (log/errorf e "Error analysing and updating query for Card %s" card-id) + (failure-map/track-failure! card) + (Thread/sleep (wait-fail (u/since-ms timer)))))) + (cond + (nil? remaining) (recur nil) + (> remaining 1) (recur (dec remaining)))))) + (catch Exception e + (log/error e "Unhandled error when attempting to analyse the next card in the queue")))) (defn- analyzer-loop! ([]