fix(backend): prevent db lock reentrancy in orchestrator notifications

This commit is contained in:
thibaud-lclr 2026-04-21 14:04:29 +02:00
parent 7f7e066e7c
commit ce37ce9ea0
2 changed files with 40 additions and 20 deletions

View file

@ -24,6 +24,7 @@ pub fn get_ticket_result(
#[tauri::command]
pub fn retry_ticket(state: State<'_, AppState>, ticket_id: String) -> Result<(), AppError> {
let active_worktree_cleanup: Option<(crate::models::worktree::Worktree, String)> = {
let conn = state.db.lock().map_err(|e| AppError::from(e.to_string()))?;
let ticket = ProcessedTicket::get_by_id(&conn, &ticket_id)?;
@ -41,15 +42,32 @@ pub fn retry_ticket(state: State<'_, AppState>, ticket_id: String) -> Result<(),
rusqlite::params![ticket_id],
)?;
if let Some(wt) = Worktree::get_by_ticket_id(&conn, &ticket_id)? {
let cleanup_target = if let Some(wt) = Worktree::get_by_ticket_id(&conn, &ticket_id)? {
if wt.status == "Active" {
let project = crate::models::project::Project::get_by_id(&conn, &ticket.project_id)?;
Some((wt, project.path))
} else {
Some((wt, String::new()))
}
} else {
None
};
cleanup_target
};
if let Some((wt, project_path)) = &active_worktree_cleanup {
if wt.status == "Active" {
let _ = crate::services::worktree_manager::delete_worktree(
&project.path,
project_path,
&wt.path,
&wt.branch_name,
);
}
}
if let Some((wt, _)) = active_worktree_cleanup {
let conn = state.db.lock().map_err(|e| AppError::from(e.to_string()))?;
Worktree::delete(&conn, &wt.id)?;
}

View file

@ -743,9 +743,11 @@ async fn process_ticket(
return Ok(true);
}
{
let conn = db.lock().map_err(|e| format!("DB lock: {}", e))?;
ProcessedTicket::update_status(&conn, &ticket.id, "Done")
.map_err(|e| format!("update_status: {}", e))?;
}
let _ = app_handle.emit(
"ticket-processing-done",
serde_json::json!({