From 45c3f68635c70c723471a8f2b358e9d038522a03 Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sun, 9 Nov 2014 15:53:10 +0100 Subject: [PATCH] =?UTF-8?q?[objets]=20Correction=20du=20retour=20en=20arri?= =?UTF-8?q?=C3=A8re=20du=20commmit=20629310d3=20sur=20ressucite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On vérifier que l'objet de la base ldap n'avait pas été modifier entre le moment où on l'a récupéré etle moment où on acquière le lock. Bien sûr si l'objet n'existe pas dans la base ldap, il n'y a pas de problème. Dans le cas où on ressucieterai un objet qui existe déjà dans la base ldap, ça planterait sans doute. M'enfin, ce cas doit être extrèmement rare compte tenu du fait que les aid et mid sont croissant (mais hélas, pas strictement). --- objets.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/objets.py b/objets.py index 8b39bfb..277f26a 100644 --- a/objets.py +++ b/objets.py @@ -602,9 +602,13 @@ class CransLdapObject(object): cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2) self.conn.lockholder.addlock("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId) locked.append(("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId)) - # une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps - if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []): - raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr) + try: + # une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps + if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []): + raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr) + # L'objet n'existe pas dans la base ldap (resurection par exemple), donc pas de problème + except ldap.NO_SUCH_OBJECT: + pass except ldap_locks.LockError: # Si on ne parvient pas à prendre le lock pour l'une des valeurs # on libère les locks pris jusque là et on propage l'erreur