[Bug] Scan partiel déclenche un scan complet #9
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Comportement actuel : Lorsqu'un scan partiel est demandé pour un jukebox Vynil, le système effectue malgré tout un scan complet.
Impact : Ralentissement inutile des opérations et pénibilité pour l'utilisateur/admin.
Attente : Le scan partiel doit strictement se limiter aux chemins/fichiers ciblés.
Analyse de la cause probable, après lecture de
agent/scripts/boxes/scan.rhai:harbor/gitlab,list_repository(spec, namespace)est appelé avant l'application du filtre : tout le projet est énuméré via l'API même pour un scan partiel.box.status.packages; si rien ne matche (premier scan, paquet jamais scanné, status perdu), le code retombe sur la liste complète :Proposition :
set_status_packages_mergevide + unlog_warnexplicite (« cible inconnue, lancez un scan complet ») ;list_repository()complet (les couples registry/image sont déjà connus) — c'est là que se gagne l'essentiel du temps ;http/s3filtrent déjà correctement par entrée d'index (continueavant le fetch), elles ne sont pas concernées.Tests : scan partiel avec cible présente dans le status → seuls ses dépôts sont interrogés ; cible absente → aucun appel registre, warning, status inchangé.
Analyse et rédaction : Claude (assistant IA), publié via le compte de Xavier.
Mauvaise analyse : ca arrive aussi quand le package est connu et référencé.
Le problème est plus simple : l'utilisateur demande un scan apps/monappli, mais la référence interne est {quelques-chose}/apps/monappli. Ce ce qui génère le mis-match. Idem pour un scan de catégorie, il demande apps mais en interne il y a {quelques-chose}/apps/{package_name}.
Dans les faits, je n'ai jamais vu l'agent recevoir le nom du package a scanner alors que j'ajoute l'annotations
Analyse corrigée — cause racine côté opérateur, liée à #17
Tu as raison, ma première analyse était à côté. En retraçant le cycle complet de réconciliation (
operator/src/jukebox.rs), le mécanisme exact est le suivant :vynil.solidite.fr/force-scan: apps/monappli, l'opérateur crée bien le jobscan-<name>avecSCAN_PACKAGE=apps/monappli(le job précédent est supprimé, le filtre est injecté, l'annotation est retirée après création). Pendant que ce job partiel tourne, la garde le protège (requeue 60 s).scan.yaml— sansSCAN_PACKAGEpuisque l'annotation a été consommée. Le spec diffère du job existant, orspec.templated'un Job Kubernetes est immuable → l'apply échoue → la branche de secours supprime le job partiel et recrée un job de scan complet (jukebox.rs:167-187).Cela explique exactement tes deux observations :
scan-<name>). Quand tu inspectes le job, tu vois le remplaçant.Sur l'hypothèse du mismatch de chemin (
{quelque-chose}/apps/monappli) : le matching dansscan.rhaise fait surmetadata.category/metadata.namedes packages du status (scan.rhai:203-208), pas sur les chemins de dépôt —apps/monapplidevrait donc matcher. Le scan complet observé n'est pas un mauvais matching : c'est le job de remplacement décrit ci-dessus.Correction proposée (opérateur)
Ne plus ré-appliquer le spec du Job à chaque réconciliation. Le Job direct ne doit être créé/recréé que dans deux cas :
force-scanest présente (suppression + recréation avec filtre éventuel).Un job terminal sans annotation ne doit jamais être touché — les rescans périodiques sont la responsabilité du CronJob.
En durcissement côté agent (ma proposition initiale reste valable en complément) : supprimer le fallback
if deduped.len() > 0 { deduped } else { list }qui transforme silencieusement un filtre sans correspondance en scan complet — préférer unlog_warn+ merge vide.La correction est commune avec #17 (même zone de code, même refonte du cycle job/cache) ; le plan de test complet de remédiation et de non-régression couvrant les deux issues est posté sur #17.
Analyse rédigée par Claude (assistant IA), pour le compte de @reivaxm.