En effet, je m’étais rendu compte que ça corromp la base sinon.
Oui je te confirme, ça tourne depuis plus de 12h, pour la suppression d’une seule feature. Mais je sais que c’est lié à deux choses : une DB de 8Go et un RPi avec une carte SD et pas un SSD.
Si tu as ça sous la main, tu peux me rappeler comment :
Lister les features par devices
Supprimer les données d’une feature (et je désactiverais ensuite leur stockage dans l’interface)
DELETE FROM t_device_feature_state WHERE device_feature_id = 'cca32009-8d8f-4965-b658-bdb28eb31300';
DELETE FROM t_device_feature_state_aggregate WHERE device_feature_id = 'cca32009-8d8f-4965-b658-bdb28eb31300';
Ok, 60k lignes c’est rien on pourra mettre à terme une tâche pour vider l’historique (un peu comme on fait avec les states: derniers 6 mois, dernière année, etc…)
Super la base de donnée a été réduite aussi chez moi et cela se ressent sur l’affichage des graphiques.
Par contre maintenant j’ai un problème à chaque modification d’un device, par exemple son nom, cela me bloque Gladys pendant plusieurs minutes. (facile 10 à 15 min)
Est-ce normal?
Je pourrais donner plus de détails et faire des tests mais en soirée si besoin.
@pierre-gilles je ne sais pas si c’est le cas, mais on dirait réellement que soit la base de données soit Gladys est en mode bloquant à ce moment là.
Car vraiment plus rien ne répond. Donc soit j’ai totalement tord (ce serait pas la première fois ), soit il y a quelque chose à faire pour optimiser un peu cette partie.
De mon côté, je vois un processus node index.js à 100% du CPU, quand l’écriture sur la carte SD de mon Raspberry Pi ne semble pas à 100% de I/O.
En fait lorsque vous enregistrez un appareil, Gladys va faire 2 choses:
Si certaines features sont en historique désactivés, Gladys va purger tous les états de ces features. Cela représente potentiellement des millions de lignes sur certaines DB, ce qui peut bloquer la DB pendant pas mal de temps lors de la suppression.
Après ça, Gladys lance un VACUUM, opération qui va « réellement » supprimer la data du disque, et libérer de l’espace. VACUUM est une opération bloquante, et pendant toute la durée du VACUUM, la DB, et donc Gladys, n’est pas accessible. Sur les petites DB, c’est invisible, sur les grosses DB, ça peut prendre 20 minutes et effectivement on a l’impression que c’est « cassé », alors que non ça travaille juste !
La solution que je vois :
Coder une tâche de suppression d’états « background » qui supprime en petit batch afin que Gladys ne soit pas bloquée lors de la suppression de features à millions d’états. Il faut faire des tests et trouver le bon chiffre pour que ce soit ni trop bloquant, ni trop lent.
Retirer le VACUUM immédiat et mettre en place une tâche de VACUUM nocturne programmée et activable/désactivable (toutes les semaines par exemple).
La contrepartie de tout ça, c’est que l’effet « libération de stockage » ne sera plus immédiat, suite à une purge d’états il faudra attendre la prochaine nuit ou attendre une semaine que Gladys se purge. Eventuellement, on peut mettre un bouton quelque part pour purger manuellement mais il faut que l’utilisateur soit conscient que Gladys sera indisponible pendant tout le temps de la purge.
Par contre j’ai une assez grosse semaine donc je pense pas pouvoir regarder dans les jours qui viennent, je regarderais soit en fin de semaine, soit dans le courant de la semaine prochaine ! Je vous tiens au courant
Mais 20 min pour une petite modif de nom par exemple c’est très long. C’est très bloquant voir assez agaçant en faite, même si on sait que Gladys n’est pas cassé et qu’elle travaille en fond.
Pour ma part je pense que le nettoyage peut attendre plus tard comme tu le proposes. Et activable/désactivable par l’utilisateur peut être bien.
Merci pour les détails, je comprends mieux pourquoi on a tous la sensation que c’est bloquant.
Je suis pour la solution du VACUUM la nuit (entre 2h et 4h du matin par exemple).
Quel utilisateur va réellement se soucier de la taille de sa DB à quelques heures près ?