mirror of
https://github.com/logseq/logseq.git
synced 2026-05-27 22:24:09 +00:00
fix(db-worker): stop remote runtime when closing current graph
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 [])
|
||||
|
||||
Reference in New Issue
Block a user