[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:
parent
3a3d51e408
commit
494cd42d83
2 changed files with 20 additions and 3 deletions
|
@ -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".
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue