From ef9339f6f1b18d5c1cea8b2837447dc36af413d3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 14 Feb 2022 12:42:35 +0100 Subject: [PATCH 1/9] :bug: Fix unexpected exception on handling empty state on boolean calc --- CHANGES.md | 7 +++++++ common/src/app/common/path/bool.cljc | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 03e16ee971..6476caeb8f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # CHANGELOG +## 1.11.2-beta + +### :bug: Bugs fixed + +- Fix issue on handling empty content on boolean shapes. + + ## 1.11.1-beta ### :bug: Bugs fixed diff --git a/common/src/app/common/path/bool.cljc b/common/src/app/common/path/bool.cljc index 8b6a66cf5a..543a60b13a 100644 --- a/common/src/app/common/path/bool.cljc +++ b/common/src/app/common/path/bool.cljc @@ -326,6 +326,9 @@ [bool-type contents] ;; We apply the boolean operation in to each pair and the result to the next ;; element - (->> contents - (reduce (partial content-bool-pair bool-type)) - (into []))) + (if (seq contents) + (->> contents + (reduce (partial content-bool-pair bool-type)) + (into [])) + [])) + From dee397615ccc1534dbaf6e3c367d466d218e3251 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 14 Feb 2022 12:46:27 +0100 Subject: [PATCH 2/9] :paperclip: Update changelog file --- CHANGES.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 6476caeb8f..1c7ba20279 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,7 +4,18 @@ ### :bug: Bugs fixed -- Fix issue on handling empty content on boolean shapes. +- Fix issue on handling empty content on boolean shapes +- Handle EOF errors on writting streamed response +- Handle EOF errors on websocket send/ping methods +- Disable parallel upload of file media on import (causes too much + contention on the rlimit subsistem that does not works as expected + on high load). + +### :sparkles: New features + +- Add health check endpoint on API +- Increase default max connection pool size to 60 +- Reduce resource usage of the error reporter. ## 1.11.1-beta From 321b2c7c236dbd7c2ac300d0c6fee8476bdafb89 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Mon, 14 Feb 2022 14:24:22 +0100 Subject: [PATCH 3/9] :bug: Fix error handling on s3 delete-in-bulk operation --- backend/src/app/storage/s3.clj | 10 +++++++--- backend/src/app/worker.clj | 23 ++++++++++------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/backend/src/app/storage/s3.clj b/backend/src/app/storage/s3.clj index 2d42277a7c..10c5710e06 100644 --- a/backend/src/app/storage/s3.clj +++ b/backend/src/app/storage/s3.clj @@ -33,6 +33,7 @@ software.amazon.awssdk.services.s3.model.GetObjectRequest software.amazon.awssdk.services.s3.model.ObjectIdentifier software.amazon.awssdk.services.s3.model.PutObjectRequest + software.amazon.awssdk.services.s3.model.S3Error ;; software.amazon.awssdk.services.s3.model.GetObjectResponse software.amazon.awssdk.services.s3.presigner.S3Presigner software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest @@ -231,6 +232,9 @@ ^DeleteObjectsRequest dor)] (when (.hasErrors ^DeleteObjectsResponse dres) (let [errors (seq (.errors ^DeleteObjectsResponse dres))] - (ex/raise :type :s3-error - :code :error-on-bulk-delete - :context errors))))) + (ex/raise :type :internal + :code :error-on-s3-bulk-delete + :s3-errors (mapv (fn [^S3Error error] + {:key (.key error) + :msg (.message error)}) + errors)))))) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index 3bd8461fc5..976b15d30e 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -414,21 +414,18 @@ (defn- execute-scheduled-task [{:keys [executor pool] :as cfg} {:keys [id] :as task}] (letfn [(run-task [conn] - (try - (when (db/exec-one! conn [sql:lock-scheduled-task (d/name id)]) - (l/debug :action "execute scheduled task" :id id) - ((:fn task) task)) - (catch Throwable e - e))) + (when (db/exec-one! conn [sql:lock-scheduled-task (d/name id)]) + (l/debug :action "execute scheduled task" :id id) + ((:fn task) task))) (handle-task [] - (db/with-atomic [conn pool] - (let [result (run-task conn)] - (when (ex/exception? result) - (l/error :cause result - :hint "unhandled exception on scheduled task" - :id id)))))] - + (try + (db/with-atomic [conn pool] + (run-task conn)) + (catch Throwable cause + (l/error :hint "unhandled exception on scheduled task" + :task-id id + :cause cause))))] (try (px/run! executor handle-task) (finally From 9b78b2a4325997f4440f9003c218c872d078df06 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 09:22:00 +0100 Subject: [PATCH 4/9] :sparkles: Improve error reporting on background tasks --- backend/src/app/http/errors.clj | 4 +--- backend/src/app/loggers/database.clj | 18 ++++++++---------- backend/src/app/util/time.clj | 5 +++++ backend/src/app/worker.clj | 10 +++++----- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index a536378499..0c24a3df79 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -10,7 +10,6 @@ [app.common.exceptions :as ex] [app.common.logging :as l] [app.common.spec :as us] - [app.common.uuid :as uuid] [clojure.spec.alpha :as s] [cuerdas.core :as str])) @@ -24,8 +23,7 @@ [request error] (let [data (ex-data error)] (merge - {:id (uuid/next) - :path (:uri request) + {:path (:uri request) :method (:request-method request) :hint (ex-message error) :params (:params request) diff --git a/backend/src/app/loggers/database.clj b/backend/src/app/loggers/database.clj index ebece9af07..d4e3391002 100644 --- a/backend/src/app/loggers/database.clj +++ b/backend/src/app/loggers/database.clj @@ -27,10 +27,8 @@ (defonce enabled (atom true)) (defn- persist-on-database! - [{:keys [pool] :as cfg} {:keys [id] :as event}] - (db/with-atomic [conn pool] - (db/insert! conn :server-error-report - {:id id :content (db/tjson event)}))) + [{:keys [pool]} {:keys [id] :as event}] + (db/insert! pool :server-error-report {:id id :content (db/tjson event)})) (defn- parse-event-data [event] @@ -51,7 +49,7 @@ (assoc :host (cf/get :host)) (assoc :public-uri (cf/get :public-uri)) (assoc :version (:full cf/version)) - (update :id (fn [id] (or id (uuid/next)))))) + (assoc :id (uuid/next)))) (defn handle-event [{:keys [executor] :as cfg} event] @@ -59,12 +57,13 @@ (try (let [event (parse-event event) uri (cf/get :public-uri)] + (l/debug :hint "registering error on database" :id (:id event) :uri (str uri "/dbg/error/" (:id event))) + (persist-on-database! cfg event)) - (catch Exception e - (l/warn :hint "unexpected exception on database error logger" - :cause e))))) + (catch Exception cause + (l/warn :hint "unexpected exception on database error logger" :cause cause))))) (defmethod ig/pre-init-spec ::reporter [_] (s/keys :req-un [::wrk/executor ::db/pool ::receiver])) @@ -76,8 +75,7 @@ (defmethod ig/init-key ::reporter [_ {:keys [receiver] :as cfg}] (l/info :msg "initializing database error persistence") - (let [output (a/chan (a/sliding-buffer 5) - (filter error-event?))] + (let [output (a/chan (a/sliding-buffer 5) (filter error-event?))] (receiver :sub output) (a/go-loop [] (let [msg (a/> data ::s/problems (take 10) seq vec) :spec-value (some->> data ::s/value) :data (some-> data (dissoc ::s/problems ::s/value ::s/spec)) @@ -424,6 +423,7 @@ (run-task conn)) (catch Throwable cause (l/error :hint "unhandled exception on scheduled task" + ::l/context (get-error-context cause task) :task-id id :cause cause))))] (try From ce61b783fb4bb86a534d340b4f7f1b3c64b2ca24 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 11:06:13 +0100 Subject: [PATCH 5/9] :sparkles: Minor improvements on telemetry task --- backend/src/app/main.clj | 4 ++-- backend/src/app/tasks/telemetry.clj | 36 +++++++++++++++++++++++++---- backend/src/app/util/time.clj | 5 ++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 2264e96ba1..90bf86016b 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -176,7 +176,7 @@ :task :file-offload}) (when (contains? cf/flags :audit-log-archive) - {:cron #app/cron "0 */3 * * * ?" ;; every 3m + {:cron #app/cron "0 */5 * * * ?" ;; every 5m :task :audit-log-archive}) (when (contains? cf/flags :audit-log-gc) @@ -185,7 +185,7 @@ (when (or (contains? cf/flags :telemetry) (cf/get :telemetry-enabled)) - {:cron #app/cron "0 0 */6 * * ?" ;; every 6h + {:cron #app/cron "0 30 */3,23 * * ?" :task :telemetry})]} :app.worker/registry diff --git a/backend/src/app/tasks/telemetry.clj b/backend/src/app/tasks/telemetry.clj index 7f24fe7c0e..812e36f975 100644 --- a/backend/src/app/tasks/telemetry.clj +++ b/backend/src/app/tasks/telemetry.clj @@ -14,12 +14,17 @@ [app.common.spec :as us] [app.config :as cfg] [app.db :as db] + [app.util.async :refer [thread-sleep]] [app.util.http :as http] [app.util.json :as json] [clojure.spec.alpha :as s] [integrant.core :as ig])) -(declare retrieve-stats) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TASK ENTRY POINT +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(declare get-stats) (declare send!) (s/def ::version ::us/string) @@ -34,11 +39,18 @@ (defmethod ig/init-key ::handler [_ {:keys [pool sprops version] :as cfg}] (fn [_] + ;; Sleep randomly between 0 to 10s + (thread-sleep (rand-int 10000)) + (let [instance-id (:instance-id sprops)] - (-> (retrieve-stats pool version) + (-> (get-stats pool version) (assoc :instance-id instance-id) (send! cfg))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; IMPL +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (defn- send! [data cfg] (let [response (http/send! {:method :post @@ -63,6 +75,20 @@ [conn] (-> (db/exec-one! conn ["select count(*) as count from file;"]) :count)) +(defn- retrieve-num-file-changes + [conn] + (let [sql (str "select count(*) as count " + " from file_change " + " where date_trunc('day', created_at) = date_trunc('day', now())")] + (-> (db/exec-one! conn [sql]) :count))) + +(defn- retrieve-num-touched-files + [conn] + (let [sql (str "select count(distinct file_id) as count " + " from file_change " + " where date_trunc('day', created_at) = date_trunc('day', now())")] + (-> (db/exec-one! conn [sql]) :count))) + (defn- retrieve-num-users [conn] (-> (db/exec-one! conn ["select count(*) as count from profile;"]) :count)) @@ -118,7 +144,7 @@ :jvm-heap-max (.maxMemory runtime) :jvm-cpus (.availableProcessors runtime)})) -(defn retrieve-stats +(defn get-stats [conn version] (let [referer (if (cfg/get :telemetry-with-taiga) "taiga" @@ -130,7 +156,9 @@ :total-files (retrieve-num-files conn) :total-users (retrieve-num-users conn) :total-fonts (retrieve-num-fonts conn) - :total-comments (retrieve-num-comments conn)} + :total-comments (retrieve-num-comments conn) + :total-file-changes (retrieve-num-file-changes conn) + :total-touched-files (retrieve-num-touched-files conn)} (d/merge (retrieve-team-averages conn) (retrieve-jvm-stats)) diff --git a/backend/src/app/util/time.clj b/backend/src/app/util/time.clj index a3bd8c27b3..7adeabf541 100644 --- a/backend/src/app/util/time.clj +++ b/backend/src/app/util/time.clj @@ -295,6 +295,11 @@ (s/assert cron? cron) (.toInstant (.getNextValidTimeAfter cron (Date/from now)))) +(defn get-next + [cron tnow] + (let [nt (next-valid-instant-from cron tnow)] + (cons nt (lazy-seq (get-next cron nt))))) + (defmethod print-method CronExpression [mv ^java.io.Writer writer] (.write writer (str "#app/cron \"" (.toString ^CronExpression mv) "\""))) From 82796822d160d75e3f69e4c6bca8e6f37ad7b4a3 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 11:13:16 +0100 Subject: [PATCH 6/9] :bug: Fix possible race condition on component rename and deletion --- CHANGES.md | 1 + .../app/main/data/workspace/libraries.cljs | 43 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1c7ba20279..06a5c558f6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ ### :bug: Bugs fixed - Fix issue on handling empty content on boolean shapes +- Fix race condition issue on component renaming - Handle EOF errors on writting streamed response - Handle EOF errors on websocket send/ping methods - Disable parallel upload of file media on import (causes too much diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index fa8132e043..027e6514af 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -314,29 +314,32 @@ (ptk/reify ::rename-component ptk/WatchEvent (watch [it state _] - (let [[path name] (cp/parse-path-name new-name) - component (get-in state [:workspace-data :components id]) - objects (get component :objects) - ; Give the same name to the root shape - new-objects (assoc-in objects - [(:id component) :name] - name) + ;; NOTE: we need to ensure the component exists, because there + ;; are small posibilities of race conditions with component + ;; deletion. + (when-let [component (get-in state [:workspace-data :components id])] + (let [[path name] (cp/parse-path-name new-name) + objects (get component :objects) + ;; Give the same name to the root shape + new-objects (assoc-in objects + [(:id component) :name] + name) - rchanges [{:type :mod-component - :id id - :name name - :path path - :objects new-objects}] + rchanges [{:type :mod-component + :id id + :name name + :path path + :objects new-objects}] - uchanges [{:type :mod-component - :id id - :name (:name component) - :path (:path component) - :objects objects}]] + uchanges [{:type :mod-component + :id id + :name (:name component) + :path (:path component) + :objects objects}]] - (rx/of (dch/commit-changes {:redo-changes rchanges - :undo-changes uchanges - :origin it})))))) + (rx/of (dch/commit-changes {:redo-changes rchanges + :undo-changes uchanges + :origin it}))))))) (defn duplicate-component "Create a new component copied from the one with the given id." From e9fe1800e0a49c409b3d5a7d1236deafa614a166 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 13:25:06 +0100 Subject: [PATCH 7/9] :sparkles: Fix minor issues on session expiration handling --- backend/src/app/http/session.clj | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/backend/src/app/http/session.clj b/backend/src/app/http/session.clj index 90e3d217d2..b09ffaf1c9 100644 --- a/backend/src/app/http/session.clj +++ b/backend/src/app/http/session.clj @@ -30,8 +30,11 @@ (let [token (tokens :generate {:iss "authentication" :iat (dt/now) :uid profile-id}) + now (dt/now) params {:user-agent (get headers "user-agent") :profile-id profile-id + :created-at now + :updated-at now :id token}] (db/insert! conn :http-session params))) @@ -82,8 +85,7 @@ (defmethod ig/prep-key ::session [_ cfg] - (d/merge {:buffer-size 64} - (d/without-nils cfg))) + (d/merge {:buffer-size 128} (d/without-nils cfg))) (defmethod ig/init-key ::session [_ {:keys [pool] :as cfg}] @@ -154,7 +156,7 @@ (= :size reason) (l/debug :task "updater" - :action "update sessions" + :hint "update sessions" :reason (name reason) :count result)) (recur)))))) @@ -183,17 +185,20 @@ (defmethod ig/init-key ::gc-task [_ {:keys [pool max-age] :as cfg}] + (l/debug :hint "initializing session gc task" :max-age max-age) (fn [_] (db/with-atomic [conn pool] (let [interval (db/interval max-age) - result (db/exec-one! conn [sql:delete-expired interval]) + result (db/exec-one! conn [sql:delete-expired interval interval]) result (:next.jdbc/update-count result)] (l/debug :task "gc" - :action "clean http sessions" - :count result) + :hint "clean http sessions" + :deleted result) result)))) (def ^:private sql:delete-expired "delete from http_session - where updated_at < now() - ?::interval") + where updated_at < now() - ?::interval + or (updated_at is null and + created_at < now() - ?::interval)") From 116fafd0e1870e4b4e82a5ae220339ed80059f0d Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 13:25:46 +0100 Subject: [PATCH 8/9] :paperclip: Minor log param naming change --- backend/src/app/storage.clj | 8 ++++---- backend/src/app/tasks/file_media_gc.clj | 4 ++-- backend/src/app/tasks/file_offload.clj | 2 +- backend/src/app/tasks/file_xlog_gc.clj | 3 ++- backend/src/app/tasks/objects_gc.clj | 10 +++++----- backend/src/app/tasks/tasks_gc.clj | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/backend/src/app/storage.clj b/backend/src/app/storage.clj index 413b33882e..eeee57f465 100644 --- a/backend/src/app/storage.clj +++ b/backend/src/app/storage.clj @@ -305,7 +305,7 @@ (recur (+ n ^long total))) (do (l/info :task "gc-deleted" - :action "permanently delete items" + :hint "permanently delete items" :count n) {:deleted n}))))))) @@ -379,10 +379,10 @@ (+ cntd (count to-delete)))) (do (l/info :task "gc-touched" - :action "mark freeze" + :hint "mark freeze" :count cntf) (l/info :task "gc-touched" - :action "mark for deletion" + :hint "mark for deletion" :count cntd) {:freeze cntf :delete cntd}))))))) @@ -461,7 +461,7 @@ (+ d (count to-delete)))) (do (l/info :task "recheck" - :action "recheck items" + :hint "recheck items" :processed n :deleted d) {:processed n :deleted d}))))))) diff --git a/backend/src/app/tasks/file_media_gc.clj b/backend/src/app/tasks/file_media_gc.clj index 39d194f685..17d40c9041 100644 --- a/backend/src/app/tasks/file_media_gc.clj +++ b/backend/src/app/tasks/file_media_gc.clj @@ -90,7 +90,7 @@ unused (->> (db/query conn :file-media-object {:file-id id}) (remove #(contains? used (:id %))))] - (l/debug :action "processing file" + (l/debug :hint "processing file" :id id :age age :to-delete (count unused)) @@ -101,7 +101,7 @@ {:id id}) (doseq [mobj unused] - (l/debug :action "deleting media object" + (l/debug :hint "deleting media object" :id (:id mobj) :media-id (:media-id mobj) :thumbnail-id (:thumbnail-id mobj)) diff --git a/backend/src/app/tasks/file_offload.clj b/backend/src/app/tasks/file_offload.clj index a43afb8a94..e429d3872c 100644 --- a/backend/src/app/tasks/file_offload.clj +++ b/backend/src/app/tasks/file_offload.clj @@ -29,7 +29,7 @@ (defn- offload-candidate [{:keys [storage conn backend] :as cfg} {:keys [id data] :as file}] - (l/debug :action "offload file data" :id id) + (l/debug :hint "offload file data" :id id) (let [backend (simpl/resolve-backend storage backend)] (->> (simpl/content data) (simpl/put-object backend file)) diff --git a/backend/src/app/tasks/file_xlog_gc.clj b/backend/src/app/tasks/file_xlog_gc.clj index b8dce2fa51..7b4e21ad5f 100644 --- a/backend/src/app/tasks/file_xlog_gc.clj +++ b/backend/src/app/tasks/file_xlog_gc.clj @@ -28,7 +28,8 @@ (let [interval (db/interval max-age) result (db/exec-one! conn [sql:delete-files-xlog interval]) result (:next.jdbc/update-count result)] - (l/debug :removed result :hint "remove old file changes") + (l/info :hint "remove old file changes" + :removed result) result)))) (def ^:private diff --git a/backend/src/app/tasks/objects_gc.clj b/backend/src/app/tasks/objects_gc.clj index 9d2e44146f..dc66a9aff9 100644 --- a/backend/src/app/tasks/objects_gc.clj +++ b/backend/src/app/tasks/objects_gc.clj @@ -48,7 +48,7 @@ result (db/exec! conn [sql max-age])] (doseq [{:keys [id] :as item} result] - (l/trace :action "delete object" :table table :id id)) + (l/trace :hint "delete object" :table table :id id)) (count result))) @@ -63,7 +63,7 @@ backend (simpl/resolve-backend storage (cf/get :fdata-storage-backend))] (doseq [{:keys [id] :as item} result] - (l/trace :action "delete object" :table table :id id) + (l/trace :hint "delete object" :table table :id id) (when backend (simpl/del-object backend item))) @@ -78,7 +78,7 @@ fonts (db/exec! conn [sql max-age]) storage (assoc storage :conn conn)] (doseq [{:keys [id] :as font} fonts] - (l/trace :action "delete object" :table table :id id) + (l/trace :hint "delete object" :table table :id id) (some->> (:woff1-file-id font) (sto/del-object storage)) (some->> (:woff2-file-id font) (sto/del-object storage)) (some->> (:otf-file-id font) (sto/del-object storage)) @@ -95,7 +95,7 @@ storage (assoc storage :conn conn)] (doseq [{:keys [id] :as team} teams] - (l/trace :action "delete object" :table table :id id) + (l/trace :hint "delete object" :table table :id id) (some->> (:photo-id team) (sto/del-object storage))) (count teams))) @@ -127,7 +127,7 @@ storage (assoc storage :conn conn)] (doseq [{:keys [id] :as profile} profiles] - (l/trace :action "delete object" :table table :id id) + (l/trace :hint "delete object" :table table :id id) ;; Mark the owned teams as deleted; this enables them to be processed ;; in the same transaction in the "team" table step. diff --git a/backend/src/app/tasks/tasks_gc.clj b/backend/src/app/tasks/tasks_gc.clj index 788e292697..1350c4abf8 100644 --- a/backend/src/app/tasks/tasks_gc.clj +++ b/backend/src/app/tasks/tasks_gc.clj @@ -28,7 +28,7 @@ (let [interval (db/interval max-age) result (db/exec-one! conn [sql:delete-completed-tasks interval]) result (:next.jdbc/update-count result)] - (l/debug :action "trim completed tasks table" :removed result) + (l/debug :hint "trim completed tasks table" :removed result) result)))) (def ^:private From e8426006e3decb2701c08d025df931d6bad106bf Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Tue, 15 Feb 2022 13:27:08 +0100 Subject: [PATCH 9/9] Update version.txt file --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 792a1e887f..fb03eed94c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.11.1-beta +1.11.2-beta