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)
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