Browse Source

fix: call page/block delete even if no local changes

Tienson Qin 1 month ago
parent
commit
58cf670507
2 changed files with 56 additions and 45 deletions
  1. 2 0
      deps/db-sync/src/logseq/db_sync/storage.cljs
  2. 54 45
      src/main/frontend/worker/db_sync.cljs

+ 2 - 0
deps/db-sync/src/logseq/db_sync/storage.cljs

@@ -119,6 +119,8 @@
         created-at (common/now-ms)
         normalized-data (->> tx-data
                              (db-normalize/normalize-tx-data db-after db-before))
+        ;; _ (prn :debug :tx-data tx-data)
+        ;; _ (prn :debug :normalized-data normalized-data)
         tx-str (common/write-transit normalized-data)]
     (append-tx! sql new-t tx-str created-at)))
 

+ 54 - 45
src/main/frontend/worker/db_sync.cljs

@@ -1104,7 +1104,7 @@
      keep-last-update)))
 
 (defn- apply-remote-tx!
-  [repo client tx-data* & {:keys [local-tx remote-tx]}]
+  [repo client tx-data*]
   (if-let [conn (worker-state/get-datascript-conn repo)]
     (let [tx-data (->> tx-data*
                        (db-normalize/remove-retract-entity-ref @conn)
@@ -1116,62 +1116,71 @@
           *reversed-tx-report (atom nil)
           *remote-deleted-ids (atom #{})
           *rebase-tx-data (atom [])
+          db @conn
+          remote-deleted-blocks (->> tx-data
+                                     (keep (fn [item]
+                                             (when (= :db/retractEntity (first item))
+                                               (d/entity db (second item))))))
+          remote-deleted-block-ids (set (map :block/uuid remote-deleted-blocks))
+          safe-remote-tx-data (->> tx-data
+                                   (remove (fn [item]
+                                             (or (= :db/retractEntity (first item))
+                                                 (contains? remote-deleted-block-ids (get-lookup-id (last item))))))
+                                   seq)
+          temp-tx-meta {:rtc-tx? true
+                        :temp-conn? true
+                        :gen-undo-ops? false
+                        :persist-op? false}
           tx-report
           (if has-local-changes?
             (ldb/transact-with-temp-conn!
              conn
              {:rtc-tx? true}
              (fn [temp-conn _*batch-tx-data]
-               (let [tx-meta {:rtc-tx? true
-                              :temp-conn? true
-                              :gen-undo-ops? false
-                              :persist-op? false}
-                     db @temp-conn
+               (let [tx-meta temp-tx-meta
                      reversed-tx-report (ldb/transact! temp-conn reversed-tx-data (assoc tx-meta :op :reverse))
                      _ (reset! *reversed-tx-report reversed-tx-report)
                      ;; 2. transact remote tx-data
-                     remote-deleted-blocks (->> tx-data
-                                                (keep (fn [item]
-                                                        (when (= :db/retractEntity (first item))
-                                                          (d/entity db (second item))))))
-                     remote-deleted-block-ids (set (map :block/uuid remote-deleted-blocks))
-                     remote-tx-report (let [tx-meta (assoc tx-meta :op :transact-remote-tx-data)
-                                            tx-data (->> tx-data
-                                                         (remove (fn [item]
-                                                                   (or (= :db/retractEntity (first item))
-                                                                       (contains? remote-deleted-block-ids (get-lookup-id (last item))))))
-                                                         seq)]
-                                        (ldb/transact! temp-conn tx-data tx-meta))
-                     _ (reset! *remote-tx-report remote-tx-report)]
-                 (let [local-deleted-blocks (get-local-deleted-blocks reversed-tx-report reversed-tx-data)
-                       _ (when (seq remote-deleted-blocks)
-                           (reset! *remote-deleted-ids (set (map :block/uuid remote-deleted-blocks))))
-                       ;; _ (prn :debug
-                       ;;        :local-deleted-blocks (map (fn [b] (select-keys b [:db/id :block/title])) local-deleted-blocks)
-                       ;;        :remote-deleted-blocks remote-deleted-blocks)
-                       deleted-nodes (concat local-deleted-blocks remote-deleted-blocks)
-                       deleted-ids (set (keep :block/uuid deleted-nodes))
+                     remote-tx-report (let [tx-meta (assoc tx-meta :op :transact-remote-tx-data)]
+                                        (ldb/transact! temp-conn safe-remote-tx-data tx-meta))
+                     _ (reset! *remote-tx-report remote-tx-report)
+                     local-deleted-blocks (get-local-deleted-blocks reversed-tx-report reversed-tx-data)
+                     _ (when (seq remote-deleted-blocks)
+                         (reset! *remote-deleted-ids (set (map :block/uuid remote-deleted-blocks))))
+                     ;; _ (prn :debug
+                     ;;        :local-deleted-blocks (map (fn [b] (select-keys b [:db/id :block/title])) local-deleted-blocks)
+                     ;;        :remote-deleted-blocks remote-deleted-blocks)
+                     deleted-nodes (concat local-deleted-blocks remote-deleted-blocks)
+                     deleted-ids (set (keep :block/uuid deleted-nodes))
                        ;; 3. rebase pending local txs
-                       rebase-tx-report (when (seq local-txs)
-                                          (let [pending-tx-data (mapcat :tx local-txs)
-                                                rebased-tx-data (sanitize-tx-data
-                                                                 (or (:db-after remote-tx-report)
-                                                                     (:db-after reversed-tx-report))
-                                                                 pending-tx-data
-                                                                 (set (map :block/uuid local-deleted-blocks)))]
-                                            ;; (prn :debug :pending-tx-data pending-tx-data)
-                                            ;; (prn :debug :rebased-tx-data rebased-tx-data)
-                                            (when (seq rebased-tx-data)
-                                              (ldb/transact! temp-conn rebased-tx-data (assoc tx-meta :op :rebase)))))
-                       ;; 4. fix tx data
-                       db @temp-conn
-                       deleted-nodes (keep (fn [id] (d/entity db [:block/uuid id])) deleted-ids)]
-                   (delete-nodes! temp-conn deleted-nodes (assoc tx-meta :op :delete-blocks))
-                   (fix-tx! temp-conn remote-tx-report rebase-tx-report (assoc tx-meta :op :fix)))))
+                     rebase-tx-report (when (seq local-txs)
+                                        (let [pending-tx-data (mapcat :tx local-txs)
+                                              rebased-tx-data (sanitize-tx-data
+                                                               (or (:db-after remote-tx-report)
+                                                                   (:db-after reversed-tx-report))
+                                                               pending-tx-data
+                                                               (set (map :block/uuid local-deleted-blocks)))]
+                                          ;; (prn :debug :pending-tx-data pending-tx-data)
+                                          ;; (prn :debug :rebased-tx-data rebased-tx-data)
+                                          (when (seq rebased-tx-data)
+                                            (ldb/transact! temp-conn rebased-tx-data (assoc tx-meta :op :rebase)))))
+                     ;; 4. delete nodes and fix tx data
+                     db @temp-conn
+                     deleted-nodes (keep (fn [id] (d/entity db [:block/uuid id])) deleted-ids)]
+                 (delete-nodes! temp-conn deleted-nodes (assoc tx-meta :op :delete-blocks))
+                 (fix-tx! temp-conn remote-tx-report rebase-tx-report (assoc tx-meta :op :fix))))
              {:listen-db (fn [{:keys [tx-meta tx-data]}]
                            (when-not (contains? #{:reverse :transact-remote-tx-data} (:op tx-meta))
                              (swap! *rebase-tx-data into tx-data)))})
-            (ldb/transact! conn tx-data {:rtc-tx? true}))
+            (ldb/transact-with-temp-conn!
+             conn
+             {:rtc-tx? true}
+             (fn [temp-conn]
+               (when (seq safe-remote-tx-data)
+                 (d/transact! temp-conn safe-remote-tx-data {:rtc-tx? true}))
+               (when-let [deleted-nodes (keep (fn [id] (d/entity db [:block/uuid id])) remote-deleted-block-ids)]
+                 (delete-nodes! temp-conn deleted-nodes
+                                (assoc temp-tx-meta :op :delete-blocks))))))
           remote-tx-report @*remote-tx-report]
 
       ;; persist rebase tx to client ops
@@ -1189,7 +1198,7 @@
                 normalized-tx-data (remove remote-tx-data-set normalized)
                 reversed-datoms (reverse-tx-data tx-data)]
             ;; (prn :debug :normalized-tx-data normalized-tx-data)
-            ;; (prn :debug :remote-tx-data remote-tx-data-set)
+            ;; (prn :debug :remote-tx-data tx-data*)
             ;; (prn :debug :diff (data/diff remote-tx-data-set
             ;;                              (set normalized)))
             (when (seq normalized-tx-data)