Files
obikmer/.kilo/plans/1778319532254-eager-panda.md
Eric Coissac e008a8beb4 harden obiskio error handling with explicit variants and bounds checking
Extend `SKError` with `BadMagic`, `Truncated`, and `InvalidData` variants to replace `expect()` calls and unsafe slice indexing. Implement proper error chaining via `source()` and update `Display` formatting. Improve magic byte validation and serde error mapping for clearer debugging. Documents a broader roadmap for further crate hardening, including LRU eviction, concurrency, and benchmarking.
2026-05-09 18:30:19 +08:00

3.4 KiB
Raw Permalink Blame History

Plan d'amélioration technique - obiskio

1. Contexte et objectifs

  • Objectif : Renforcer la robustesse, la maintenabilité et les performances de la crate obiskio.
  • Priorités :
    1. Gestion des erreurs
    2. Optimisation de la mémoire du pool
    3. Robustesse concurrente
    4. Couverture de tests
    5. Documentation

2. Axes d'amélioration détaillés

2.1 Gestion des erreurs

  • Problème : SKError ne couvre pas tous les cas (format invalide, taille maximale, CRC)
  • Actions :
    • Ajouter variante ParseError(String) dans src/error.rs
    • Valider les tailles de SuperKmer avant parsing
    • Remplacer expect() par unwrap_or_else avec messages explicites
    • Documenter chaque variante derreur dans le README

2.2 Optimisation du pool de fichiers

  • Problème : SKFilePool utilise un Vec<WriteEntry> non contraint et neffectue pas de nettoyage en cas derreur
  • Actions :
    • Implémenter un LimitedVec avec limite stricte à MAX_POOL_SIZE
    • Créer clear_memory() qui supprime les entrées orphelines
    • Ajouter evict_lru_threshold() pour éviction proactive
    • Introduire un RwLock pour les opérations de lecture massives

2.3 Robustesse concurrente

  • Problème : Risque de deadlocks dans SKFileWriter::write_batch() et SKFileReader::reopen_and_seek()
  • Actions :
    • Remplacer Mutex par RwLock pour les accès en lecture
    • Ajouter un compteur de blocage et logs de timeout
    • Utiliser std::thread::park_timeout pour débloquer
    • Insérer debug_assert! sur les états invariants

2.4 Couverture de tests

  • Problème : Absence de benchmarks, de tests de migration, de résilience de fichiers corrompus
  • Actions :
    • Benchmarks I/O sur 10k+ SuperKmer avec criterion
    • Tests de migration de version de fichier .meta.v2.meta
    • Tests de corruption volontaire (truncature, inversion de bits)
    • Tests de stress sur pool saturation (100 threads)

2.5 Documentation & exemples

  • Actions :
    • Ajouter des examples dans chaque module (# Examples)
    • Documenter la logique LRU avec diagrammes Mermaid
    • Créer un guide « How to recover from eviction »
    • Mettre à jour le README.md avec tableau des variantes derreur

3. Plan d'exécution (Roadmap)

Sprint Durée Livrables clés
S1 2 jours Refactorisation SKError, ajout de tests unitaires
S2 3 jours Implémentation clear_memory() + LimitedVec
S3 2 jours Passage à RwLock, ajout de compteurs de blocage
S4 2 jours Benchmarks + tests de migration
S5 1 jour Documentation finale & mise à jour du README

4. Dépendances externes

  • Mettre à jour niffler vers la version 2.0 (performance compression)
  • Évaluer bincode vs serde_json pour les métas (I/O)
  • Ajouter dépendance criterion (devdependencies)

5. KPI de suivi

  • Couverture de tests : ≥85% des chemins critiques
  • Latence moyenne d’écriture : ↓15% après optimisation du pool
  • Taux derreurs résolues : 100% des nouvelles variantes couvertes
  • Temps de build CI : ≤5min pour lensemble des benchmarks

6. Validation finale

  • Revue de code avec cargo clippy -- -D warnings
  • Analyse de toxicité avec cargo deny open-source-licenses
  • Vérification de la conformité aux standards de naming du projet