Exemple #1
0
    def processing(self, req):
        response = OODict()
        response._id = req._id

        try:
            result = self.handle_req(req)  # Must set req._status
            if result is None:
                return None  # Request not done, need to queue back
            # For complicated calls, read for example, should return a tuple: value, payload
            if isinstance(result, tuple):
                response.value, response.payload = result
            else:
                response.value = result
        except RequestHandleError, err:
            response.error = str(err)
Exemple #2
0
    def call(self, dest, method, **args):
        # How to detect socket errors? how to resend message and reconnect
        # socket?
        # Connect socket

        if dest not in self._locks:
            self._locks[dest] = thread.allocate_lock()
        self._locks[dest].acquire()

        if dest not in self._sockets:
            self._connect(dest)

        # Pack message
        req = OODict()
        req.method = method
        for k, v in args.items():
            req[k] = v

        # Lock id here
        self._id_lock.acquire()
        req._id = self._id
        self._id += 1
        self._id_lock.release()

        retry = 0
        while True:
            try:
                protocol.send_message(self._sockets[dest], req)
                break
            except socket.error, err:
                # There must be something wrong with this socket
                # Create a new one
                self._connect(dest)
                # Only retry when connected, 
                if retry >= self._send_error_retry:
                    self._locks[dest].release()
                    raise exception.NoMoreRetryError('socket send error')
                # Do not need sleep here
                retry += 1