[ldap_locks, objets] Juste avant d'écrire dans la base ldap, on vérifie les locks

ils existent toujours et n'ont pas expiré, sinon, il ne faut pas faire
l'enregistrement.
This commit is contained in:
Valentin Samir 2014-11-08 18:14:12 +01:00
parent 3a3d51e408
commit 494cd42d83
2 changed files with 20 additions and 3 deletions

View file

@ -47,6 +47,12 @@ class LockError(exceptions.StandardError):
""" """
pass 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): class LdapLockedByYou(LockError):
""" """
Classe d'erreur pour les locks par le process courant 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 # S'il a été libéré, banzai, sinon, ça lèvera une exception
return self.addlock(item, value, Id) 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): def removelock(self, item, value, Id='default', force=False):
""" """
Libère le lock "$item=$value,$LOCKS_DN". Libère le lock "$item=$value,$LOCKS_DN".

View file

@ -369,6 +369,7 @@ class CransLdapObject(object):
modlist = addModlist(ldif) modlist = addModlist(ldif)
# Requête LDAP de création de l'objet # Requête LDAP de création de l'objet
try: try:
self.conn.lockholder.check(self.lockId, delai=10)
self.conn.add_s(self.dn, modlist) self.conn.add_s(self.dn, modlist)
except Exception: except Exception:
print traceback.format_exc() print traceback.format_exc()
@ -414,6 +415,7 @@ class CransLdapObject(object):
if not self.in_context: 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 # 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) 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.bury(comm, login)
self.conn.delete_s(self.dn) self.conn.delete_s(self.dn)
self.conn.lockholder.purge(self.lockId) self.conn.lockholder.purge(self.lockId)
@ -435,13 +437,12 @@ class CransLdapObject(object):
# On récupère la liste des modifications # On récupère la liste des modifications
modlist = self.get_modlist() modlist = self.get_modlist()
try: try:
self.conn.lockholder.check(self.lockId, delai=10)
self.conn.modify_s(self.dn, modlist) self.conn.modify_s(self.dn, modlist)
self.conn.lockholder.purge(self.lockId) self.conn.lockholder.purge(self.lockId)
except Exception as error: except Exception as error:
# On nettoie les locks
self.conn.lockholder.purge(self.lockId)
self.cancel() 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 # On programme le redémarrage des services
services.services_to_restart(self.conn, self.attrs, self._modifs) 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]) 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) self._modifs = attributs.AttrsDict(self.conn, old_uldif, Parent=self)
# On nettoie les locks
self.conn.lockholder.purge(self.lockId)
def check_modifs(self): def check_modifs(self):
""" """