Skip to content

Commit 655e72e

Browse files
RCmercitiensonqin
authored andcommitted
refactor(rtc): merge several ws-requests into one init-request
1 parent a4d12bf commit 655e72e

File tree

4 files changed

+93
-71
lines changed

4 files changed

+93
-71
lines changed

src/main/frontend/worker/rtc/client.cljs

Lines changed: 65 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,62 @@
1919
[missionary.core :as m]
2020
[tick.core :as tick]))
2121

22-
(defn- new-task--register-graph-updates
23-
[get-ws-create-task graph-uuid major-schema-version repo]
22+
(defn- apply-remote-updates-from-apply-ops
23+
[apply-ops-resp graph-uuid repo conn date-formatter add-log-fn]
24+
(if-let [remote-ex (:ex-data apply-ops-resp)]
25+
(do (add-log-fn :rtc.log/pull-remote-data (assoc remote-ex :sub-type :pull-remote-data-exception))
26+
(case (:type remote-ex)
27+
:graph-lock-failed nil
28+
:graph-lock-missing
29+
(throw r.ex/ex-remote-graph-lock-missing)
30+
:rtc.exception/get-s3-object-failed
31+
(throw (ex-info (:ex-message apply-ops-resp) (:ex-data apply-ops-resp)))
32+
;;else
33+
(throw (ex-info "Unavailable3" {:remote-ex remote-ex}))))
34+
(do (assert (pos? (:t apply-ops-resp)) apply-ops-resp)
35+
(r.remote-update/apply-remote-update
36+
graph-uuid repo conn date-formatter {:type :remote-update :value apply-ops-resp} add-log-fn))))
37+
38+
(defn- new-task--init-request
39+
[get-ws-create-task graph-uuid major-schema-version repo conn *last-calibrate-t *server-schema-version add-log-fn]
2440
(m/sp
25-
(try
26-
(let [{remote-t :t :as resp}
27-
(m/? (ws-util/send&recv get-ws-create-task {:action "register-graph-updates"
28-
:graph-uuid graph-uuid
29-
:schema-version (str major-schema-version)}))]
30-
(rtc-log-and-state/update-remote-t graph-uuid remote-t)
31-
(when-not (client-op/get-local-tx repo)
32-
(client-op/update-local-tx repo remote-t))
33-
resp)
34-
(catch :default e
35-
(if (= :rtc.exception/remote-graph-not-ready (:type (ex-data e)))
36-
(throw (ex-info "remote graph is still creating" {:missionary/retry true} e))
37-
(throw e))))))
41+
(let [t-before (client-op/get-local-tx repo)
42+
get-graph-skeleton? (or (nil? @*last-calibrate-t)
43+
(< 500 (- t-before @*last-calibrate-t)))]
44+
(try
45+
(let [t-before (client-op/get-local-tx repo)
46+
{remote-t :t
47+
server-schema-version :server-schema-version
48+
server-builtin-db-idents :server-builtin-db-idents
49+
:as resp}
50+
(m/? (ws-util/send&recv get-ws-create-task {:action "init-request"
51+
:graph-uuid graph-uuid
52+
:schema-version (str major-schema-version)
53+
:t-before (or t-before 1)
54+
:get-graph-skeleton get-graph-skeleton?}))]
55+
(if-let [remote-ex (:ex-data resp)]
56+
(do
57+
(add-log-fn :rtc.log/init-request remote-ex)
58+
(case (:type remote-ex)
59+
:graph-lock-failed nil
60+
:graph-lock-missing (throw r.ex/ex-remote-graph-lock-missing)
61+
;; else
62+
(throw (ex-info "Unavailable4" {:remote-ex remote-ex}))))
63+
(do
64+
(when server-schema-version
65+
(reset! *server-schema-version server-schema-version)
66+
(reset! *last-calibrate-t remote-t))
67+
(when remote-t
68+
(rtc-log-and-state/update-remote-t graph-uuid remote-t)
69+
(when (not t-before)
70+
(client-op/update-local-tx repo remote-t)))
71+
(when (and server-schema-version server-builtin-db-idents)
72+
(r.skeleton/calibrate-graph-skeleton server-schema-version server-builtin-db-idents @conn))
73+
resp)))
74+
(catch :default e
75+
(if (= :rtc.exception/remote-graph-not-ready (:type (ex-data e)))
76+
(throw (ex-info "remote graph is still creating" {:missionary/retry true} e))
77+
(throw e)))))))
3878

3979
(def ^:private *register-graph-updates-sent
4080
"ws -> [bool, added-inst, [graph-uuid,major-schema-version,repo]]"
@@ -54,8 +94,8 @@
5494
(defn ensure-register-graph-updates--memoized
5595
"Return a task: get or create a mws(missionary wrapped websocket).
5696
see also `ws/get-mws-create`.
57-
But ensure `register-graph-updates` and `calibrate-graph-skeleton` has been sent"
58-
[get-ws-create-task graph-uuid major-schema-version repo conn
97+
But ensure `init-request` and `calibrate-graph-skeleton` has been sent"
98+
[get-ws-create-task graph-uuid major-schema-version repo conn date-formatter
5999
*last-calibrate-t *online-users *server-schema-version add-log-fn]
60100
(m/sp
61101
(let [ws (m/? get-ws-create-task)
@@ -81,14 +121,17 @@
81121
10000)))]
82122
(reset! *online-users online-users)))
83123
:succ (constantly nil)))
84-
(let [{:keys [max-remote-schema-version]}
124+
(let [{:keys [max-remote-schema-version] :as init-request-resp}
85125
(try
86126
(m/?
87127
(c.m/backoff
88128
{:delay-seq ;retry 5 times if remote-graph is creating (4000 8000 16000 32000 64000)
89129
(take 5 (drop 2 c.m/delays))
90130
:reset-flow worker-flows/online-event-flow}
91-
(new-task--register-graph-updates get-ws-create-task graph-uuid major-schema-version repo)))
131+
(new-task--init-request
132+
get-ws-create-task graph-uuid major-schema-version repo conn
133+
*last-calibrate-t *server-schema-version
134+
add-log-fn)))
92135
(catch :default e
93136
(swap! *register-graph-updates-sent assoc-in [ws 0] false)
94137
(throw e)))]
@@ -98,15 +141,8 @@
98141
max-remote-schema-version db-schema/version major-schema-version)
99142
:repo repo
100143
:graph-uuid graph-uuid
101-
:remote-schema-version max-remote-schema-version})))
102-
(let [t (client-op/get-local-tx repo)]
103-
(when (or (nil? @*last-calibrate-t)
104-
(< 500 (- t @*last-calibrate-t)))
105-
(let [{:keys [server-schema-version _server-builtin-db-idents]}
106-
(m/? (r.skeleton/new-task--calibrate-graph-skeleton
107-
get-ws-create-task graph-uuid major-schema-version @conn))]
108-
(reset! *server-schema-version server-schema-version))
109-
(reset! *last-calibrate-t t))))
144+
:remote-schema-version max-remote-schema-version}))
145+
(apply-remote-updates-from-apply-ops init-request-resp graph-uuid repo conn date-formatter add-log-fn)))
110146
ws)))
111147

112148
(defn- ->pos
@@ -464,14 +500,4 @@
464500
:ops [] :t-before (or local-tx 1)}
465501
r (m/? (ws-util/send&recv get-ws-create-task message))]
466502
(r.throttle/add-rtc-api-call-record! message)
467-
(if-let [remote-ex (:ex-data r)]
468-
(do (add-log-fn :rtc.log/pull-remote-data (assoc remote-ex :sub-type :pull-remote-data-exception))
469-
(case (:type remote-ex)
470-
:graph-lock-failed nil
471-
:graph-lock-missing (throw r.ex/ex-remote-graph-lock-missing)
472-
:rtc.exception/get-s3-object-failed nil
473-
;;else
474-
(throw (ex-info "Unavailable3" {:remote-ex remote-ex}))))
475-
(do (assert (pos? (:t r)) r)
476-
(r.remote-update/apply-remote-update
477-
graph-uuid repo conn date-formatter {:type :remote-update :value r} add-log-fn))))))
503+
(apply-remote-updates-from-apply-ops r graph-uuid repo conn date-formatter add-log-fn))))

src/main/frontend/worker/rtc/core.cljs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@
209209
{:keys [*current-ws get-ws-create-task]}
210210
(gen-get-ws-create-map--memoized ws-url)
211211
get-ws-create-task (r.client/ensure-register-graph-updates--memoized
212-
get-ws-create-task graph-uuid major-schema-version
213-
repo conn *last-calibrate-t *online-users *server-schema-version add-log-fn)
212+
get-ws-create-task graph-uuid major-schema-version repo conn date-formatter
213+
*last-calibrate-t *online-users *server-schema-version add-log-fn)
214214
{:keys [assets-sync-loop-task]}
215215
(r.asset/create-assets-sync-loop repo get-ws-create-task graph-uuid major-schema-version conn *auto-push?)
216216
mixed-flow (create-mixed-flow repo get-ws-create-task *auto-push? *online-users)]
@@ -226,9 +226,9 @@
226226
(m/sp
227227
(try
228228
(log/info :rtc :loop-starting)
229+
(started-dfv true)
229230
;; init run to open a ws
230231
(m/? get-ws-create-task)
231-
(started-dfv true)
232232
(update-remote-schema-version! conn @*server-schema-version)
233233
(reset! *assets-sync-loop-canceler
234234
(c.m/run-task :assets-sync-loop-task

src/main/frontend/worker/rtc/malli_schema.cljs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,12 @@
197197
[:map
198198
[:ex-message :string]
199199
[:ex-data [:map [:type :keyword]]]]]
200+
["init-request"
201+
(concat [:map
202+
[:max-remote-schema-version {:optional true} :string]
203+
[:server-schema-version {:optional true} :string]
204+
[:server-builtin-db-idents {:optional true} [:set :keyword]]]
205+
(m/children apply-ops-response-schema))]
200206
["register-graph-updates"
201207
[:map
202208
[:t :int]
@@ -252,6 +258,12 @@
252258
[:multi {:dispatch :action}
253259
["list-graphs"
254260
[:map]]
261+
["init-request"
262+
[:map
263+
[:graph-uuid :uuid]
264+
[:schema-version db-schema/major-schema-version-string-schema]
265+
[:t-before :int]
266+
[:get-graph-skeleton :boolean]]]
255267
["register-graph-updates"
256268
[:map
257269
[:graph-uuid :uuid]

src/main/frontend/worker/rtc/skeleton.cljs

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22
"Validate skeleton data between server and client"
33
(:require [clojure.data :as data]
44
[datascript.core :as d]
5-
[frontend.worker.rtc.ws-util :as ws-util]
65
[lambdaisland.glogi :as log]
76
[logseq.db :as ldb]
8-
[logseq.db.frontend.schema :as db-schema]
9-
[missionary.core :as m]))
7+
[logseq.db.frontend.schema :as db-schema]))
108

119
(defn- get-builtin-db-idents
1210
[db]
@@ -18,29 +16,15 @@
1816
[?b :logseq.property/built-in?]]
1917
db))
2018

21-
(defn new-task--calibrate-graph-skeleton
22-
[get-ws-create-task graph-uuid major-schema-version db]
23-
(m/sp
24-
(let [r (m/? (ws-util/send&recv get-ws-create-task
25-
{:action "get-graph-skeleton"
26-
:graph-uuid graph-uuid
27-
:schema-version (str major-schema-version)}))]
28-
(if-let [remote-ex (:ex-data r)]
29-
(case (:type remote-ex)
30-
:graph-lock-failed
31-
(throw (ex-info "retry calibrate-graph-skeleton" {:missionary/retry true}))
32-
;; else
33-
(do (log/info :remote-ex remote-ex)
34-
(throw (ex-info "Unavailable2" {:remote-ex remote-ex}))))
35-
(let [{:keys [server-schema-version server-builtin-db-idents]} r
36-
client-builtin-db-idents (set (get-builtin-db-idents db))
37-
client-schema-version (ldb/get-graph-schema-version db)]
38-
(when-not (zero? (db-schema/compare-schema-version client-schema-version server-schema-version))
39-
(log/warn "RTC schema error: client version doesn't match server's version"
40-
[client-schema-version server-schema-version]))
41-
(let [[client-only server-only _]
42-
(data/diff client-builtin-db-idents server-builtin-db-idents)]
43-
(when (or (seq client-only) (seq server-only))
44-
(log/warn :db-idents-diff {:client-only client-only
45-
:server-only server-only})))
46-
r)))))
19+
(defn calibrate-graph-skeleton
20+
[server-schema-version server-builtin-db-idents db]
21+
(let [client-builtin-db-idents (set (get-builtin-db-idents db))
22+
client-schema-version (ldb/get-graph-schema-version db)]
23+
(when-not (zero? (db-schema/compare-schema-version client-schema-version server-schema-version))
24+
(log/warn "RTC schema error: client version doesn't match server's version"
25+
[client-schema-version server-schema-version]))
26+
(let [[client-only server-only _]
27+
(data/diff client-builtin-db-idents server-builtin-db-idents)]
28+
(when (or (seq client-only) (seq server-only))
29+
(log/warn :db-idents-diff {:client-only client-only
30+
:server-only server-only})))))

0 commit comments

Comments
 (0)