Finalement, la petite seconde intercalaire du week-end dernier n’est pas passée si inaperçue que cela, elle a même provoqué le crash de plusieurs serveurs Linux…
On trouve des explications détaillées sur de nombreux sites (par exemple un article de LWN). En résumé : le code interne du kernel (dans linux/kernel/time/ntp.c
) qui a ramené en arrière l’heure système d’une seconde (afin d’ignorer la seconde écoulée dans l’heure Unix standard) a « oublié » de notifier les High Resolution Timers en invoquant une routine nommée clock_was_set()
de linux/kernel/hrtimer.c
.
Certains timers préalalement programmés ce sont donc déclenché plus tôt que prévu et reprogrammés pour un déclenchement qui se produit instantanément et ainsi de suite.
Au lieu de réaliser des tâches périodiquement – par exemple tous les centièmes de seconde – le noyau Linux les déclenchait en boucle hystérique, gelant le système et tout l’espace utilisateur.
Ce bug (l’oubli de notifier les HR Timers lorsqu’on recule l’heure système à cause d’une seconde intercalaire) est très difficile à détecter puisque les conditions ne se présentent qu’une fois tous les deux ou trois ans – la dernière seconde intercalaire remonte au 31/12/2008 – et pose un problème général de validation du code de Linux face au traitement des événements rares.
Certains posent la question de la suppression des secondes intercalaires, d’autres d’utiliser une référence de temps atomiques TAI. Je vous conseille la lecture de l’article de Stéphane Bortzmeyer à ce sujet.