Merge pull request #3051 from penpot/niwinz-experiments-2

🐛 Fix many issues related to the concurrency refactor PR
This commit is contained in:
Alejandro 2023-03-17 08:25:31 +01:00 committed by GitHub
commit 40ca804d93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 71 additions and 29 deletions

View File

@ -5,6 +5,8 @@ export PENPOT_TENANT=dev
export PENPOT_FLAGS="\ export PENPOT_FLAGS="\
$PENPOT_FLAGS \ $PENPOT_FLAGS \
enable-backend-asserts \ enable-backend-asserts \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
enable-audit-log \ enable-audit-log \
enable-transit-readable-response \ enable-transit-readable-response \
enable-demo-users \ enable-demo-users \

View File

@ -2,7 +2,20 @@
export PENPOT_HOST=devenv export PENPOT_HOST=devenv
export PENPOT_TENANT=dev export PENPOT_TENANT=dev
export PENPOT_FLAGS="$PENPOT_FLAGS enable-backend-asserts enable-audit-log enable-transit-readable-response enable-demo-users disable-secure-session-cookies enable-smtp enable-webhooks" export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-prepl-server \
enable-urepl-server \
enable-webhooks \
enable-backend-asserts \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
disable-secure-session-cookies \
enable-smtp \
enable-webhooks";
set -ex set -ex

View File

@ -112,7 +112,7 @@
(l/error :hint "Internal error" :message (ex-message error) :cause error) (l/error :hint "Internal error" :message (ex-message error) :cause error)
{::yrs/status 500 {::yrs/status 500
::yrs/body {:type :server-error ::yrs/body {:type :server-error
:code :unhandloed :code :unhandled
:hint (ex-message error) :hint (ex-message error)
:data (ex-data error)}})) :data (ex-data error)}}))

View File

@ -158,8 +158,13 @@
(assoc ::yrs/body (transit-streamable-body body opts)))) (assoc ::yrs/body (transit-streamable-body body opts))))
response))) response)))
(format-from-params [{:keys [query-params] :as request}]
(and (= "json" (get query-params :_fmt))
"application/json"))
(format-response [response request] (format-response [response request]
(let [accept (yrq/get-header request "accept")] (let [accept (or (format-from-params request)
(yrq/get-header request "accept"))]
(cond (cond
(or (= accept "application/transit+json") (or (= accept "application/transit+json")
(str/includes? accept "application/transit+json")) (str/includes? accept "application/transit+json"))

View File

@ -168,7 +168,7 @@
(defn submit! (defn submit!
[{:keys [::id ::cache ::wrk/executor ::mtx/metrics]} f] [{:keys [::id ::cache ::wrk/executor ::mtx/metrics]} f]
(let [f (partial px/submit! executor f)] (let [f (partial px/submit! executor (px/wrap-bindings f))]
(if (and cache id) (if (and cache id)
(p/await! (invoke! cache metrics id nil f)) (p/await! (invoke! cache metrics id nil f))
(p/await! (f))))) (p/await! (f)))))

View File

@ -670,12 +670,30 @@
;; --- COMMAND QUERY: get-file-data-for-thumbnail ;; --- COMMAND QUERY: get-file-data-for-thumbnail
;; FIXME: performance issue
;;
;; We need to improve how we set frame for thumbnail in order to avoid
;; loading all pages into memory for find the frame set for thumbnail.
(defn get-file-data-for-thumbnail (defn get-file-data-for-thumbnail
[conn {:keys [data id] :as file}] [conn {:keys [data id] :as file}]
(letfn [;; function responsible on finding the frame marked to be (letfn [;; function responsible on finding the frame marked to be
;; used as thumbnail; the returned frame always have ;; used as thumbnail; the returned frame always have
;; the :page-id set to the page that it belongs. ;; the :page-id set to the page that it belongs.
(get-thumbnail-frame [data] (get-thumbnail-frame [data]
;; NOTE: this is a hack for avoid perform blocking
;; operation inside the for loop, clojure lazy-seq uses
;; synchronized blocks that does not plays well with
;; virtual threads, so we need to perform the load
;; operation first. This operation forces all pointer maps
;; load into the memory.
(->> (-> data :pages-index vals)
(filter pmap/pointer-map?)
(run! pmap/load!))
;; Then proceed to find the frame set for thumbnail
(d/seek :use-for-thumbnail? (d/seek :use-for-thumbnail?
(for [page (-> data :pages-index vals) (for [page (-> data :pages-index vals)
frame (-> page :objects ctt/get-frames)] frame (-> page :objects ctt/get-frames)]

View File

@ -33,22 +33,26 @@
(db/insert! conn :file-profile-rel)))) (db/insert! conn :file-profile-rel))))
(defn create-file (defn create-file
[conn {:keys [id name project-id is-shared data revn [conn {:keys [id name project-id is-shared revn
modified-at deleted-at create-page modified-at deleted-at create-page
ignore-sync-until features] ignore-sync-until features]
:or {is-shared false revn 0 create-page true} :or {is-shared false revn 0 create-page true}
:as params}] :as params}]
(let [id (or id (:id data) (uuid/next))
(db/exec-one! conn ["SET CONSTRAINTS ALL DEFERRED;"])
(let [id (or id (uuid/next))
features (-> (into files/default-features features) features (-> (into files/default-features features)
(files/check-features-compatibility!)) (files/check-features-compatibility!))
data (or data data (binding [pmap/*tracked* (atom {})
(binding [ffeat/*current* features ffeat/*current* features
ffeat/*wrap-with-objects-map-fn* (if (features "storate/objects-map") omap/wrap identity) ffeat/*wrap-with-objects-map-fn* (if (features "storate/objects-map") omap/wrap identity)
ffeat/*wrap-with-pointer-map-fn* (if (features "storage/pointer-map") pmap/wrap identity)] ffeat/*wrap-with-pointer-map-fn* (if (features "storage/pointer-map") pmap/wrap identity)]
(if create-page (let [data (if create-page
(ctf/make-file-data id) (ctf/make-file-data id)
(ctf/make-file-data id nil)))) (ctf/make-file-data id nil))]
(files/persist-pointers! conn id)
data))
features (db/create-array conn "text" features) features (db/create-array conn "text" features)
file (db/insert! conn :file file (db/insert! conn :file

View File

@ -48,25 +48,24 @@
(defn- validate-webhook! (defn- validate-webhook!
[cfg whook params] [cfg whook params]
(when (not= (:uri whook) (:uri params)) (when (not= (:uri whook) (:uri params))
(try (let [response (ex/try!
(let [response (http/req! cfg (http/req! cfg
{:method :head {:method :head
:uri (str (:uri params)) :uri (str (:uri params))
:timeout (dt/duration "3s")} :timeout (dt/duration "3s")}
{:sync? true})] {:sync? true}))]
(when-let [hint (webhooks/interpret-response response)] (if (ex/exception? response)
(ex/raise :type :validation (if-let [hint (webhooks/interpret-exception response)]
:code :webhook-validation
:hint hint)))
(catch Throwable cause
(if-let [hint (webhooks/interpret-exception cause)]
(ex/raise :type :validation (ex/raise :type :validation
:code :webhook-validation :code :webhook-validation
:hint hint) :hint hint)
(ex/raise :type :internal (ex/raise :type :internal
:code :webhook-validation :code :webhook-validation
:cause cause)))))) :cause response))
(when-let [hint (webhooks/interpret-response response)]
(ex/raise :type :validation
:code :webhook-validation
:hint hint))))))
(defn- validate-quotes! (defn- validate-quotes!
[{:keys [::db/pool]} {:keys [team-id]}] [{:keys [::db/pool]} {:keys [team-id]}]

View File

@ -128,7 +128,8 @@
(extend-protocol fez/IEdn (extend-protocol fez/IEdn
Duration Duration
(-edn [o] (pr-str o))) (-edn [o]
(tagged-literal 'app/duration (str o))))
(defn format-duration (defn format-duration
[o] [o]
@ -218,7 +219,7 @@
(extend-protocol fez/IEdn (extend-protocol fez/IEdn
Instant Instant
(-edn [o] (pr-str o))) (-edn [o] (tagged-literal 'app/instant (format-instant o))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Cron Expression ;; Cron Expression