Просмотр исходного кода

perf: async sqlite writes

Ensures writes are executed in order.
Tienson Qin 1 год назад
Родитель
Сommit
5426360ef7
1 измененных файлов с 11 добавлено и 1 удалено
  1. 11 1
      src/main/frontend/worker/db_worker.cljs

+ 11 - 1
src/main/frontend/worker/db_worker.cljs

@@ -3,6 +3,7 @@
   (:require ["@logseq/sqlite-wasm" :default sqlite3InitModule]
             ["comlink" :as Comlink]
             [cljs-bean.core :as bean]
+            [cljs.core.async :as async]
             [clojure.edn :as edn]
             [clojure.string :as string]
             [datascript.core :as d]
@@ -143,6 +144,8 @@
           (assoc data :addresses addresses)
           data)))))
 
+(defonce sqlite-writes-chan (async/chan 10000))
+
 (defn new-sqlite-storage
   "Update sqlite-cli/new-sqlite-storage when making changes"
   [repo _opts]
@@ -165,11 +168,18 @@
                            :$content (sqlite-util/transit-write data')
                            :$addresses addresses}))
                   addr+data-seq)]
-        (upsert-addr-content! repo data delete-addrs)))
+        (if (worker-state/rtc-downloading-graph?)
+          (upsert-addr-content! repo data delete-addrs) ; sync writes when downloading whole graph
+          (async/go (async/>! sqlite-writes-chan [repo data delete-addrs])))))
 
     (-restore [_ addr]
       (restore-data-from-addr repo addr))))
 
+(async/go-loop []
+  (let [args (async/<! sqlite-writes-chan)]
+    (apply upsert-addr-content! args))
+  (recur))
+
 (defn new-sqlite-client-ops-storage
   [repo]
   (reify IStorage