Correction du deadlock dans add_with_metadata (pmocache/src/db.rs)

## Problème identifié
Le test test_add_with_metadata était bloqué indéfiniment à cause d'un deadlock.

## Cause
Dans `add_with_metadata()`:
1. Ligne 195: Obtention du mutex sur la connexion DB
2. Ligne 208: Appel à `set_metadata()` qui essaie d'obtenir le MÊME mutex
3. Résultat: Deadlock permanent

## Solution
- Encapsulation du premier bloc dans un scope pour libérer le lock automatiquement
- Appel à `set_metadata()` après la libération du lock
- Amélioration du code avec `if let Some(metadata)` au lieu de `if metadata.is_some()`

## Résultats
-  test_add_with_metadata passe maintenant en 0.07s (vs bloqué indéfiniment)
-  Tous les 16 tests DB passent en 0.29s
-  Test réactivé (retrait du #[ignore])

Cette correction est critique car elle affecte toute utilisation de `add_with_metadata()`.
This commit is contained in:
Claude
2025-11-06 10:07:40 +00:00
parent 46d99bd96c
commit 3b229eab28
2 changed files with 16 additions and 13 deletions

View File

@@ -192,20 +192,24 @@ impl DB {
collection: Option<&str>,
metadata: Option<&Value>,
) -> rusqlite::Result<()> {
let conn = self.lock_conn("add_with_metadata");
// Bloc pour limiter la durée du lock
{
let conn = self.lock_conn("add_with_metadata");
conn.execute(
"INSERT INTO asset (pk, id, collection, hits, last_used)
VALUES (?1, ?2, ?3, 0, ?4)
ON CONFLICT(pk) DO UPDATE SET
id = excluded.id,
collection = excluded.collection,
last_used = excluded.last_used",
params![pk, id, collection, Utc::now().to_rfc3339()],
)?;
conn.execute(
"INSERT INTO asset (pk, id, collection, hits, last_used)
VALUES (?1, ?2, ?3, 0, ?4)
ON CONFLICT(pk) DO UPDATE SET
id = excluded.id,
collection = excluded.collection,
last_used = excluded.last_used",
params![pk, id, collection, Utc::now().to_rfc3339()],
)?;
} // Lock libéré ici
if metadata.is_some() {
self.set_metadata(pk, metadata.unwrap())?
// Appeler set_metadata après avoir libéré le lock pour éviter un deadlock
if let Some(metadata) = metadata {
self.set_metadata(pk, metadata)?;
}
Ok(())

View File

@@ -43,7 +43,6 @@ fn test_add_and_get() {
}
#[test]
#[ignore] // Test trop lent, à investiguer
fn test_add_with_metadata() {
let (_temp_dir, db) = create_test_db();