Criticité d'un bug pour slapd ?
Bonjour et bonne année,
Tout d'abord, je tiens à m'excuser si je ne poste pas sur la bonne
liste, j'ai pensé que des DD seraient plus a même de me répondre.
Sur une testing avec slapd 2.1.30-3 (annuaire de 80000 entrées environ,
tester avec des bases bdb ou ldbm) : suite à un problème [1], j'ai mis
en évidence par un petit script perl (ci-joint) que des requetes ldap
asynchrones font planter slapd sans traces dans les logs (le nombre de
requetes nécessaire peut varier de 10 à 80000). Un ami a reproduit le
problème sur son serveur openldap (8000 entrées environ).
Sur un openldap 2.2.18 recompilé par mes soins (avec une base bdb et l'
annuaire reimporté via slapadd), le serveur n'avait pas planté au bout
de 6.5 millions de requetes asynchrones.
Etant donné que le problème semble corrigé dans une version récente
d'openldap, je pensais faire un rapport de bug sur le paquet slapd
plutot qu'upstream.
Je me posais la question de la criticité d'un tel bug. J'aurais tendance
à penser que c'est critique : serveur qui s'arrête sans raison.
Qu'en pensez-vous ?
[1] Pour la petite histoire, j'ai des problèmes de serveur openldap qui
s'arrête sans raison sans aucune trace dans les logs (ni sans raison
apparente en mode debug). Après avoir isolé les types d'applications
interrogeant ce serveur ldap, il s'avère que c'est la complétion
automatique de Thunderbird, qui fonctionne par requetes asynchrones, qui
fait planter slapd. J'ai donc fait un script perl réalisant des
requetes asynchrones pour vérifier cette théorie.
Julien COMBES
#! /usr/bin/perl
use strict;
use Net::LDAP;
if(scalar(@ARGV)!=1)
{ die( "ldapasync.pl <nom serveur ldap>\n") }
my($i, $j, $filtre, $mesg);
my $serveurldap = $ARGV[0];
my $ldap = Net::LDAP->new($serveurldap, async => 1) or die "$@";
sub construct_filter
{
my($i, $nb_lettres, $lettres);
srand;
$lettres="";
$nb_lettres=int(rand 5)+1;
for($i=0; $i<=$nb_lettres; $i++)
{
$lettres=$lettres.sprintf "%c", int(rand 26)+97;
}
return $lettres;
}
$ldap->bind;
for($i=0; $i<1000000000; $i++)
{
$filtre="cn=".construct_filter()."*";
print $i."-".$filtre."\n";
$mesg=$ldap->search( filter => $filtre, sizelimit => 20, timelimit => 5, attrs => ['mail'] );
$ldap->abandon( $mesg );
}
Reply to: