From 494cd42d83b773bf1c1463e6656bbc620573d24d Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sat, 8 Nov 2014 18:14:12 +0100 Subject: [PATCH] =?UTF-8?q?[ldap=5Flocks,=20objets]=20Juste=20avant=20d'?= =?UTF-8?q?=C3=A9crire=20dans=20la=20base=20ldap,=20on=20v=C3=A9rifie=20le?= =?UTF-8?q?s=20locks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ils existent toujours et n'ont pas expiré, sinon, il ne faut pas faire l'enregistrement. --- ldap_locks.py | 14 ++++++++++++++ objets.py | 9 ++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) 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): """