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:
@@ -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(())
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user