[lc_ldap._find_id] On essaye de cacher le dernier id connu et de ne récupérer que les id plus grand

C'est beaucoup plus rapide que récupérer tous les mid ou tous les aid.
BEAUCOUP !!!!
plus de détails dans les commentaires du code.
This commit is contained in:
Valentin Samir 2014-02-24 11:34:27 +01:00
parent 68587e3ebb
commit 68c86e7e00

View file

@ -36,6 +36,7 @@
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## import de la lib standard ## import de la lib standard
import os
import sys import sys
import re import re
@ -388,9 +389,28 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
def _find_id(self, attr, realm=None): def _find_id(self, attr, realm=None):
'''Trouve un id libre. Si une plage est fournie, cherche '''Trouve un id libre. Si une plage est fournie, cherche
l'id dans celle-ci, sinon, prend le plus élevé possible.''' l'id dans celle-ci, sinon, prend le plus élevé possible.'''
# On essaye de récupérer le dernier id si on l'a déjà vu passé
try:
last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip()
except IOError:
last_id = 0
# On récupère tous les id plus grand que le dernier que l'on connait
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s>=%s' % (attr, last_id), attrlist = [attr])
# Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent)
if res == []:
res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr]) res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr])
# On extrait seulement les valeurs des id qui nous intêressent
nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ]
# On trie pour récupérer le dernier
nonfree.sort() nonfree.sort()
try:
last_id = nonfree[-1]
except IndexError:
last_id = 0
# On écrit le nouveau dernier id connu
f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600)
os.write(f, str(last_id))
os.close(f)
plage = None plage = None
# On récupère la plage des mids # On récupère la plage des mids
@ -417,10 +437,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' % raise EnvironmentError('Aucun %s libre dans la plage [%d, %d]' %
(attr, plage[0], i)) (attr, plage[0], i))
else: else:
try: i = last_id + 1
i = nonfree[-1] + 1
except IndexError:
i = 1
while True: while True:
try: try:
self.lockholder.addlock(attr, str(i)) self.lockholder.addlock(attr, str(i))