FreeBSD 5.3 est sorti, et j'ai bien évidemment mis à jour mon serveur, non sans mal...

Je n'ai pas eu de mal à mettre à jour le système en soi, grâce aux conseils du FreeBSD Project, et de FreeBSD Cheat Sheets. Je l'ai maintenant fait une bonne dizaine de fois, entre mon propre serveur et les serveurs du boulot. Rarement de problèmes. Et aucun problème qui ne soit réglé en moins de 30 min.

D'ailleurs, soit dit en passant, cette version de FreeBSD est importante, car c'est la première version de FreeBSD 5.x à avoir une branche STABLE. Ce qui veut dire qu'il a atteint un stade où il est considéré comme bon pour production. Oui, je faisais tourner toute ma vie sur le net avec une "beta". 🙂

La mise à jour du système s'est révélée plus importante qu'à ce quoi je m'attendais. Les modifications des fichiers de configuration et des scripts étaient moins nombreuses lors des mises à jour des précédents FreeBSD 5. Du coup, je me suis dit qu'il serait peut-être intéressant de mettre à jour certains ports. Les ports, c'est les logiciels de source tierce (et open source) pré-configurés pour se compiler et tourner sur FreeBSD. Ils sont généralement intercompatible entre les *BSD majeurs (FreeBSD, OpenBSD et NetBSD). C'est pratique, le port se débrouille pour résoudre les dépendances et récupérer les sources pour installer le logiciel. Presque rien à faire, si ce n'est adapter le fichier de configuration. 🙂

Donc je me dis que ça serait pas mal de mettre à jour Python, vu qu'il est le langage de base de Zope, sur lequel repose Plone, qui est le squelette de mon site. FreeBSD 5.3-STABLE est sensé être débarrassé des codes de debug, donc je me suis dit qu'en recompilant Python sur les nouvelles bibliothèques et avec le nouveau GCC, ça accélérerait l'exécution des programmes Python, comme Zope (en même temps, j'en sais trop rien, c'est peut-être des conneries, ce que je raconte 🙂).

Je me lance alors dans une mise à jour automatique de Python par l'utilitaire portupgrade, qui permet de remplacer un port par une nouvelle version, tout seul comme un grand. L'installation finie, je relance Zope, et là, surprise, il ne démarre pas... Après un petit moment à me demander pourquoi, je me rends compte qu'il se plante au démarrage... 😕

En fait, Python se plante avec le message Fatal error 'Spinlock called when not threaded.' at line 83 in file /usr/src/lib/libpthread/thread/thr_spinlock.c si je lance Zope. Si je lance un interprèteur Python tout seul, ça va... Mon ami Google m'explique en gros : c'est que le programme (Python) est rattaché à deux bibliothèques proposant des fonctions similaires, et qu'à l'appel d'une fonction particulière, la mauvaise bibliothèque répond et renvoie une erreur (l'explication est nulle, je sais, mais je suis pas assez calé en bibliothèque C et en threads pour tout comprendre... 😕).

La solution du problème réside à trouver le programme défectueux et de le recompiler proprement. Mais voilà, je ne sais pas comment. 🙂 Une solution simple est de recompiler tous les ports par portinstall -fa. -f pour forcer la réinstallation des ports (parce que portinstall ne fait rien si un port est déjà à jour), et -a, pour lui dire de traiter TOUS les ports installés. Et normalement ça se passe bien, parce que portinstall vérifie les dépendances de chaque port et construit un arbre de dépendances pour le suivre pas à pas.

Inutile de dire que c'est long, ça m'a mis 6 heures environ à recompiler 190 ports (en même temps, ma pauvre Annis n'est pas un foudre de guerre...).

Le plus amusant, c'est qu'en fait, je n'avais pas besoin de faire tout ça : ce problème de bibliothèque doit être assez courant, parce qu'il existe un fichier de configuration, /etc/libmap.conf, qui permet de spécifier et de forcer l'utilisation d'une certaine bibliothèque pour un certain programme, ou un groupe de programmes. En forçant donc mon Python à utiliser le libc_r au lieu du libpthread (me demandez pas, je ne sais pas, je crois que ça à voir avec si le programme est threadé ou pas), ça remarche nickel. 🙂

Néanmoins, je me suis tapé la mise à jour de tous mes ports, donc je suis super à jour, complètement bleeding edge. Je ne savais même pas qu'il y avait un Zope 2.7.3 de sorti. 🙂 (hé, je savais même pas qu'il y avait un Zope X3 !)

Enfin bon, je peux enfin aller me coucher l'esprit tranquille, mon serveur remarche. :)