fix(db-worker): stop remote runtime when closing current graph

This commit is contained in:
Tienson Qin
2026-04-21 20:52:01 +08:00
parent a3faf237e9
commit febd95c6ca
2 changed files with 93 additions and 2 deletions

View File

@@ -19,6 +19,26 @@
(defonce remote-db (atom nil))
(defonce remote-repo (atom nil))
(defn- clear-remote-runtime!
[]
(reset! remote-db nil)
(reset! remote-repo nil)
(reset! state/*db-worker nil))
(defn- <stop-remote-if-current!
[repo]
(if (and repo (= repo @remote-repo))
(if-let [remote-client @remote-db]
(-> (remote/stop! remote-client)
(p/finally
(fn []
(when (= repo @remote-repo)
(clear-remote-runtime!)))))
(do
(clear-remote-runtime!)
(p/resolved true)))
(p/resolved false)))
(defn- node-runtime?
[]
(and (exists? js/process)
@@ -109,8 +129,14 @@
(defn <close-db [repo]
(when repo
(if (electron-runtime?)
(p/let [remote-client (<ensure-remote! repo)]
(remote/invoke! (:client remote-client) "thread-api/close-db" false [repo]))
(if (= repo @remote-repo)
(if-let [remote-client @remote-db]
(p/let [_ (-> (remote/invoke! (:client remote-client) "thread-api/close-db" false [repo])
(p/catch (fn [_] nil)))
_ (<stop-remote-if-current! repo)]
nil)
(p/resolved nil))
(p/resolved nil))
(state/<invoke-db-worker :thread-api/close-db repo))))
(defn <export-db

View File

@@ -261,6 +261,71 @@
(set! remote/stop! original-stop!)
(done)))))))
(deftest electron-close-db-disconnects-current-remote-runtime
(async done
(let [invoke-calls (atom [])
stop-calls (atom [])
fake-client {:repo "logseq_db_graph_a"
:client {:base-url "http://127.0.0.1:9101"}}
original-electron? util/electron?
original-invoke! remote/invoke!
original-stop! remote/stop!]
(reset-runtime-state!)
(reset! persist-db/remote-db fake-client)
(reset! persist-db/remote-repo "logseq_db_graph_a")
(set! util/electron? (constantly true))
(set! remote/invoke! (fn [client method direct-pass? args]
(swap! invoke-calls conj [client method direct-pass? args])
(p/resolved nil)))
(set! remote/stop! (fn [client]
(swap! stop-calls conj client)
(p/resolved true)))
(-> (p/let [_ (persist-db/<close-db "logseq_db_graph_a")]
(is (= [[(:client fake-client) "thread-api/close-db" false ["logseq_db_graph_a"]]]
@invoke-calls))
(is (= [fake-client] @stop-calls))
(is (nil? @persist-db/remote-db))
(is (nil? @persist-db/remote-repo)))
(p/catch (fn [e]
(is false (str "unexpected error: " e))))
(p/finally (fn []
(set! util/electron? original-electron?)
(set! remote/invoke! original-invoke!)
(set! remote/stop! original-stop!)
(done)))))))
(deftest electron-close-db-for-other-repo-does-not-bootstrap-runtime
(async done
(let [invoke-calls (atom [])
stop-calls (atom [])
fake-client {:repo "logseq_db_graph_a"
:client {:base-url "http://127.0.0.1:9101"}}
original-electron? util/electron?
original-invoke! remote/invoke!
original-stop! remote/stop!]
(reset-runtime-state!)
(reset! persist-db/remote-db fake-client)
(reset! persist-db/remote-repo "logseq_db_graph_a")
(set! util/electron? (constantly true))
(set! remote/invoke! (fn [client method direct-pass? args]
(swap! invoke-calls conj [client method direct-pass? args])
(p/resolved nil)))
(set! remote/stop! (fn [client]
(swap! stop-calls conj client)
(p/resolved true)))
(-> (p/let [_ (persist-db/<close-db "logseq_db_graph_b")]
(is (empty? @invoke-calls))
(is (empty? @stop-calls))
(is (= fake-client @persist-db/remote-db))
(is (= "logseq_db_graph_a" @persist-db/remote-repo)))
(p/catch (fn [e]
(is false (str "unexpected error: " e))))
(p/finally (fn []
(set! util/electron? original-electron?)
(set! remote/invoke! original-invoke!)
(set! remote/stop! original-stop!)
(done)))))))
(deftest start-db-worker-skips-in-node-test-runtime
(async done
(let [invoke-calls (atom [])