fix: drop store lock before background panproto-vcs import (unblocks reads)

Author: Aaron Steven White
Commit 6ff03e45ba9b7a59774e30e1786f26e371a475b7
Parent: c76a660999
Structural diff unavailable

These commits were pushed via plain git push, so no pre-parsed schemas are available. Install git-remote-cospan and re-push via panproto:// to see scope-level changes, breaking change detection, and semantic diffs.

brew install panproto/tap/git-remote-cospan
1 file changed +21 -14
@@ -224,20 +224,27 @@ pub async fn git_receive_pack(
224224         let did_clone = did.clone();
225225         let repo_clone = repo.clone();
226226         tokio::task::spawn_blocking(move || {
227-            let store_guard = store_clone.blocking_lock();
228-            let mirror = match store_guard.open_or_init_git_mirror(&did_clone, &repo_clone) {
229-                Ok(m) => m,
230-                Err(e) => {
231-                    tracing::error!(error = %e, "background import: open mirror failed");
232-                    return;
233-                }
234-            };
235-            let mut vcs_store = match store_guard.open_or_init(&did_clone, &repo_clone) {
236-                Ok(s) => s,
237-                Err(e) => {
238-                    tracing::error!(error = %e, "background import: open vcs store failed");
239-                    return;
240-                }
227+            // Open the stores under the lock, then DROP the lock before
228+            // the expensive import. FsStore is file-backed so concurrent
229+            // reads (listCommits, diffCommits) work fine while we write.
230+            let (mirror, mut vcs_store) = {
231+                let store_guard = store_clone.blocking_lock();
232+                let mirror = match store_guard.open_or_init_git_mirror(&did_clone, &repo_clone) {
233+                    Ok(m) => m,
234+                    Err(e) => {
235+                        tracing::error!(error = %e, "background import: open mirror failed");
236+                        return;
237+                    }
238+                };
239+                let vcs_store = match store_guard.open_or_init(&did_clone, &repo_clone) {
240+                    Ok(s) => s,
241+                    Err(e) => {
242+                        tracing::error!(error = %e, "background import: open vcs store failed");
243+                        return;
244+                    }
245+                };
246+                (mirror, vcs_store)
247+                // store_guard dropped here: lock released
241248             };
242249             for (new_oid, refname) in &import_tasks {
243250                 match panproto_git::import_git_repo(&mirror, &mut vcs_store, new_oid) {
cospan · schematic version control on atproto built on AT Protocol