浏览代码

enhance(rtc): retry calibrate-graph-skeleton when :graph-lock-failed

rcmerci 1 年之前
父节点
当前提交
23fc0aa141
共有 1 个文件被更改,包括 26 次插入19 次删除
  1. 26 19
      src/main/frontend/worker/rtc/skeleton.cljs

+ 26 - 19
src/main/frontend/worker/rtc/skeleton.cljs

@@ -1,6 +1,7 @@
 (ns frontend.worker.rtc.skeleton
   "Validate skeleton data between server and client"
   (:require [datascript.core :as d]
+            [frontend.common.missionary-util :as c.m]
             [frontend.worker.rtc.ws-util :as ws-util]
             [logseq.db :as ldb]
             [missionary.core :as m]))
@@ -63,22 +64,28 @@
 
 (defn new-task--calibrate-graph-skeleton
   [get-ws-create-task graph-uuid conn t]
-  (m/sp
-    (let [db @conn
-          db-ident-blocks (get-builtin-db-ident-blocks db)
-          r (m/? (ws-util/send&recv get-ws-create-task
-                                    {:action "calibrate-graph-skeleton"
-                                     :graph-uuid graph-uuid
-                                     :t t
-                                     :db-ident-blocks db-ident-blocks
-                                     :schema-version (get-schema-version db)}))]
-      (if-let [remote-ex (:ex-data r)]
-        (do (prn {:remote-ex remote-ex})
-            (throw (ex-info "Unavailable2" {:remote-ex remote-ex})))
-        (let [server-only-db-ident-blocks (some-> (:server-only-db-ident-blocks r)
-                                                  ldb/read-transit-str)]
-          (when (seq server-only-db-ident-blocks)
-            (throw (ex-info "different graph skeleton between server and client"
-                            {:type :rtc.exception/different-graph-skeleton
-                             :server-schema-version (:server-schema-version r)
-                             :server-only-db-ident-blocks server-only-db-ident-blocks}))))))))
+  (c.m/backoff
+   (take 4 c.m/delays)
+   (m/sp
+     (let [db @conn
+           db-ident-blocks (get-builtin-db-ident-blocks db)
+           r (m/? (ws-util/send&recv get-ws-create-task
+                                     {:action "calibrate-graph-skeleton"
+                                      :graph-uuid graph-uuid
+                                      :t t
+                                      :db-ident-blocks db-ident-blocks
+                                      :schema-version (get-schema-version db)}))]
+       (if-let [remote-ex (:ex-data r)]
+         (case (:type remote-ex)
+           :graph-lock-failed
+           (throw (ex-info "retry calibrate-graph-skeleton" {:missionary/retry true}))
+          ;; else
+           (do (prn {:remote-ex remote-ex})
+               (throw (ex-info "Unavailable2" {:remote-ex remote-ex}))))
+         (let [server-only-db-ident-blocks (some-> (:server-only-db-ident-blocks r)
+                                                   ldb/read-transit-str)]
+           (when (seq server-only-db-ident-blocks)
+             (throw (ex-info "different graph skeleton between server and client"
+                             {:type :rtc.exception/different-graph-skeleton
+                              :server-schema-version (:server-schema-version r)
+                              :server-only-db-ident-blocks server-only-db-ident-blocks})))))))))