[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
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".

View file

@ -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):
"""