[Oops] J'ai oublié de commiter un de mes débugs.
This commit is contained in:
parent
80929daddd
commit
e18e5222b7
5 changed files with 53 additions and 29 deletions
|
@ -40,20 +40,27 @@ import socket
|
|||
import crans_utils
|
||||
import collections
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
class LdapLockedByYou(exceptions.StandardError):
|
||||
class LockError(exceptions.StandardError):
|
||||
"""
|
||||
Erreur standard de lock
|
||||
"""
|
||||
pass
|
||||
|
||||
class LdapLockedByYou(LockError):
|
||||
"""
|
||||
Classe d'erreur pour les locks par le process courant
|
||||
"""
|
||||
pass
|
||||
|
||||
class LdapLockedByOther(exceptions.StandardError):
|
||||
class LdapLockedByOther(LockError):
|
||||
"""
|
||||
Erreur car le lock est occupé par un autre process.
|
||||
"""
|
||||
pass
|
||||
|
||||
class LockFormatError(exceptions.StandardError):
|
||||
class LockFormatError(LockError):
|
||||
"""
|
||||
L'objet lock qu'on a récupéré n'est pas tel qu'on le voudrait
|
||||
"""
|
||||
|
@ -110,26 +117,29 @@ class LdapLockHolder:
|
|||
Sinon, on ne peut pas override le lock, et on laisse
|
||||
tomber.
|
||||
"""
|
||||
|
||||
try:
|
||||
host, pid = self.getlock(item, value, Id)
|
||||
if host == self.host and pid == self.pid:
|
||||
host, pid, begin = self.getlock(item, value)
|
||||
if time.time() - begin >= 600.0:
|
||||
self.removelock(item, value, Id, True)
|
||||
elif host == self.host and pid == self.pid:
|
||||
raise LdapLockedByYou("La donnée %r=%r est lockée par vous-même." % (item, value))
|
||||
elif host == self.host:
|
||||
status = crans_utils.process_status(pid)
|
||||
if status:
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value))
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée par un processus actif." % (item, value))
|
||||
else:
|
||||
self.removelock(item, value, Id, True)
|
||||
else:
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value))
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée depuis une autre machine." % (item, value))
|
||||
except ldap.NO_SUCH_OBJECT:
|
||||
pass
|
||||
except LockFormatError:
|
||||
self.removelock(item, value, Id)
|
||||
except Exception:
|
||||
raise
|
||||
|
||||
dn = "%s=%s,%s" % (item, value, LOCKS_DN)
|
||||
lockid = "%s-%s" % (self.host, self.pid)
|
||||
lockid = "%s-%s-%s" % (self.host, self.pid, time.time())
|
||||
modlist = ldap.modlist.addModlist({'objectClass' : 'lock',
|
||||
'lockid' : lockid,
|
||||
item : value})
|
||||
|
@ -140,7 +150,7 @@ class LdapLockHolder:
|
|||
except ldap.ALREADY_EXISTS:
|
||||
status = crans_utils.process_status(pid)
|
||||
if status:
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée par quelqu'un d'autre ou un processus." % (item, value))
|
||||
raise LdapLockedByOther("La donnée %r=%r est lockée par un processus actif." % (item, value))
|
||||
else:
|
||||
self.removelock(item, value, Id)
|
||||
try:
|
||||
|
@ -167,18 +177,19 @@ class LdapLockHolder:
|
|||
except:
|
||||
pass
|
||||
|
||||
def getlock(self, item, value, Id):
|
||||
def getlock(self, item, value):
|
||||
"""
|
||||
Trouve le lock item=value, et renvoie le contenu de lockinfo
|
||||
via un couple host, pid
|
||||
via un triplet host, pid, begin
|
||||
"""
|
||||
|
||||
result = self.conn.search_s('%s=%s,%s' % (item, value, LOCKS_DN), 0)
|
||||
if not result:
|
||||
_ = self.locks[Id].pop(item)
|
||||
return None, 0
|
||||
try:
|
||||
host, pid = result[0][1]['lockid'][0].split('-')
|
||||
return host, int(pid)
|
||||
try:
|
||||
host, pid, begin = result[0][1]['lockid'][0].split('-')
|
||||
except:
|
||||
host, pid = result[0][1]['lockid'][0].split('-')
|
||||
begin = time.time()
|
||||
return host, int(pid), float(begin)
|
||||
except:
|
||||
raise LockFormatError
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue