Added convenience APIs for lockutils
The lock_file_prefix for each project doesn't need to be configurable or frequently changed. This patch provides a convenience API which returns a partial object of the synchronized decorator to avoid passing the prefix each time locks are used. The set_defaults method is also provided to change the default value of lock_path when needed. Fixes bug #1065524 Change-Id: I7b67f0a482da4be6d53a70db5bbd22dc91bdc10c
This commit is contained in:
parent
3ebead64a7
commit
e70e9ba566
|
@ -49,6 +49,10 @@ CONF = cfg.CONF
|
||||||
CONF.register_opts(util_opts)
|
CONF.register_opts(util_opts)
|
||||||
|
|
||||||
|
|
||||||
|
def set_defaults(lock_path):
|
||||||
|
cfg.set_defaults(util_opts, lock_path=lock_path)
|
||||||
|
|
||||||
|
|
||||||
class _InterProcessLock(object):
|
class _InterProcessLock(object):
|
||||||
"""Lock implementation which allows multiple locks, working around
|
"""Lock implementation which allows multiple locks, working around
|
||||||
issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does
|
issues like bugs.debian.org/cgi-bin/bugreport.cgi?bug=632857 and does
|
||||||
|
@ -247,3 +251,28 @@ def synchronized(name, lock_file_prefix, external=False, lock_path=None):
|
||||||
return retval
|
return retval
|
||||||
return inner
|
return inner
|
||||||
return wrap
|
return wrap
|
||||||
|
|
||||||
|
|
||||||
|
def synchronized_with_prefix(lock_file_prefix):
|
||||||
|
"""Partial object generator for the synchronization decorator.
|
||||||
|
|
||||||
|
Redefine @synchronized in each project like so::
|
||||||
|
|
||||||
|
(in nova/utils.py)
|
||||||
|
from nova.openstack.common import lockutils
|
||||||
|
|
||||||
|
synchronized = lockutils.synchronized_with_prefix('nova-')
|
||||||
|
|
||||||
|
|
||||||
|
(in nova/foo.py)
|
||||||
|
from nova import utils
|
||||||
|
|
||||||
|
@utils.synchronized('mylock')
|
||||||
|
def bar(self, *args):
|
||||||
|
...
|
||||||
|
|
||||||
|
The lock_file_prefix argument is used to provide lock files on disk with a
|
||||||
|
meaningful prefix. The prefix should end with a hyphen ('-') if specified.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return functools.partial(synchronized, lock_file_prefix=lock_file_prefix)
|
||||||
|
|
|
@ -195,3 +195,19 @@ class LockTestCase(utils.BaseTestCase):
|
||||||
finally:
|
finally:
|
||||||
if os.path.exists(lock_dir):
|
if os.path.exists(lock_dir):
|
||||||
shutil.rmtree(lock_dir, ignore_errors=True)
|
shutil.rmtree(lock_dir, ignore_errors=True)
|
||||||
|
|
||||||
|
def test_synchronized_with_prefix(self):
|
||||||
|
lock_name = 'mylock'
|
||||||
|
lock_pfix = 'mypfix-'
|
||||||
|
|
||||||
|
foo = lockutils.synchronized_with_prefix(lock_pfix)
|
||||||
|
|
||||||
|
@foo(lock_name, external=True)
|
||||||
|
def bar(dirpath, pfix, name):
|
||||||
|
filepath = os.path.join(dirpath, '%s%s' % (pfix, name))
|
||||||
|
return os.path.isfile(filepath)
|
||||||
|
|
||||||
|
lock_dir = tempfile.mkdtemp()
|
||||||
|
self.config(lock_path=lock_dir)
|
||||||
|
|
||||||
|
self.assertTrue(bar(lock_dir, lock_pfix, lock_name))
|
||||||
|
|
Loading…
Reference in New Issue