L'indicible horreur des fichiers SQLite (et les mandelbugs de corruption de profil Firefox)5 min read

En cet Halloween, je vous partage aujourd’hui une petite histoire d’horreur et quelques astuces, fruit de mes observations sur un mystérieux phénomène survenu en 2017. En fait, ce billet est resté dans mes brouillons depuis trois ans et trois semaines (essayez de battre ce record, bande de flemmards), et je me suis dit qu’il vallait mieux que j’en finisse avant la réélection de Trump, et publie ce billet enfin… et puis hein, ho, ça fait une éternité que j’ai bloggé en Français et sur Planet Libre, alors coucou Planet Libre, ça fait un bail. Regardez, j’ai ressuscité GTG cette année, c’est bien, ça fait le café. D’ailleurs, gardez l’oeil ouvert sur mon blog car il y a du nouveau qui s’en vient, même si c’est pas forcément en Français (et donc pas sur Planet Libre)…


L’indiscible horreur des fichiers SQLite

Je n’ai pas beaucoup d’amour pour les fichiers SQLite, format répandu de stockage de données pour les applications logicielles. Je trouve que:

  1. cela obscurcit les données (pas inspectables et éditables avec un éditeur de texte comme c’est le cas du XML, par exemple);
  2. ce format a tendance à créer des problèmes de performance où on doit régulièrement passer l’aspirateur (fait amusant: c’est quatre ans plus tard que Jim, mainteneur de Geary à l’époque, en vint à découvrir le problème de performance que peut représenter SQLite… en étudiant mon billet de blog!);
  3. ça a la fâcheuse habitude, dans le cas de Firefox (et Tracker), à se corrompre beaucoup trop facilement (et rendu là, la seule solution est d’exploser le fichier au complet, à cause du point #1).

Le bizarre incident du panda rouge pendant dans la nuit

Alors, pour ce qui est de la petite anecdote “récente”…

Au début de l’automne 2017, j’ai constaté que certains sites web dynamiques (comme LinkedIn, appear.in, rocketchat) refusaient de plus en plus souvent de charger dans Firefox 55, puis, avec Firefox 56, ont déclaré la grève générale illimitée et cessé entièrement de fonctionner. Perplexe, à ce moment là j’ai tenté de désactiver toutes mes extensions, vider le cache web, vider le cache applicatif à partir de la page de préférences de Firefox, emprisonner le fou du village, rien n’y faisait.

Or, selon mes expériences précédentes, je me suis dit “Si le problème se produit sur un ordinateur particulier et non un autre… la cause est probablement un fichier SQLite corrompu”. Et comme de fait, en utilisant la console de debug web de Firefox, je découvris que ce dernier rhâlait avec des erreurs “NS_ERROR_FILE_CORRUPTED” en tentant de charger LinkedIn, ce qui m’a mené vers ce sujet de discussion dans StackOverflow, entre autres.

Il se trouve que, cette fois-là, mon fichier ~/.mozilla/firefox/profil_normal.default/webappsstore.sqlite avait muté hors de contrôle. Il pesait 86 Mo, ce qui est très louche déjà, et même si je l’ouvrais avec sqlite3 et lançais “VACUUM;”, la taille ne descendait qu’à 84 Mo. Il était clair que c’était devenu…

Alors, il ne restait qu’une solution…

J’ai donc supprimé complètement le fichier, qui s’est recréé par lui même ensuite. Sa nouvelle taille: 622 ko. Et du coup, tous mes sites applicatifs se sont mis à fonctionner. CQFD.

J’en ai alors profité pour inspecter le profil Firefox dans mon autre ordinateur, simplement en triant par taille—j’ai toujours une certaine méfiance envers les “gros fichiers” dans ce dossier (l’expérience oblige). “Tiens donc,” m’exclamai-je, “ce webappstore.sqlite me semble également bien en chair!”

Alors, cette fois là, il s’agissait de webappsstore.sqlite, au lieu de l’habituel coupable “urlclassifier3.sqlite” (qui ne semble plus exister depuis l’été 2016 environ, comme la date de modification l’indique) ou, occasionnellement, “places.sqlite” (attention, concernant ce dernier: il semble qu’il contienne également vos favoris, que vous feriez bien d’exporter au préalable d’une frappe nucléaire; voyez le glossaire des divers fichiers présents dans le dossier de profil de Firefox).

Heureusement, je n’ai pas rencontré de nouveaux problèmes depuis cet incident de 2017. On dirait qu’avec les années, ces mandelbugs se font un peu plus rares, ou se font plus discrets. Mais parfois, seul dans la nuit froide d’octobre, je me demande s’il n’y a pas encore une bestiole mutante qui grouille dans le pelage de mon Firefox. Fichu concept de stockage par fichiers SQLite corruptibles. Fichu char d’assault bipède nucléaire.


P.s.: Malgré tout, j’aime quand même Firefox; c’est le navigateur que j’utilise et préconise (en même temps, c’est le seul navigateur un peu digne de confiance qu’il nous reste, avec un moteur indépendant…). Mais ce billet est néanmoins une anecdote amusante à raconter et je me dis qu’il pourrait être, potentiellement, utile à d’autres personnes.

Jeff

Comments

4 responses to “L'indicible horreur des fichiers SQLite (et les mandelbugs de corruption de profil Firefox)”

  1. Salut ! Quels sont les effets de la suppression de ces fichiers sur les données (risque de perte de données) ? je n’ai pas vu ce point dans ton billet

    1. Bien vu! Effectivement places.sqlite peut contenir les favoris à ce que je comprends, donc j’ai modifié le billet pour rajouter une note à ce sujet, et lier vers le glossaire qui clarifie le rôle de chaque fichier.

  2. Merci. J’avais favicons.sqlite un peu gros, mais rien de méchant. je l’ai supprimé après avoir fermé mon instance.
    @+

  3. tranche Avatar
    tranche

    … bon désolé mais quelque points :
    – “xml c’est mieux que SQlite”, alors là quand même c’est fort : on compare une BDD embarqué avec son moteur SQL à un fichier structuré; ou comment comparer une patate à un vélo… et dire qu’on préfère manger des patates, parce que le vélo n’est pas très comestible quand même
    – “obscurcit les données” … ouai enfin ça obscurci comme une BDD quoi (et même bien moins car là c’est quand même une BDD dont le format ne tien que dans 1 seul fichier dont le format est documenté)
    – si SQlite de Firefox prend de l’ampleur c’est de la faute de SQlite : donc si la database d’une app grossis c’est qu’il y a un un bug dans la database elle même. Non impossible que l’app qui remplisse la db soit fautive ! Docteur je vous assure c’est mes poumons qui ont un problème; je fume 20 paquets par jours mais c’est les poumons le problème !
    – SQlite c’est utilisé avec succès, et pas par des petits rigolos quand même : https://sqlite.org/mostdeployed.html
    – SQlite est souvent pris en exemple pour la qualité de son code et notamment de sa couverture de tests https://www.sqlite.org/testing.html. Hé oui, on dit même : “SQlite is probably the most tested software you can download”, la légende veut même que SQlite soit utilisé par Airbus dans le système de vol : maping de commande (bon j’imagine que c’est un SQlite qu’en lecture, mais tout de même être utilisé dans un système de vol ça veut dire que le code a été validé avionique, c’est pas rien)
    – et enfin les performance de lecture de SQlite sont juste excellentes
    Bon après ça ne veux pas dire que SQlite a toujours été utilisé à bon escient dans Firefox, c’était pas le cas il y a quelque années. En tout cas avant de jeter la pierre (voire des pierres) de soucis de perf et de robustesse à un soft comme SQlite faudrait arriver avec des arguments autrement plus solides et techniques.
    Sinon je n’ai jamais eu de problème avec les profils Firefox; commençons donc par la questions : combien d’extensions et lesquelles sont installé sur votre Firefox ?