[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: glibc, bug 438179 et avenir de/dans etch



Bonjour,

Le 26.09.2007 19:16, Pierre Habouzit a écrit  :
>   Je ne sais pas quelles sont les conditions d'utilisation du programme,
> donc il est difficile de valider quoi que ce soit. Il y a mille raisons
> pour lesquelles ça a l'air d'être trié (nscd notamment). Mais:
>
>   (1) la rule 9 est à propos des plus longs préfixes, or vu que la
>       différence entre 165 et 166 est uniquement sur les deux derniers
>       bits, le test est tout simplement idiot.

Mon test est probablement idiot, mais il met en évidence un comportement que
j'ai sur plusieurs dizaines de serveurs et que j'essaye tant bien que mal de
comprendre depuis plusieurs jours. Avant de venir passer pour un âne sur une
liste debian-devel archivée sur internet (ce qui n'était pas franchement mon
rêve je dois bien te l'avouer ;-) ), j'ai parlé du problème à un ami qui a pu le
reproduire sur ses propres serveurs en Debian etch.

Le rapprochement entre mon problème et le bug  438179 est peut-être malheureux.
Néanmoins, j'ai un problème, qui touche la glibc de Etch, qui n'est apparemment
pas si isolé que cela puisque nous sommes au minimum deux à l'avoir.

Peut-être est-il lié à l'environnement (matériel, logiciel, ou réseau) mais je
dois bien avouer que je suis à cours de piste. Par ailleurs, en patchant la
glibc 2.3.6 au niveau de la règle 9 (voir plus bas), je n'ai plus le problème.

Si je refais le test sur la glibc de Etch avec le petit programme du mail
précédent et en arrêtant le plus de démons possibles (voir fichier ps-ed.txt
joint) :
$ cat /etc/debian_version
4.0

$ dpkg -l "libc6*" |grep ^i
ii  libc6           2.3.6.ds1-13etch2 GNU C Library: Shared libraries

Avec getaddrinfo :
$  ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$  ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$  ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$  ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166

Avec gethostbyname :
$  ./reso-dns ldaprs.mon.domaine gethostbyname
gethostbyname : ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$  ./reso-dns ldaprs.mon.domaine gethostbyname
gethostbyname : ldaprs.mon.domaine   10.xxx.yyy.166  10.xxx.yyy.165
$  ./reso-dns ldaprs.mon.domaine gethostbyname
gethostbyname : ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$  ./reso-dns ldaprs.mon.domaine gethostbyname
gethostbyname : ldaprs.mon.domaine   10.xxx.yyy.166  10.xxx.yyy.165

Non seulement, il y a un tri, mais en plus sur des adresses proches...

De plus si j'applique ce patch à la glibc 2.3.6 [1], je n'ai plus le problème :
--- glibc-backup/sysdeps/posix/getaddrinfo.c	2005-10-16 12:15:30.000000000 +0200
+++ glibc-2.3.6/sysdeps/posix/getaddrinfo.c	2007-09-25 11:29:46.000000000 +0200
@@ -1392,7 +1392,7 @@
       int bit1 = 0;
       int bit2 = 0;

-      if (a1->dest_addr->ai_family == PF_INET)
+      if (a1->dest_addr->ai_family == PF_INET && 0)
 	{
 	  assert (a1->source_addr.ss_family == PF_INET);
 	  assert (a2->source_addr.ss_family == PF_INET);


Or ce patch s'applique pile ici dans la fonction getaddrinfo de la glibc 2.3.6 :
  /* Rule 9: Use longest matching prefix.  */
  if (a1->got_source_addr
      && a1->dest_addr->ai_family == a2->dest_addr->ai_family)
    {
      int bit1 = 0;
      int bit2 = 0;

      if (a1->dest_addr->ai_family == PF_INET)
	{
	  assert (a1->source_addr.ss_family == PF_INET);
	  assert (a2->source_addr.ss_family == PF_INET);

[1] méthode utilisée pour appliquer le patch :
- dans l'archive debian  de la glibc-2.3.6, création d'un fichier
"debian/patches/any/patch-sortv4.diff" avec ce patch.
- ajout de "any/patch-sortv4.diff -p 1" à la suite des "any/" dans le fichier
"debian/patches/series"

Voici les tests des getaddrinfo avec la glibc patchée :
$ ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$ ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.166  10.xxx.yyy.165
$ ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.165  10.xxx.yyy.166
$ ./reso-dns ldaprs.mon.domaine getaddrinfo
getaddrinfo :   ldaprs.mon.domaine   10.xxx.yyy.166  10.xxx.yyy.165

Je suis prêt à faire d'autre test si cela peut aider.

Cordialement,
Julien
$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Sep04 ?        00:00:01 init [2]
root         2     1  0 Sep04 ?        00:00:00 [migration/0]
root         3     1  0 Sep04 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 Sep04 ?        00:00:00 [migration/1]
root         5     1  0 Sep04 ?        00:00:00 [ksoftirqd/1]
root         6     1  0 Sep04 ?        00:00:00 [events/0]
root         7     1  0 Sep04 ?        00:00:00 [events/1]
root         8     1  0 Sep04 ?        00:00:00 [khelper]
root         9     1  0 Sep04 ?        00:00:00 [kthread]
root        13     9  0 Sep04 ?        00:00:00 [kblockd/0]
root        14     9  0 Sep04 ?        00:00:00 [kblockd/1]
root        15     9  0 Sep04 ?        00:00:00 [kacpid]
root       126     9  0 Sep04 ?        00:00:00 [kseriod]
root       168     9  0 Sep04 ?        00:00:00 [pdflush]
root       169     9  0 Sep04 ?        00:00:00 [pdflush]
root       170     9  0 Sep04 ?        00:00:00 [kswapd0]
root       171     9  0 Sep04 ?        00:00:00 [aio/0]
root       172     9  0 Sep04 ?        00:00:00 [aio/1]
root       328     1  0 Sep04 ?        00:00:00 [kirqd]
root       663     9  0 Sep04 ?        00:00:00 [khubd]
root       794     9  0 Sep04 ?        00:00:00 [scsi_eh_0]
root       810     9  0 Sep04 ?        00:00:00 [scsi_eh_1]
root       910     9  0 Sep04 ?        00:00:00 [scsi_eh_2]
root      1163     9  0 Sep04 ?        00:00:00 [kjournald]
root      1333     1  0 Sep04 ?        00:00:00 udevd --daemon
root      1690     9  0 Sep04 ?        00:00:00 [kpsmoused]
root      1699     9  0 Sep04 ?        00:00:00 [kedac]
root      1918     9  0 Sep04 ?        00:00:00 [kmirrord]
root      1951     9  0 Sep04 ?        00:00:00 [kjournald]
root      1953     9  0 Sep04 ?        00:00:00 [kjournald]
root      1955     9  0 Sep04 ?        00:00:00 [kjournald]
root      1957     9  0 Sep04 ?        00:00:01 [kjournald]
root      2171     1  0 Sep04 ?        00:00:00 /sbin/syslogd
root      2177     1  0 Sep04 ?        00:00:00 /sbin/klogd -x
root      2323     1  0 Sep04 ?        00:00:00 /usr/sbin/sshd
root      2446     1  0 Sep04 tty1     00:00:00 /sbin/getty 38400 tty1
root      2451     1  0 Sep04 tty2     00:00:00 /sbin/getty 38400 tty2
root      2452     1  0 Sep04 tty3     00:00:00 /sbin/getty 38400 tty3
root      2453     1  0 Sep04 tty4     00:00:00 /sbin/getty 38400 tty4
root      2454     1  0 Sep04 tty5     00:00:00 /sbin/getty 38400 tty5
root      2455     1  0 Sep04 tty6     00:00:00 /sbin/getty 38400 tty6
root     29455  2323  0 08:38 ?        00:00:00 sshd: admin [priv]
admin    29457 29455  0 08:38 ?        00:00:00 sshd: admin@pts/0
admin    29458 29457  0 08:38 pts/0    00:00:00 -bash
admin    30234 29458  0 11:48 pts/0    00:00:00 ps -ef

Reply to: