diff options
| -rw-r--r-- | common/src/leap/soledad/common/errors.py | 11 | ||||
| -rw-r--r-- | server/changes/feature_4918_use-temporary-directory-for-server-side-locks | 1 | ||||
| -rw-r--r-- | server/src/leap/soledad/server/__init__.py | 10 | 
3 files changed, 19 insertions, 3 deletions
| diff --git a/common/src/leap/soledad/common/errors.py b/common/src/leap/soledad/common/errors.py index 62de19f8..c41e0b0f 100644 --- a/common/src/leap/soledad/common/errors.py +++ b/common/src/leap/soledad/common/errors.py @@ -67,10 +67,19 @@ class LockTimedOutError(errors.U1DBError):      status = 408 +class CouldNotObtainLockError(errors.U1DBError): +    """ +    Exception raised when timing out while trying to lock the shared database. +    """ + +    wire_description = "error obtaining lock" +    status = 500 + +  # update u1db "wire description to status" and "wire description to exception"  # maps.  for e in [InvalidTokenError, NotLockedError, AlreadyLockedError, -        LockTimedOutError]: +        LockTimedOutError, CouldNotObtainLockError]:      http_errors.wire_description_to_status.update({          e.wire_description: e.status})      errors.wire_description_to_exc.update({ diff --git a/server/changes/feature_4918_use-temporary-directory-for-server-side-locks b/server/changes/feature_4918_use-temporary-directory-for-server-side-locks new file mode 100644 index 00000000..d8c5ba8e --- /dev/null +++ b/server/changes/feature_4918_use-temporary-directory-for-server-side-locks @@ -0,0 +1 @@ +  o Use a temporary directory for server side locks (#4918). diff --git a/server/src/leap/soledad/server/__init__.py b/server/src/leap/soledad/server/__init__.py index 00d3c8c1..4380966c 100644 --- a/server/src/leap/soledad/server/__init__.py +++ b/server/src/leap/soledad/server/__init__.py @@ -90,6 +90,7 @@ import configparser  import time  import hashlib  import os +import tempfile  from u1db.remote import http_app @@ -122,6 +123,7 @@ from leap.soledad.common.errors import (      NotLockedError,      AlreadyLockedError,      LockTimedOutError, +    CouldNotObtainLockError,  ) @@ -201,7 +203,9 @@ class LockResource(object):          self._shared_db = state.open_database(SoledadApp.SHARED_DB_NAME)          self._lock_doc_id = '%s%s' % (SHARED_DB_LOCK_DOC_ID_PREFIX, uuid)          self._lock = FilesystemLock( -            hashlib.sha512(self._lock_doc_id).hexdigest()) +            os.path.join( +                tempfile.gettmpdir(), +                hashlib.sha512(self._lock_doc_id).hexdigest()))          self._state = state          self._responder = responder @@ -328,8 +332,10 @@ class LockResource(object):          while tries > 0:              try:                  return self._lock.lock() -            except Exception as e: +            except OSError as e:                  tries -= 1 +                if tries == 0: +                    raise CouldNotObtainLockError(e.message)                  time.sleep(self.FILESYSTEM_LOCK_SLEEP_SECONDS)          return False | 
