Example #1
0
    def acquire(self,
                namespace,
                name,
                locktype,
                timeout_ms,
                raiseonfailure=None):
        fullName = "%s.%s" % (namespace, name)

        if raiseonfailure is None:
            raiseonfailure = self.raiseonfailure

        if timeout_ms is not None:
            timeout = timeout_ms / 1000.0

        self.lock.acquire()
        try:

            try:
                if fullName in self.resources:
                    raise ValueError("Owner %s: acquire: resource %s is "
                                     "already acquired" % (self, fullName))

                try:
                    resource = acquireResource(namespace, name, locktype,
                                               timeout)
                    self.resources[resource.fullName] = resource

                    if hasattr(self.ownerobject, "resourceAcquired"):
                        self.ownerobject.resourceAcquired(
                            namespace, name, locktype)
                except RequestTimedOutError:
                    self.log.debug(
                        "%s: request for '%s' timed out after '%f' "
                        "seconds", self, fullName, timeout)
                    raise se.ResourceTimeout()
                except ValueError as ex:
                    self.log.debug(
                        "%s: request for '%s' could not be "
                        "processed (%s)", self, fullName, ex)
                    raise se.InvalidResourceName()
                except KeyError:
                    self.log.debug("%s: resource '%s' does not exist", self,
                                   fullName)
                except Exception:
                    self.log.warn(
                        "Unexpected exception caught while owner "
                        "'%s' tried to acquire '%s'",
                        self,
                        fullName,
                        exc_info=True)
                    raise se.ResourceException(fullName)
            except:
                if raiseonfailure:
                    raise

                return False

            return True
        finally:
            self.lock.release()
Example #2
0
    def acquire(self,
                namespace,
                name,
                locktype,
                timeout_ms,
                raiseonfailure=None):
        full_name = "%s.%s" % (namespace, name)

        if raiseonfailure is None:
            raiseonfailure = self.raiseonfailure

        if timeout_ms is not None:
            timeout = timeout_ms / 1000.0

        with self.lock:
            try:
                if full_name in self.resources:
                    raise ResourceAlreadyAcquired(
                        "%s is already acquired by %s", full_name,
                        self.ownerobject.getID())
                try:
                    resource = acquireResource(namespace, name, locktype,
                                               timeout)
                    self.resources[resource.full_name] = resource

                    if hasattr(self.ownerobject, "resourceAcquired"):
                        self.ownerobject.resourceAcquired(
                            namespace, name, locktype)
                except RequestTimedOutError:
                    log.debug(
                        "%s: request for '%s' timed out after '%f' seconds",
                        self, full_name, timeout)
                    raise se.ResourceTimeout()
                except ValueError as ex:
                    log.debug(
                        "%s: request for '%s' could not be processed (%s)",
                        self, full_name, ex)
                    raise se.InvalidResourceName(name)
                except KeyError:
                    log.debug("%s: resource '%s' does not exist", self,
                              full_name)
                    raise ResourceDoesNotExist("Resource %s does not exist" %
                                               full_name)
                except Exception:
                    log.warning(
                        "Unexpected exception caught while owner '%s' tried "
                        "to acquire '%s'",
                        self,
                        full_name,
                        exc_info=True)
                    raise se.ResourceException(full_name)
            except:
                if raiseonfailure:
                    raise

                return False

            return True
Example #3
0
    def register(self, namespace, name, locktype):
        fullName = "%s.%s" % (namespace, name)
        if fullName in self.resources:
            raise ValueError("Owner %s: acquire: resource %s is already "
                             "acquired" % (self, fullName))

        manager = ResourceManager.getInstance()

        self.lock.acquire()
        try:
            if fullName in self.requests:
                raise ValueError("request %s is already requested by %s" %
                                 (fullName, self))

            try:
                request = manager.registerResource(namespace, name, locktype,
                                                   self._onRequestFinished)
            except ValueError as ex:
                self.log.debug(
                    "%s: request for '%s' could not be processed "
                    "(%s)", self, fullName, ex)
                raise se.InvalidResourceName()
            except KeyError:
                self.log.debug("%s: resource '%s' does not exist", self,
                               fullName)
                raise se.ResourceDoesNotExist()
            except Exception:
                self.log.warn(
                    "Unexpected exception caught while owner '%s' "
                    "tried to acquire '%s'",
                    self,
                    fullName,
                    exc_info=True)
                raise se.ResourceException()

            if hasattr(self.ownerobject, "resourceRegistered"):
                self.ownerobject.resourceRegistered(namespace, name, locktype)

            self.requests[fullName] = request
        finally:
            self.lock.release()
        self.log.debug("%s: request registered %s", self, request)