Skip to content
Snippets Groups Projects
Commit 806e20fd authored by Guido Trotter's avatar Guido Trotter
Browse files

LockSet: encapsulate acquire() in try-except

This patch adds a try/except area around most of the acquire() code (everything
after the intial condition checks). Since the except: clause contains just a
'raise' nothing really changes except the indentation of the code.

This is done in a separate commit to insulate and make clearer what the real
code changes done in the upcoming patch are.

Reviewed-by: imsnah
parent 0cf257c5
No related branches found
No related tags found
No related merge requests found
...@@ -372,49 +372,53 @@ class LockSet: ...@@ -372,49 +372,53 @@ class LockSet:
# Check we don't already own locks at this level # Check we don't already own locks at this level
assert not self._is_owned(), "Cannot acquire locks in the same set twice" assert not self._is_owned(), "Cannot acquire locks in the same set twice"
# Support passing in a single resource to acquire rather than many try:
if isinstance(names, basestring): # Support passing in a single resource to acquire rather than many
names = [names] if isinstance(names, basestring):
else: names = [names]
names.sort() else:
names.sort()
acquire_list = [] acquire_list = []
# First we look the locks up on __lockdict. We have no way of being sure # First we look the locks up on __lockdict. We have no way of being sure
# they will still be there after, but this makes it a lot faster should # they will still be there after, but this makes it a lot faster should
# just one of them be the already wrong # just one of them be the already wrong
for lname in names: for lname in names:
try:
lock = self.__lockdict[lname] # raises KeyError if the lock is not there
acquire_list.append((lname, lock))
except (KeyError):
raise errors.LockError('non-existing lock in set (%s)' % lname)
# This will hold the locknames we effectively acquired.
acquired = set()
# Now acquire_list contains a sorted list of resources and locks we want.
# In order to get them we loop on this (private) list and acquire() them.
# We gave no real guarantee they will still exist till this is done but
# .acquire() itself is safe and will alert us if the lock gets deleted.
for (lname, lock) in acquire_list:
try:
lock.acquire(shared=shared) # raises LockError if the lock is deleted
try: try:
# now the lock cannot be deleted, we have it! lock = self.__lockdict[lname] # raises KeyError if the lock is not there
self._add_owned(lname) acquire_list.append((lname, lock))
acquired.add(lname) except (KeyError):
except: raise errors.LockError('non-existing lock in set (%s)' % lname)
# We shouldn't have problems adding the lock to the owners list, but
# if we did we'll try to release this lock and re-raise exception. # This will hold the locknames we effectively acquired.
# Of course something is going to be really wrong, after this. acquired = set()
lock.release() # Now acquire_list contains a sorted list of resources and locks we want.
raise # In order to get them we loop on this (private) list and acquire() them.
# We gave no real guarantee they will still exist till this is done but
except (errors.LockError): # .acquire() itself is safe and will alert us if the lock gets deleted.
name_fail = lname for (lname, lock) in acquire_list:
for lname in self._list_owned(): try:
self.__lockdict[lname].release() lock.acquire(shared=shared) # raises LockError if the lock is deleted
self._del_owned(lname) try:
raise errors.LockError('non-existing lock in set (%s)' % name_fail) # now the lock cannot be deleted, we have it!
self._add_owned(lname)
acquired.add(lname)
except:
# We shouldn't have problems adding the lock to the owners list, but
# if we did we'll try to release this lock and re-raise exception.
# Of course something is going to be really wrong, after this.
lock.release()
raise
except (errors.LockError):
name_fail = lname
for lname in self._list_owned():
self.__lockdict[lname].release()
self._del_owned(lname)
raise errors.LockError('non-existing lock in set (%s)' % name_fail)
except:
raise
return acquired return acquired
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment