diff --git a/ldap_locks.py b/ldap_locks.py index 161a2a2..aca3bbc 100644 --- a/ldap_locks.py +++ b/ldap_locks.py @@ -47,6 +47,12 @@ class LockError(exceptions.StandardError): """ pass +class LockExpired(LockError): + """ + Classe d'erreur pour les locks non libéré avant + la durée d'expiration du lock + """ + pass class LdapLockedByYou(LockError): """ Classe d'erreur pour les locks par le process courant @@ -164,6 +170,14 @@ class LdapLockHolder: # S'il a été libéré, banzai, sinon, ça lèvera une exception return self.addlock(item, value, Id) + def check(self, Id='default', delai=0): + """Vérifie que l'on a toujours tous nos locks""" + for item, value in self.locks[Id]: + host, pid, begin = self.getlock(item, value) + time_left = self.timeout - (time.time() - begin) + if time_left <= delai: + raise LockExpired("Le lock sur la donnée %r=%r à expiré" % (item, value, time_left)) + def removelock(self, item, value, Id='default', force=False): """ Libère le lock "$item=$value,$LOCKS_DN". diff --git a/objets.py b/objets.py index 64295bc..08628db 100644 --- a/objets.py +++ b/objets.py @@ -369,6 +369,7 @@ class CransLdapObject(object): modlist = addModlist(ldif) # Requête LDAP de création de l'objet try: + self.conn.lockholder.check(self.lockId, delai=10) self.conn.add_s(self.dn, modlist) except Exception: print traceback.format_exc() @@ -414,6 +415,7 @@ class CransLdapObject(object): if not self.in_context: # forcer l'utilisation d'un context manager permet d'être certain que les locks seront libéré quoi qu'il arrive cranslib.deprecated.usage("La suppression d'un objet ne devrait être faite qu'avec des contexts managers (with func() as variable)", level=2) + self.conn.lockholder.check(self.lockId, delai=10) self.bury(comm, login) self.conn.delete_s(self.dn) self.conn.lockholder.purge(self.lockId) @@ -435,13 +437,12 @@ class CransLdapObject(object): # On récupère la liste des modifications modlist = self.get_modlist() try: + self.conn.lockholder.check(self.lockId, delai=10) self.conn.modify_s(self.dn, modlist) self.conn.lockholder.purge(self.lockId) except Exception as error: - # On nettoie les locks - self.conn.lockholder.purge(self.lockId) self.cancel() - raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ? %r" % error) + raise EnvironmentError("Impossible de modifier l'objet: %r" % error) # On programme le redémarrage des services services.services_to_restart(self.conn, self.attrs, self._modifs) @@ -455,6 +456,8 @@ class CransLdapObject(object): """ old_uldif = lc_ldap.ldif_to_uldif(self.conn.search_s(self.dn, ldap.SCOPE_BASE)[0][1]) self._modifs = attributs.AttrsDict(self.conn, old_uldif, Parent=self) + # On nettoie les locks + self.conn.lockholder.purge(self.lockId) def check_modifs(self): """