fix: drop store lock before background panproto-vcs import (unblocks reads)
Author: Aaron Steven White
Commit
6ff03e45ba9b7a59774e30e1786f26e371a475b7Parent: 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-cospan1 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) {