Hello,
plusieurs grabbers ont intégrés Valhalla depuis le dernier article, merci à Benjamin pour son travail. Il reste cependant quelques lacunes à combler. Certaines des fonctionnalités manquantes sont mineurs et je ne vais donc pas les aborder ici. Même que je ne compte pas travailler dessus tant que les plus importantes ne seront pas implémentées.
C’est sûrement une des fonctionnalités la plus importante à faire avant l’intégration dans Enna. Son rôle est de permettre la récupération des méta-données en priorité (sur demande). L’idée est très simple, lorsque vous utilisez Enna et ciblez un fichier en particulier, le rôle du “on-demand” sera de fournir toutes les données le plus rapidement possible pour ce fichier. A moins que ces données soient déjà récupérées et sauvées dans la base de données (ainsi que les fichiers téléchargés tel que les couvertures).
Bien que l’idée soit simple, l’implémentation est bien plus complexe. Valhalla
étant un scanner de répertoire, il n’y a actuellement aucun mécanisme pour
donner une priorité plus importante à un fichier plutôt qu’un autre. Comme je
l’explique dans l’article précédent, les tâches des threads de Valhalla
fonctionnent selon le principe du premier arrivé, premier servi. Il faut donc
implémenter un moyen de mettre “un paquet” selon un LIFO (Last In, First Out) à
la place d’un FIFO. Par exemple un attribut indiquerait que le paquet est
prioritaire et les queues seraient utilisées en LIFO. Les queues dans Valhalla
sont héritées de libplayer. Elles se nomment fifo_queue
et n’ont pas du tout
été prévues pour le LIFO comme le suggère leur nom. Il est peut être temps de
les rendre plus polyvalentes. Je n’ai encore rien entrepris en ce sens, je ne
fais que des réflexions sur une manière parmi d’autres de gérer le “on-demand”.
Donner plus de priorité dans les queues ce n’est pas l’unique chose à prendre en compte. Le “on-demand” doit aussi pouvoir se faire sur des fichiers qui ne sont pas disponibles avec les chemins scannés par Valhalla. Ce qui induit que ces entrées doivent avoir un statu particulier dans la base de donnée, afin que Valhalla ne les supprime pas lors du prochain scan, croyant que se sont des fichiers effacés car introuvables. Quoi qu’il en soit, avant d’écrire la moindre ligne de code, il est important de faire toutes les considérations nécessaires afin de ne pas introduire des modifications trop intrusives aussi bien au niveau interne de Valhalla qu’au niveau de la structure de la base de donnée.
Depuis la première version de Valhalla, il est possible d’arrêter un scanner (et donc tous les threads en aval) même si le système est en train de travailler sur des fichiers à différents niveaux. Le fait d’avoir ajouté les grabbers à fortement compliqué cette fonctionnalité de “force-stop” qui n’est actuellement pas optimale. J’ai du faire un choix afin de pouvoir commiter le code sur les grabbers même si je n’ai pas terminé cette part du travail.
Mais tout d’abord, pourquoi le “force-stop”? Lorsque vous êtes dans Enna, Valhalla tourne en arrière plan avec une priorité très basse afin de ne pas influencer l’interface et les lectures des fichiers. Si vous quittez Enna, vous voulez le faire immédiatement ce qui semble logique. Par contre pour Valhalla c’est plus compliqué. L’arrêter en plein au milieu de tâches l’oblige à ne pas pouvoir vider les queues des threads. Toutes les données dans ces queues sont donc libérées et perdues. Avant l’ajout des grabbers ce n’était pas du tout un problème, car le système se limitait à une seule étape; le parser. Un thread n’est pas tué avec le “force-stop”, mais sa dernière tâche est terminée normalement. La différence est que les tâches suivantes sont ignorées et le thread se termine comme s’il n’y avait rien de plus à faire. Ainsi avant l’ajout des grabbers, au pire les fichiers restant dans les queues n’étaient pas insérés/actualisés dans la base de donnée. Les fichiers qui étaient déjà insérés l’étaient au complet. Ceux qui ne l’étaient pas, ne l’étaient pas du tout. C’était du tout ou rien. Le prochain scan (démarrage d’Enna) permettait de continuer le travail très simplement. Les queues se repeuplaient par le scanner qui ne trouvait pas les fichiers dans la base de données, et ignorait ceux qui existaient déjà (c’est toujours le cas “plus-ou-moins” si vous compilez Valhalla sans les grabbers).
Depuis que les grabbers sont présents, la complexité du “force-stop” a augmenté pour deux raisons. Un fichier peut exister dans plusieurs queues en même temps, et un fichier doit passer par plusieurs étapes avant d’être terminé. Les données d’un fichier dans la base de donnée ne peuvent plus être considérées comme du tout ou rien. Un fichier se retrouve complètement fragmenté quand les threads sont tous terminés en plein au milieu des tâches.
J’ai donc fais un choix intermédiaire pour que Valhalla fonctionne aussi en
“force-stop” bien que le problème de fragmentation ne soit pas réglé. J’ai
décidé de traiter un fichier comme c’est le cas sans le support des grabbers
mais à une différence près. Un fichier est considéré comme interrompu tant qu’il
n’a pas atteint l’étape ENDING
(voir l’article précédent). Donc au
prochain scan (redémarrage de Valhalla), ce fichier repassera absolument par
toutes les étapes. Le problème est donc que les données déjà grabbées (et
sauvées dans la DB) sont re-grabbées ce qui prend beaucoup de temps inutile.
Avec des milliers de fichiers et beaucoup de grabbers, il se trouve que Valhalla
passe son temps à refaire encore et encore le même travail si on ne le laisse
pas se terminer de lui même. Car pour qu’un fichier puisse atteindre l’étape
ENDING
quand il y a 5-6 grabbers, il faut se lever tôt ;-). Ce système est
provisoire! Il est là en attendant que j’y travail. Et c’est une des raisons qui
fait que Valhalla ne doit pas encore être utilisé avec les grabbers dans Enna.
Pourquoi de la fragmentation? Alors ça n’a rien à voir avec votre disque dur,
quand je parle de fragmentation c’est dans le sens où toutes les informations
qui devraient l’être ne sont pas disponibles dans la base de donnée. Par exemple
un fichier est passé par l’étape PARSING
et GRABBING
(le premier grabber).
Les méta-données du parser ont été sauvées dans la DB, ainsi que celle du
premier grabber par exemple. Néanmoins il y a peut être encore 4 grabbers avant
le downloader et l’ENDING
. Le “force-stop” arrête tout, vide les queues,
quitte Valhalla. Il se trouve que le fichier en question a une partie des
méta-données dans la base de donnée, mais on a aucune certitude qu’elle soient
toutes disponibles car ce fichier est indiqué comme étant interrompu.
Je suis en train de réfléchir à ce problème (sur papier pour le moment). Ce qu’il faut arriver à faire, c’est de sauver le contexte des fichiers interrompus pour pouvoir restaurer leur contexte à la prochaine exécution de Valhalla. Il n’y a donc pas 50 manières de faire. La sauvegarde du contexte doit être réalisée dans la base de donnée. Un mécanisme à l’exécution de Valhalla devra chercher les contextes, les restaurer puis les effacer de la base de données.
Un contexte devra contenir les informations sur quels grabbers ont été traités en entier (ceux où les données sont vraiment sauvées) ainsi que la liste des fichiers qui doivent être téléchargés. Il faut aussi considérer les cas où des contextes ont été sauvés mais que certains grabbers ne sont plus disponibles avec Valhalla, ou même qu’un Valhalla sans le support des grabbers essaient d’utiliser la base de données qui contient ces contextes.
Concernant le downloader c’est un peu différent par rapport aux autres threads. Comme je l’ai dis précédemment, un thread termine sa tâche en cours puis quitte. Pour le downloader une tâche peut être interrompue en plein au mieux. Cela veut simplement dire que pour un fichier en particulier, il y a par exemple un “cover”, un “backdrop” et peut être encore autre chose à télécharger. Il se peut que le “cover” soit téléchargé, que le “force-stop” se manifeste et donc le “backdrop” est ignoré. La tâche est à moitié réalisée. Il est donc nécessaire de sauvegarder l’état de cette tâche avant de quitter le thread du downloader.
Finalement ça représente des ajouts de tables dans la base de données pour sauvegarder les contextes, des mécanismes pour gérer les contextes (sauvegarde, restauration et effacement), puis ensuite on pourra réfléchir sérieusement à l’intégration dans Enna.
Le dernier point relativement important est la gestion des évènements pour un scan “on-demand”. Les données étant insérées au fur et à mesure dans la base de donnée, il est intéressant de recevoir une information sur ce qui est disponible afin de savoir quand aller les lire. Simplement, lorsque vous êtes sur un fichier en particulier avec Enna, un “backdrop” va se télécharger à un moment indéterminé. Un évènement sera envoyé par Valhalla à Enna quand le fichier sera sauvé et le “backdrop” s’affichera.
C’est avant tout une question de confort que d’avoir cette fonctionnalité. Dans le cas contraire il serait nécessaire d’aller lire les données que lors de l’accès au fichier, et les images par exemple ne s’afficheraient qu’en changeant de fichier, puis en revenant sur le précédent (pour autant que quelque chose s’est téléchargé entre temps).
…
Il y a d’autres points mais moins prioritaires. Je compte travailler spécialement sur les trois problèmes présentés dans cet article. J’ai déjà fais un peu de travail sur le “force-stop”. Après je pense régler le “on-demand” puis les évènements.
A bientôt,
Mathieu SCHROETER