La suppression d'un membre dans un groupe (uniqueMember) est très longue par défaut, sur un groupe qui contient plus de 66 000 entrées :
time ldapmodify -x D bindn -w password-f delMember.ldif delete uniqueMember: uid=USER1,ou=employees,ou=users,ou=example,o=com modifying entry "cn=InternalUsers,ou=groups,ou=example,o=com" modify complete real 6m17.845s user 0m0.088s sys 0m0.112s
Le fichier LDIF utilisé étant le suivant :
dn: cn=InternalUsers,ou=groups,ou=example,o=com changetype: modify delete: uniqueMember uniqueMember: uid=USER1,ou=employees,ou=users,ou=example,o=com
6 minutes pour supprimer une seule entrée de groupe, autant dire que cela devient vite inacceptable lorsque l'on utilise un produit de gestion d'identité qui réalise des suppressions en masse...
Ceci peut être amélioré en ajoutant le paramètre olcSortVals dans la configuration de l'annuaire OpenLDAP.
Comme l'indique le manpage du fichier slapd.conf :
sortvals[...] Specify a list of multi-valued attributes whose values will always be maintained in sorted order. Using this option will allow Modify, Compare, and filter evaluations on these attributes to be performed more efficiently. The resulting sort order depends on the attributes' syntax and matching rules and may not correspond to lexical order or any other recognizable order.
La modification peut se faire soit en dynamique, via un fichier LDIF :
dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcSortVals olcSortVals: uniqueMember
On peut aussi arrêter le service slapd, modifier le fichier /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
, et ajouter la ligne :
olcSortVals: uniqueMember
On teste ensuite sur un autre membre :
time ldapmodify -x D bindn -w password-f delMember.ldif delete uniqueMember: uid=USER2,ou=employees,ou=users,ou=example,o=com modifying entry "cn=InternalUsers,ou=groups,ou=example,o=com" modify complete real 0m0.855s user 0m0.004s sys 0m0.004s
Le gain est impressionnant (/400), et on limite également les messages de type bdb_idl_delete_key: c_get failed: DB_LOCK_DEADLOCK: Locker killed to resolve a deadlock (-30994) que l'on avait auparavant, du fait des longues transactions.
On peut ajouter plusieurs valeurs d'attributs, de la manière suivante :
olcSortVals: uniqueMember member
Clément Oudot en parle sur son blog Linagora :
Astuce OpenLDAP-groupes-dynamiques