Archive pour le mot-clef ‘Développement’

Splitting and shrinking a git repository

Lundi 2 août 2010

I have recently faced the challenge to rewrite a git repository. It has two problems:

  • First problem was small: an user has commited with a badly setup git and E-mail as well as username were not correctly set.
  • Second problem seems more tricky: I was needing to split the git repository in two different one. To be precise on that issue, from the two directories at root (src and deps) have to become the root of their own repository.

I then dig into the doc and it leads me directly to ‘filter-branch’ which was the solution of my two problems. The names of the command is almost self-explanatory: it is used to rewrite branches.

Splitting the git repository

A rapid reading of ‘git help filter-branch’ convince me to give a try to the ‘subdirectory-filter’ subcommand:

--subdirectory-filter

Only look at the history which touches the given subdirectory. The result will contain that directory (and only that) as its project root. Implies
--remap-to-ancestor

Thus to split the directory, I have simply to copy my repository via a clone call and run the filter command:

git clone project project-src
cd project-src
git filter-branch --subdirectory-filter src

Doing once again for the deps directory and I had my two new repositories ready to go.

At once during this cleaning task, I wanted to avoid to loose my directory structure. I mean I want to keep the ‘src’ directory in the ‘src’ repository. Thanks to the examples at the end of ‘git help filter-branch’, I’ve found this trickier command:

git filter-branch --prune-empty --index-filter \\
 'git rm -r --cached --ignore-unmatch deps' HEAD

This literally do the following : for each commit (--index-filter), suppress (rm) recursively (-r) all items of the ‘deps’ directory. If a commit is empty then suppress it from history (--prune-empty).

Shrinking the resulting repository

‘deps’ directory was known to take a lot of disk space and I thus done a check to see the size of the ‘src’ directory. My old friend ‘du’ sadly told me that the split repository has the same size as the whole one ! There is something tricky here. After googling a little bi I’ve found out (mainly by reading Luke Palmer post) that git never destroy immediately a commit. It is always present has an object in the .git/objects directory. To ask for an effective suppression, you’ve got to tell git that some objects are expired and can now be destroyed. The following command will destroy all objects unreachable since more than one day:

git gc --aggressive --prune=1day

Unreachable objects means objects that exist but that aren’t readable from any of the reference nodes. This last definition is taken from ‘git help fsck’. The ‘fsck’ command can be used to check the validity
and connectivity of objects in the database. For example to display unreachable object, you can run:

git fsck --unreachable

Fixing commiter name

My problem on badly authored commits was still remaining. From the documentation, --env-filter subcommand was the one I need to use. The idea of the command is that it will iterate on every commit of the branch giving you some environnement variables:

GIT_COMMITTER_NAME=Eric Leblond
GIT_AUTHOR_EMAIL=eleblond@example.com
GIT_COMMIT=fbf7d74174bf4097fe5b0ec559426232c5f7b540
GIT_DIR=/home/regit/git/oisf/.git
GIT_AUTHOR_DATE=1280686086 +0200
GIT_AUTHOR_NAME=Eric Leblond
GIT_COMMITTER_EMAIL=eleblond@example.com
GIT_INDEX_FILE=/home/regit/git/oisf/.git-rewrite/t/../index
GIT_COMMITTER_DATE=1280686086 +0200
GIT_WORK_TREE=.

If you modify one of them and export the result, the commit will be modifed accordingly. For example, my problem was that commit
from ‘jdoe’ are in fact from ‘John Doe’ which mail is ‘john.doe@example.com’. I thus run the following command:

git filter-branch -f --env-filter '
if [ "${GIT_AUTHOR_NAME}" = "jdoe" ]; then
GIT_AUTHOR_EMAIL=john.doe@example.com;
GIT_AUTHOR_NAME="John Doe";
fi
export GIT_AUTHOR_NAME
export GIT_AUTHOR_EMAIL
'

Git show here once again it has been made by semi-god hackers that have developped it to solve their own source management problems.

En route vers le 2.6.30 et encore merci Denis

Vendredi 3 avril 2009

Oui, bon, vous savez sans doute que le noyau Linux 2.6.30 est en cours de réalisation. Mais saviez-vous que grâce à l’excellent Denis Bodor toute une série de patchs a été incorporée au noyau ?

Lors de la rédaction du Hors Série Netfilter de GLMF, j’ai, avec tous les autres rédacteurs (Gwenael, Haypo, Pollux et Toady), voulu faire découvrir les dernières avancées de Netfilter. Et, forcément, lorsque l’on est sur le fil du rasoir et que l’on pousse les choses à fond pour être le plus précis possible, il arrive que l’on découvre des problèmes ou des choses pas aussi pratiques que on le désirerait.

J’ai donc réalisé une série de patchs pour améliorer l’expérience des lecteurs de ce splendide Hors Série Netfilter :

GLMF Hors série n°41

Merci donc à Denis pour nous avoir fait confiance pour ces articles et merci à Patrick McHardy d’avoir accepté mes patchs.

Mon bureau en mode noyau

Vendredi 3 avril 2009

Non, non, vous ne verrez pas dans cet article de screenshots du noyau ! J’ai juste envie de poster ici une capture d’écrans que j’ai réalisée et commentée il y a quelque temps. J’étais à ce moment-là en train de réaliser un des mes développements noyau les plus conséquents et cela m’avait conduit à industrialiser mon environnement de travail pour effectuer développements et tests de la manière la plus efficace possible.

Voici donc la capture :

Espace de travail

La résolution est assez élévée puisque mon bureau est constitué d’un écran 19 » et d’un 22 » placés côte à côte en mode twinview.

Le 22 pouces me permet d’utiliser confortablement un gvim ouvert sur 2 colonnes. Je peux ainsi éditer un fichier en lisant la documentation, ou bien comparer deux fichiers facilement. Sur le 19 pouces de gauche, j’ai fait tourner :

  • le shell pour la compilation du noyau
  • virtualbox pour les tests de modification noyau sans les reboot de machine physique
  • giggle pour l’analyse du patchset en cours de préparation

Je pouvais ainsi étudier les crashs ou les problèmes noyaux tout en lisant le code pour trouver mes erreurs.

Contribution au libre, 2009 commence fort.

Mercredi 14 janvier 2009

Du côté de mes contributions au logiciel libre, l’année 2009 commence assez fort. Il semble que j’ai réussi à déclencher une petite révolution.

Le système de test de NuFW avait mis en évidence un crash rare, non reproductible facilement dans nuauth, le serveur d’authentification de NuFW. Les sorties de gdb ou valgrind révélaient un problème absurde dans la bibliothèque cyrus-sasl. NuFW l’utilise pour réaliser la phase d’authentification des utilisateurs. Le crash apparaissait lors d’un appel à sasl_dispose() qui est la fonction à appeler lorsque l’on a terminé la phase d’authentification. Après maintes vérifications et plusieurs dizaines d’heures de debug, j’étais convaincu que nuauth, le serveur d’authentification de NuFW, utilisait la bibliothèque de manière correcte et que le code environnant était correct.

Lorsque l’utilisation d’une bibliothèque est légitime et que l’on obtient un plantage, c’est que l’on a trouvé un bug. J’ai donc alors commencé à enquêter sur Cyrus-sasl. Cette bibliothèque est développée dans le cadre du projet cyrus (serveur de mail imap) par la Carnegie Mellon University. Elle est utilisée par un nombre conséquent de logiciels libres fameux (dont openldap, sendmail). Même si sendmail a une réputation sulfureuse de sécurité, il est connu pour sa stabilité. Et donc, en me lançant dans le debug de ce problème début septembre 2008, je savais que je m’attaquais à quelque chose de robuste car très utilisé. Le bug allait donc être complexe à trouver.

J’enchainais alors des séances de deboguage plus ou moins longues passant à certain moment plusieurs longues journées de travail (lire 14 ou 15 heures) sur ce problème. Je sortais tout de même victorieux de la confrontation et le 20 septembre 2008, j’envoyais un message à la liste de diffusion cyrus-sasl : [PATCH] Fix problem with sasl_set_mutex

NuFW utilise les bibliothèques cyrus-sasl et libldap_r et libldap_r utilise lui aussi cyrus-sasl. Elle s’en sert lors de la phase d’authentification sur la base LDAP. Comme, et libldap_r et NuFW sont multithreadés ou multithreadable, ils initient tous les deux la bibliothèque cyrus-sasl pour le support des threads. Il y a notamment un appel à sasl_set_mutex() qui définit l’implémentation de mutex à utiliser. NuFW appelle cette fonction avec ses propres paramètres et libldap_r fait de même (même lorsque l’on fait un bind simple, les connaisseurs apprécieront). Or sasl_set_mutex() ne détectait pas qu’une initilisation avait déjà été faite. On avait donc un conflit possible. Les fonctions de mutex sasl prennent des paramètres void* en entrée et travaille sur ces pointeurs. Il y donc potentiellement des casts dangereux.

Dans le cas de NuFW, le problème était beaucoup plus radical. L’initialisation de libldap_r se fait lors du chargement du module ldap de nuauth. Par conséquent, c’est la fonction ldap qui est utilisée après chargement du module. Or, nuauth peut changer de configuration et donc de modules à chaud. Il réalise notamment un déchargement des modules. Or, cela ne met pas à jour la fonction mutex de sasl qui appelle donc une fonction déchargée. Ceci conduit immanquablement au crash. Cette fonctionnalité de modification de configuration à chaud est massivement utilisé dans le système de tests de NuFW et c’est donc pour cette raison que le crash ne se produisait qu’à cet endroit.

J’aurais du déboguer plus rapidement ce problème. La piste que j’aurais du voir plus tôt était l’utilisation de fonctions stockées à des emplacements mémoires non valides. Cette information était donnée par gdb et j’aurais du lui faire d’avantage confiance.

Ma remontée de bug et mon patch ont rapidement été pris au sérieux et un patch implémentant mon idée a été commité dans les sources : Fixed sasl_set_mutex() to disallow changing mutex management functions once sasl_server_init/sasl_client_init is called

J’étais content de voir ce correctif appliqué, mais vu la criticité pour NuFW, j’aurais été satisfait de voir arriver une nouvelle version de cyrus-sasl fixant ce bug. Le problème étant déclenché par une utilisation précise de la bibliothèque, je n’étais pas en droit de remonter mon exigence. De plus, la dernière version de cyrus-sasl date du 19 mai 2006 et je me doutais donc que je n’allais pas être entendu.

Début janvier, un mail envoyé sur la liste a pointé le fait que le bug était reproductible en utilisant le stockage des mots de passe sasl dans ldap : En utilisant lui aussi la bibliothèque libldap_r cyrus-sasl se mordait la queue. Le bug était donc aussi interne à cyrus-sasl. Fort de cette conclusion, j’envoyais une réponse au message signalant le problème :

This made the bug self contained and not dependant of other applications. Given the fact that the effect of this bug is a crash of the calling program, it could be interesting to release a new version of the sasl library. (my 0.02$)

J’avais ainsi osé demandé une nouvelle version sur un logiciel où je n’avais pas écrit une ligne de code. À ma surprise, cela s’est conclu par ce message :  Next release of CMU SASL – call for favorite bugfixes où un membre de l’équipe de développement annonce l’arrivée probable, aux alentours du 15 février, d’une nouvelle version de la bibliothèque et demande quels sont les corrections de bugs que les utilisateurs voudraient voir figurer dans cette version.

Je commence donc l’année 2009, en réussissant à déclencher la sortie d’une nouvelle version d’une bibliothèque qui n’avait pas eu de nouvelles versions depuis près de trois ans !

Je conclus ce poste en plagiant pollux et en revoyant mes objectifs de contributions à la hausse pour l’an prochain :

En 2010, je déclenche une sortie de Debian.

Journée utilisateurs du Netfilter Workshop

Mercredi 3 septembre 2008

La journée utilisateurs du Netfilter Workshop aura lieu à Paris le 29 septembre 2008. Cette journée prendra la forme d’une série de conférences sur Netfilter. Les sujets seront variés allant de la description de l’utilisation de Netfilter chez un ISP dannois à la présentation par David Miller (maiteneur de la couche réseau de Linux) ou Patrick McHardy (Leader du projet Netfilter) de leurs derniers développements.

Je donnerai d’ailleurs lors de cette journée une conférence sur ulogd2, la nouvelle infrastructure de journalisation de Netfilter.

L’événement aura lieu dans les locaux de l’ESIEA dans le 13ème arrondissement de Paris. L’accès est libre et une inscription est demandée.

Fatiguant de gérer son pare-feu

Vendredi 25 avril 2008

Jusqu’ici la gestion de pare-feu c’était difficille, il fallait gratter gratter :

À partir de lundi, ça sera facile et amusant :

Plus d’informations à venir très bientôt ! Les abonnés de la liste Netfilter seront les premiers avertis ;)

L’art du commit

Mercredi 5 décembre 2007

Lors du Netfilter Workshop 2007, j’ai eu le plaisir de revoir Patrick McHardy et la chance de rencontrer David Miller (Davem) le mainteneur de la couche réseau de Linux.

Patrick envoie assez souvent des séries de patchs impressionnantes à Davem pour demander leur intégration dans le noyau officiel. L’ensemble des contributions des développeurs de Netfilter qui est ainsi transféré lors de ces envois.

Lors d’un des repas, j’ai cité à Davem l’un des plus gros envois de Patrick et je lui ai demandé ce qu’il ressentait lorsqu’il recevait une telle série de patchs. Sa réponse a été rapide :

Je sais que ma journée est finie

Son sourire en disant cela m’avait marqué et je viens de le comprendre en lisant le dernier envoi de Patrick.

Le premier mail de la série est intitulé :

[NETFILTER 00/49]: Netfilter update

Il comporte notamment une série impressionnante de 35 patchs de la main de Patrick. Parmi ceux-ci un gros travail effectué sur nfnetlink_queue, sujet dont je m’occupe particulièrement. J’ai donc relu l’ensemble des patchs pour voir de quoi il en retournait.

Le découpage des patchs est minutieux, chacun est la réponse à un objectif simple clairement précisé dans l’en-tête du mail. Si l’explication n’est pas suffisante, celle-ci est complété par un texte plus long qui avance les raisons des modifications. Prenons par exemple le patch 46. Le mail correspondant commence par :

[NETFILTER]: nfnetlink_queue: remove useless enqueue status codes

The queueing core doesn’t care about the exact return value from
the queue handler, so there’s no need to go through the trouble
of returning a meaningful value as long as we indicate an error.

Le sujet avance l’idée globale et le paragraphe suivant explique clairement les motivations. Comme le patch comporte uniquement cette modification, il est facile de le lire pour comprendre comment cela a été fait et si cela l’a été bien.

Je comprends donc bien le sourire de Davem, travailler avec quelqu’un comme Patrick McHardy est un régal. Un exemple à montrer dans toutes les écoles.

MacOS X, la grande salade

Vendredi 12 mai 2006

Je viens de passer ma journée à travailler sur Mac OS X à la finalisation du client pour NuFW. Comme d’habitude avec ce système d’exploitation cela a été une drôle de journée.

Ce mélange entre puissance d’Unix et expérience end-user est vraiment déroutant. J’en ai encore fait les frais en utilisant le logiciel Platypus. Ce logiciel très pratique permet de générer un script exécutable. Tiens d’ailleurs, le principe en soi est bizarre sous Unix.

Je disais donc, qu’en utilisant Platypus (ornythorynque pour les francophones) j’ai mis très longtemps à comprendre que le seul moyen de changer l’icone était de déposer une autre icone au dessus de celle présenté sur la page du logiciel. Je n’ai pas percuté sur ce point mais venant d’éditer un script shell, il ne me semblait pas intuitif de procéder de la sorte.

MacOS X, un grand mélange vous disais-je, un peu comme l’ornithorynque…

La Commission Européenne l’affirme : La « documentation » Microsoft est atroce

Mardi 27 décembre 2005

J’ai très souvent et notamment sur ces pages décrié la documentation fournie par Microsoft. Malgrè un effort d’impartialité certain quant aux impressions que je livrais alors, une partie de moi se demandait si mon analyse n’était pas entachée par mon addiction à GNU/Linux.

Que nenni, la commission européenne menace Microsoft de sanctions car la documentation fournie ne suffit toujours pas à assurer l’intéropérabilité notamment pour le développement de services. Le commissaire chargé de l’affaire est assez direct :

« Overall, the process of using the documentation is an absolutely frustrating, time-consuming and ultimately fruitless task »

Un traduction de cette phrase est :

« Globalement, le fait d’utiliser cette documentation est totalement frustrant, gaspilleur de temps et complètement vain »

Lorsque j’ai vu ces lignes sur la première page du Financial Times, j’ai difficilement résisté à l’envie de fredonner l’Hymme à la joie ;-)

Pauvreté sémantique et misère sexuelle sous Windows

Jeudi 15 décembre 2005

Il semble rééllement que l’heuristique microsoftienne consiste à se limiter au premier aspect des choses sans chercher à aller au delà. L’exemple de code suivant est très révélateur. Le code POSIX :

pthread_t* checkthread;
pthread_mutex_t * mutex;
pthread_cond_t *check_cond;

devient

HANDLE checkthread;
HANDLE mutex;
HANDLE check_cond;

Là où POSIX mets du sens, on se trouve sous Windows face à un vulgaire « manipulateur ». Pour en revenir à un équivalent sexuel, on passe d’un « Quelles positions aujourd’hui chérie ? » à « On baise ? ».