Merge pull request #379 from jonparrott/locking-to-base-storage

Moved locking logic into storage base class.
This commit is contained in:
Nathaniel Manista
2016-01-06 10:52:21 -08:00
6 changed files with 19 additions and 35 deletions

View File

@@ -346,21 +346,31 @@ class Storage(object):
such that multiple processes and threads can operate on a single such that multiple processes and threads can operate on a single
store. store.
""" """
def __init__(self, lock=None):
"""Create a Storage instance.
Args:
lock: An optional threading.Lock-like object. Must implement at
least acquire() and release(). Does not need to be re-entrant.
"""
self._lock = lock
def acquire_lock(self): def acquire_lock(self):
"""Acquires any lock necessary to access this Storage. """Acquires any lock necessary to access this Storage.
This lock is not reentrant. This lock is not reentrant.
""" """
pass if self._lock is not None:
self._lock.acquire()
def release_lock(self): def release_lock(self):
"""Release the Storage lock. """Release the Storage lock.
Trying to release a lock that isn't held will result in a Trying to release a lock that isn't held will result in a
RuntimeError. RuntimeError in the case of a threading.Lock or multiprocessing.Lock.
""" """
pass if self._lock is not None:
self._lock.release()
def locked_get(self): def locked_get(self):
"""Retrieve credential. """Retrieve credential.

View File

@@ -408,6 +408,8 @@ class StorageByKeyName(Storage):
user: users.User object, optional. Can be used to grab user ID as a user: users.User object, optional. Can be used to grab user ID as a
key_name if no key name is specified. key_name if no key name is specified.
""" """
super(StorageByKeyName, self).__init__()
if key_name is None: if key_name is None:
if user is None: if user is None:
raise ValueError('StorageByKeyName called with no ' raise ValueError('StorageByKeyName called with no '

View File

@@ -124,6 +124,7 @@ class Storage(BaseStorage):
property_name: string, name of the property that is an property_name: string, name of the property that is an
CredentialsProperty CredentialsProperty
""" """
super(Storage, self).__init__()
self.model_class = model_class self.model_class = model_class
self.key_name = key_name self.key_name = key_name
self.key_value = key_value self.key_value = key_value

View File

@@ -31,6 +31,7 @@ class DjangoSessionStorage(client.Storage):
"""Storage implementation that uses Django sessions.""" """Storage implementation that uses Django sessions."""
def __init__(self, session): def __init__(self, session):
super(DjangoSessionStorage, self).__init__()
self.session = session self.session = session
def locked_get(self): def locked_get(self):

View File

@@ -59,24 +59,9 @@ class Storage(BaseStorage):
credentials are stored. credentials are stored.
user_name: string, The name of the user to store credentials for. user_name: string, The name of the user to store credentials for.
""" """
super(Storage, self).__init__(lock=threading.Lock())
self._service_name = service_name self._service_name = service_name
self._user_name = user_name self._user_name = user_name
self._lock = threading.Lock()
def acquire_lock(self):
"""Acquires any lock necessary to access this Storage.
This lock is not reentrant.
"""
self._lock.acquire()
def release_lock(self):
"""Release the Storage lock.
Trying to release a lock that isn't held will result in a
RuntimeError.
"""
self._lock.release()
def locked_get(self): def locked_get(self):
"""Retrieve Credential from file. """Retrieve Credential from file.

View File

@@ -36,29 +36,14 @@ class Storage(BaseStorage):
"""Store and retrieve a single credential to and from a file.""" """Store and retrieve a single credential to and from a file."""
def __init__(self, filename): def __init__(self, filename):
super(Storage, self).__init__(lock=threading.Lock())
self._filename = filename self._filename = filename
self._lock = threading.Lock()
def _validate_file(self): def _validate_file(self):
if os.path.islink(self._filename): if os.path.islink(self._filename):
raise CredentialsFileSymbolicLinkError( raise CredentialsFileSymbolicLinkError(
'File: %s is a symbolic link.' % self._filename) 'File: %s is a symbolic link.' % self._filename)
def acquire_lock(self):
"""Acquires any lock necessary to access this Storage.
This lock is not reentrant.
"""
self._lock.acquire()
def release_lock(self):
"""Release the Storage lock.
Trying to release a lock that isn't held will result in a
RuntimeError.
"""
self._lock.release()
def locked_get(self): def locked_get(self):
"""Retrieve Credential from file. """Retrieve Credential from file.