Backoff exponentiel pour tenter de robtenir le lock.

darcs-hash:20050322081728-d1718-a0c77f2ee05294f513cab9599ed62dce7f81c97a.gz
This commit is contained in:
bernat 2005-03-22 09:17:28 +01:00
parent 05863023ea
commit d928641f7a

View file

@ -11,12 +11,13 @@ import os,string,time,sys, affich_tools
from commands import getoutput from commands import getoutput
from user_tests import getuser from user_tests import getuser
from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN from fcntl import lockf, LOCK_EX, LOCK_NB, LOCK_UN
import errno import errno, random
def wait_lock(lock_name, lock_comment='', d=None): def wait_lock(lock_name, lock_comment='', d=None, retry=0.2):
"""Attend la disponibilité d'un lock en utilisant le framework Twisted. """Attend la disponibilité d'un lock en utilisant le framework Twisted.
Si d est de type Deferred, on est en mode asynchrone. Si d est de type Deferred, on est en mode asynchrone.
retry permet de réessayer dans `retry' secondes.
""" """
from twisted.internet import reactor, defer from twisted.internet import reactor, defer
try: try:
@ -44,8 +45,9 @@ def wait_lock(lock_name, lock_comment='', d=None):
if not d: if not d:
# On est en mode synchrone, on va passer en asynchrone # On est en mode synchrone, on va passer en asynchrone
d = defer.Deferred() d = defer.Deferred()
# On essaie de nouveau dans 200 ms. # On essaie de nouveau plus tard
reactor.callLater(0.2, wait_lock, lock_name, lock_comment, d) newretry = min(retry * 2, 4) + random.random() * 0.1 * retry
reactor.callLater(retry, wait_lock, lock_name, lock_comment, d, newretry)
return d return d
def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) : def make_lock(lock_name, lock_comment='',nowait=0, quiet=False) :