def _handle_connection(self, socket, addr): socket.setsockopt(gevent.socket.SOL_TCP, gevent.socket.TCP_NODELAY, 1) socket.setsockopt(gevent.socket.IPPROTO_TCP, gevent.socket.TCP_NODELAY, 1) f = socket.makefile('r+b', bufsize=0) #rsp_queue = gevent.queue.Queue() #is_connection_closed = [False] def recv_req(): content = "" while True: try: recv_buf = f.read() content += recv_buf #print " got data .." + str(len(recv_buf)) if not recv_buf : break except Exception, e: logging.warning('recv_req error: ' + str(e)) break # Evaluate and execute the request rpcResponse = self.validateAndExecuteRequest(content) log.debug("Response to return to client \n %s" % rpcResponse) f.write(rpcResponse.SerializeToString()) f.flush()
def _handle_connection(self, socket, addr): socket.setsockopt(gevent.socket.SOL_TCP, gevent.socket.TCP_NODELAY, 1) socket.setsockopt(gevent.socket.IPPROTO_TCP, gevent.socket.TCP_NODELAY, 1) rsp_queue = gevent.queue.Queue() is_connection_closed = [False] def call_service(req_info): meta_info, service, method, req = req_info self._stat.add_method_stat(meta_info.service_name, meta_info.method_name, 1) controller = RpcController() try: with Timeout(self._service_timeout): rsp = service.CallMethod(method, controller, req, None) except Timeout: meta_info.has_error = True rsp = rpc_meta_pb2.ErrorResponse(err_code=rpc_meta_pb2.SERVER_SERVICE_TIMEOUT, err_msg='service timeout') except: meta_info.has_error = True err_msg = 'Error calling service: ' + traceback.format_exc() rsp = rpc_meta_pb2.ErrorResponse(err_code=rpc_meta_pb2.SERVER_SERVICE_ERROR, err_msg=err_msg) rsp_queue.put_nowait((meta_info, rsp)) def recv_req(): content = "" while True: try: recv_buf = socket.recv(1024) if len(recv_buf) == 0: break except Exception, e: logging.warning('recv_req error: ' + str(e)) break content += recv_buf mem_content = memoryview(content) cur_index = 0 while cur_index < len(content): if len(mem_content[cur_index:]) < 6: break elif mem_content[cur_index:cur_index + 2] != 'PB': cur_index += 2 # skip the first 2 bytes break (buf_size,) = struct.unpack('!I', mem_content[cur_index + 2: cur_index + 6].tobytes()) if len(mem_content[cur_index + 6:]) < buf_size: break pb_buf = mem_content[cur_index + 6: cur_index + 6 + buf_size].tobytes() cur_index += buf_size + 6 result = self.parse_message(pb_buf) if result is None: logging.warning('pb decode error, skip this message') break self._spawn(call_service, result) if cur_index > 0: content = content[cur_index:] logging.info(str(addr) + 'has disconnected') is_connection_closed[0] = True