fix(sync): close failed import setup dbs

This commit is contained in:
Tienson Qin
2026-03-12 09:46:19 +08:00
parent 6c3a94ea04
commit 0007c48003
2 changed files with 30 additions and 1 deletions

View File

@@ -697,7 +697,8 @@
(def-thread-api :thread-api/db-sync-import-prepare
[repo reset? graph-id graph-e2ee?]
(let [graph-e2ee? (if (nil? graph-e2ee?) true (true? graph-e2ee?))]
(let [graph-e2ee? (if (nil? graph-e2ee?) true (true? graph-e2ee?))
opened-db (atom nil)]
(-> (p/let [_ (when-let [state @*import-state]
(close-import-state! state))
_ (reset! *import-state nil)
@@ -709,6 +710,7 @@
(db-sync/fail-fast :db-sync/missing-field {:repo repo :field :aes-key}))
pool (<get-opfs-pool repo)
^js db (new (.-OpfsSAHPoolDb pool) repo-path)
_ (reset! opened-db db)
_ (common-sqlite/create-kvs-table! db)
_ (enable-sqlite-wal-mode! db)
_ (when reset? (.exec db "DELETE FROM kvs"))
@@ -721,6 +723,7 @@
:repo repo})
{:import-id import-id})
(p/catch (fn [error]
(close-import-state! {:db @opened-db})
(throw error))))))
(def-thread-api :thread-api/db-sync-import-rows-chunk

View File

@@ -123,6 +123,32 @@
(is false (str error))
(done)))))))))
(deftest db-sync-import-prepare-cleans-up-failed-setup-test
(async done
(restoring-worker-state
(fn []
(let [closed (atom [])
setup-calls (atom 0)
prepare (@thread-api/*thread-apis :thread-api/db-sync-import-prepare)]
(-> (p/with-redefs [db-worker/<get-opfs-pool (fn [_] (p/resolved (fake-import-pool [:failed :retry] closed)))
common-sqlite/create-kvs-table! (fn [_]
(if (zero? @setup-calls)
(do
(swap! setup-calls inc)
(throw (ex-info "setup failed" {})))
nil))
db-worker/enable-sqlite-wal-mode! (fn [_] nil)]
(p/let [failed-outcome (capture-outcome #(prepare test-repo false "graph-1" false))
retry-import (prepare test-repo false "graph-1" false)]
(is (= "setup failed" (some-> failed-outcome :error ex-message)))
(is (= [:failed] @closed))
(is (map? retry-import))
(is (:import-id retry-import))
(done)))
(p/catch (fn [error]
(is false (str error))
(done)))))))))
(deftest db-sync-import-rows-chunk-rejects-stale-import-id-test
(async done
(restoring-worker-state