enhance(rtc): sync rename-db-ident ops

This commit is contained in:
rcmerci
2025-08-07 16:40:51 +08:00
parent 87bffd7d98
commit 1712c0897a
3 changed files with 65 additions and 12 deletions

View File

@@ -285,6 +285,17 @@
[update-kv-value-ops-map-coll]
(mapcat local-update-kv-value-ops->remote-ops update-kv-value-ops-map-coll))
(defn- local-rename-db-ident-ops->remote-ops
[rename-db-ident-ops-map]
(keep (fn [[op-type op]]
(when (keyword-identical? :rename-db-ident op-type)
[:rename-db-ident (select-keys (last op) [:db-ident :new-db-ident])]))
rename-db-ident-ops-map))
(defn- gen-rename-db-ident-remote-ops
[rename-db-ident-ops-map-coll]
(mapcat local-rename-db-ident-ops->remote-ops rename-db-ident-ops-map-coll))
(defn- merge-remove-remove-ops
[remote-remove-ops]
(when-let [block-uuids (->> remote-remove-ops
@@ -343,7 +354,7 @@
(concat update-schema-ops update-page-ops remove-ops sorted-move-ops update-ops remove-page-ops)))
(defn- rollback
[repo block-ops-map-coll update-kv-value-ops-map-coll]
[repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll]
(let [block-ops
(mapcat
(fn [m]
@@ -359,9 +370,18 @@
(when (keyword-identical? :update-kv-value k)
op))
m))
update-kv-value-ops-map-coll)]
update-kv-value-ops-map-coll)
rename-db-ident-ops
(mapcat
(fn [m]
(keep (fn [[k op]]
(when (keyword-identical? :rename-db-ident k)
op))
m))
rename-db-ident-ops-map-coll)]
(client-op/add-ops! repo block-ops)
(client-op/add-ops! repo update-kv-value-ops)
(client-op/add-ops! repo rename-db-ident-ops)
nil))
(defn new-task--push-local-ops
@@ -370,10 +390,14 @@
(m/sp
(let [block-ops-map-coll (client-op/get&remove-all-block-ops repo)
update-kv-value-ops-map-coll (client-op/get&remove-all-update-kv-value-ops repo)
rename-db-ident-ops-map-coll (client-op/get&remove-all-rename-db-ident-ops repo)
block-uuid->remote-ops (not-empty (gen-block-uuid->remote-ops @conn block-ops-map-coll))
rename-db-ident-remote-ops (gen-rename-db-ident-remote-ops rename-db-ident-ops-map-coll)
other-remote-ops (gen-update-kv-value-remote-ops update-kv-value-ops-map-coll)
remote-ops (concat (when block-uuid->remote-ops (sort-remote-ops block-uuid->remote-ops))
other-remote-ops)]
remote-ops (concat
rename-db-ident-remote-ops
(when block-uuid->remote-ops (sort-remote-ops block-uuid->remote-ops))
other-remote-ops)]
(when-let [ops-for-remote (rtc-schema/to-ws-ops-decoder remote-ops)]
(let [local-tx (client-op/get-local-tx repo)
r (try
@@ -383,7 +407,7 @@
:ops ops-for-remote :t-before (or local-tx 1)}
(true? @*remote-profile?) (assoc :profile true))))
(catch :default e
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll)
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll)
(throw e)))]
(if-let [remote-ex (:ex-data r)]
(do (add-log-fn :rtc.log/push-local-update remote-ex)
@@ -392,18 +416,18 @@
;; conflict-update remote-graph, keep these local-pending-ops
;; and try to send ops later
:graph-lock-failed
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll)
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll)
;; - :graph-lock-missing
;; this case means something wrong in remote-graph data,
;; nothing to do at client-side
:graph-lock-missing
(do (rollback repo block-ops-map-coll update-kv-value-ops-map-coll)
(do (rollback repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll)
(throw r.ex/ex-remote-graph-lock-missing))
:rtc.exception/get-s3-object-failed
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll)
(rollback repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll)
;; else
(do (rollback repo block-ops-map-coll update-kv-value-ops-map-coll)
(do (rollback repo block-ops-map-coll update-kv-value-ops-map-coll rename-db-ident-ops-map-coll)
(throw (ex-info "Unavailable1" {:remote-ex remote-ex})))))
(do (assert (pos? (:t r)) r)

View File

@@ -322,8 +322,24 @@
(contains? update-kv-value-op-types a))
[a (:v datom)]))))
datoms)]
(when (and (:db-ident op-map)
(> (count op-map) 1))
(when (and (:db-ident op-map) (> (count op-map) 1))
[e op-map]))))
(into {}))))
(defn- get-all-rename-db-ident-ops*
[db]
(let [db-ident-datoms (d/datoms db :avet :db-ident)
es (map :e db-ident-datoms)]
(->> (map (fn [e] [e (d/datoms db :eavt e)]) es)
(keep (fn [[e datoms]]
(let [op-map (into {}
(keep (fn [datom]
(let [a (:a datom)]
(when (or (keyword-identical? :db-ident a)
(contains? db-ident-rename-op-types a))
[a (:v datom)]))))
datoms)]
(when (and (:db-ident op-map) (> (count op-map) 1))
[e op-map]))))
(into {}))))
@@ -343,6 +359,14 @@
(d/transact! conn retract-all-tx-data)
(vals e->op-map)))
(defn- get&remove-all-rename-db-ident-ops*
[conn]
(let [e->op-map (get-all-rename-db-ident-ops* @conn)
retract-all-tx-data (mapcat (fn [e] (map (fn [a] [:db.fn/retractAttribute e a]) db-ident-rename-op-types))
(keys e->op-map))]
(d/transact! conn retract-all-tx-data)
(vals e->op-map)))
(defn get-all-block-ops
[repo]
(when-let [conn (worker-state/get-client-ops-conn repo)]
@@ -374,6 +398,11 @@
(when-let [conn (worker-state/get-client-ops-conn repo)]
(get&remove-all-update-kv-value-ops* conn)))
(defn get&remove-all-rename-db-ident-ops
[repo]
(when-let [conn (worker-state/get-client-ops-conn repo)]
(get&remove-all-rename-db-ident-ops* conn)))
(defn get-unpushed-block-ops-count
[repo]
(when-let [conn (worker-state/get-client-ops-conn repo)]

View File

@@ -33,7 +33,7 @@
[:rename-db-ident
[:cat :keyword
[:map
[:db/ident :keyword]
[:db-ident :keyword]
[:new-db-ident :keyword]]]]
[:move
[:cat :keyword