Bläddra i källkod

update db worker

Tienson Qin 7 månader sedan
förälder
incheckning
f28fe9ce94
1 ändrade filer med 12 tillägg och 62 borttagningar
  1. 12 62
      src/main/frontend/worker/db_worker.cljs

+ 12 - 62
src/main/frontend/worker/db_worker.cljs

@@ -43,7 +43,9 @@
             [logseq.db.common.view :as db-view]
             [logseq.db.common.view :as db-view]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.frontend.schema :as db-schema]
             [logseq.db.sqlite.create-graph :as sqlite-create-graph]
             [logseq.db.sqlite.create-graph :as sqlite-create-graph]
+            [logseq.db.sqlite.debug :as sqlite-debug]
             [logseq.db.sqlite.export :as sqlite-export]
             [logseq.db.sqlite.export :as sqlite-export]
+            [logseq.db.sqlite.gc :as sqlite-gc]
             [logseq.db.sqlite.util :as sqlite-util]
             [logseq.db.sqlite.util :as sqlite-util]
             [logseq.outliner.op :as outliner-op]
             [logseq.outliner.op :as outliner-op]
             [me.tonsky.persistent-sorted-set :as set :refer [BTSet]]
             [me.tonsky.persistent-sorted-set :as set :refer [BTSet]]
@@ -141,65 +143,6 @@
       (rebuild-db-from-datoms! conn sqlite-db)
       (rebuild-db-from-datoms! conn sqlite-db)
       (worker-util/post-message :notification ["The graph has been successfully rebuilt." :success false]))))
       (worker-util/post-message :notification ["The graph has been successfully rebuilt." :success false]))))
 
 
-(defonce get-non-refed-addrs-sql
-  "WITH all_referenced AS (
-     SELECT CAST(value AS INTEGER) AS addr
-     FROM kvs, json_each(kvs.addresses)
-  )
-  SELECT kvs.addr
-  FROM kvs
-  WHERE kvs.addr NOT IN (SELECT addr FROM all_referenced)")
-
-(defn- gc-kvs-table!
-  [^Object db]
-  (when db
-    (let [schema (some->> (.exec db #js {:sql "select content from kvs where addr = 0"
-                                         :rowMode "array"})
-                          bean/->clj
-                          ffirst
-                          sqlite-util/transit-read)
-          internal-addrs (set [0 1 (:eavt schema) (:avet schema) (:aevt schema)])
-          non-refed-addrs (->> (.exec db #js {:sql get-non-refed-addrs-sql
-                                              :rowMode "array"})
-                               (map first)
-                               set)
-          unused-addresses (clojure.set/difference non-refed-addrs internal-addrs)]
-      (if (seq unused-addresses)
-        (do
-          (prn :debug :db-gc :unused-addresses unused-addresses)
-          (.transaction db (fn [tx]
-                             (doseq [addr unused-addresses]
-                               (.exec tx #js {:sql "Delete from kvs where addr = ?"
-                                              :bind #js [addr]})))))
-        (prn :debug :db-gc "There's no garbage data that needs to be collected.")))))
-
-(defn- find-missing-addresses
-  [conn ^Object db & {:keys [delete-addrs]}]
-  (let [schema (some->> (.exec db #js {:sql "select content from kvs where addr = 0"
-                                       :rowMode "array"})
-                        bean/->clj
-                        ffirst
-                        sqlite-util/transit-read)
-        result (->> (.exec db #js {:sql "select addr, addresses from kvs"
-                                   :rowMode "array"})
-                    bean/->clj
-                    (keep (fn [[addr addresses]]
-                            (when-not (and delete-addrs (delete-addrs addr))
-                              [addr (bean/->clj (js/JSON.parse addresses))]))))
-        used-addresses (-> (set (concat (mapcat second result)
-                                        [0 1 (:eavt schema) (:avet schema) (:aevt schema)]))
-                           (clojure.set/difference delete-addrs))
-        missing-addresses (clojure.set/difference used-addresses (set (map first result)))]
-    (when (seq missing-addresses)
-      (let [version-in-db (when conn (db-schema/parse-schema-version (or (:kv/value (d/entity @conn :logseq.kv/schema-version)) 0)))
-            compare-result (when version-in-db (db-schema/compare-schema-version version-in-db "64.8"))]
-        (when (and compare-result (not (neg? compare-result))) ; >= 64.8
-          (worker-util/post-message :capture-error
-                                    {:error "db-missing-addresses-v2"
-                                     :payload {:missing-addresses (str missing-addresses)
-                                               :db-schema-version (str version-in-db)}}))))
-    missing-addresses))
-
 (defn upsert-addr-content!
 (defn upsert-addr-content!
   "Upsert addr+data-seq. Update sqlite-cli/upsert-addr-content! when making changes"
   "Upsert addr+data-seq. Update sqlite-cli/upsert-addr-content! when making changes"
   [db data]
   [db data]
@@ -308,10 +251,10 @@
               (not (number? last-gc-at))
               (not (number? last-gc-at))
               (> (- (common-util/time-ms) last-gc-at) (* 7 24 3600 1000))) ; 1 week ago
               (> (- (common-util/time-ms) last-gc-at) (* 7 24 3600 1000))) ; 1 week ago
       (prn :debug "gc current graph")
       (prn :debug "gc current graph")
-      (gc-kvs-table! sqlite-db)
+      (sqlite-gc/gc-kvs-table! sqlite-db)
       (d/transact! datascript-conn [{:db/ident :logseq.kv/graph-last-gc-at
       (d/transact! datascript-conn [{:db/ident :logseq.kv/graph-last-gc-at
                                      :kv/value (common-util/time-ms)}])))
                                      :kv/value (common-util/time-ms)}])))
-  (gc-kvs-table! client-ops-db))
+  (sqlite-gc/gc-kvs-table! client-ops-db))
 
 
 (defn- create-or-open-db!
 (defn- create-or-open-db!
   [repo {:keys [config import-type datoms] :as opts}]
   [repo {:keys [config import-type datoms] :as opts}]
@@ -359,7 +302,14 @@
         ;; TODO: remove this once we can ensure there's no bug for missing addresses
         ;; TODO: remove this once we can ensure there's no bug for missing addresses
         ;; because it's slow for large graphs
         ;; because it's slow for large graphs
         (when-not import-type
         (when-not import-type
-          (when-let [missing-addresses (seq (find-missing-addresses conn db))]
+          (when-let [missing-addresses (seq (sqlite-debug/find-missing-addresses db))]
+            (let [version-in-db (when conn (db-schema/parse-schema-version (or (:kv/value (d/entity @conn :logseq.kv/schema-version)) 0)))
+                  compare-result (when version-in-db (db-schema/compare-schema-version version-in-db "64.8"))]
+              (when (and compare-result (not (neg? compare-result))) ; >= 64.8
+                (worker-util/post-message :capture-error
+                                          {:error "db-missing-addresses-v2"
+                                           :payload {:missing-addresses (str missing-addresses)
+                                                     :db-schema-version (str version-in-db)}})))
             (worker-util/post-message :notification ["It seems that the DB has been broken. Please run the command `Fix current broken graph`." :error false])
             (worker-util/post-message :notification ["It seems that the DB has been broken. Please run the command `Fix current broken graph`." :error false])
             (throw (ex-info "DB missing addresses" {:missing-addresses missing-addresses}))))
             (throw (ex-info "DB missing addresses" {:missing-addresses missing-addresses}))))