예제 #1
0
파일: client.py 프로젝트: airekans/recall
    def send_req(self, flow_id, method_descriptor, rpc_controller,
                 request, response_class, done, req_data):
        service_descriptor = method_descriptor.containing_service
        meta_info = rpc_meta_pb2.MetaInfo()
        meta_info.flow_id = flow_id
        meta_info.service_name = service_descriptor.full_name
        meta_info.method_name = method_descriptor.name
        serialized_req = serialize_message(meta_info, request)
        sent_bytes = 0
        try:
            while sent_bytes < len(serialized_req):
                sent_bytes += self._socket.send(serialized_req[sent_bytes:])
        except soc_error as e:
            logging.warning('socket error: ' + str(e))
            rpc_controller.SetFailed((RpcController.SERVER_CLOSE_CONN_ERROR,
                                      'connection has sending error'))
            self._finish_rpc(done, rpc_controller, None, req_data.is_async)

            self.close()
            return False

        req_data.begin_time = time.time()
        self._recv_infos[flow_id] = (meta_info, rpc_controller, response_class, done, req_data)
        self._stat.add_req_stat()
        if rpc_controller.method_timeout > 0:
            heapq.heappush(self._timeout_queue,
                           (req_data.begin_time + rpc_controller.method_timeout, flow_id))

        return True
예제 #2
0
파일: server.py 프로젝트: airekans/recall
        def send_rsp():
            while not is_connection_closed[0]:
                try:
                    meta_info, rsp = rsp_queue.get(timeout=1)
                except gevent.queue.Empty:
                    continue

                serialized_rsp = serialize_message(meta_info, rsp)
                sent_bytes = 0
                try:
                    while sent_bytes < len(serialized_rsp):
                        sent_bytes += socket.send(serialized_rsp[sent_bytes:])
                except soc_error as e:
                    logging.warning('socket send error: ' + str(e))
                    break
예제 #3
0
    def test_CallMethodWithWrongMetaInfo(self):
        channel = self.channel
        sock = channel.get_socket()
        self.assertEqual(0, channel.get_flow_id())

        serialized_request = self.get_serialize_message(0, self.request)
        rsp = self.response_class(return_code=0, msg='SUCCESS')
        meta_info = rpc_meta_pb2.MetaInfo(flow_id=0,
                                          service_name='WrongServiceName',
                                          method_name='WrongMethodName')
        serialized_response = serialize_message(meta_info, rsp)
        sock.set_recv_content(serialized_response)

        controller = RpcController()
        actual_rsp = channel.CallMethod(self.method, controller,
                                        self.request, self.response_class, None)

        self.assertEqual(serialized_request, sock.get_send_content())
        self.assertEqual(1, channel.get_flow_id())
        self.assertIsNone(actual_rsp)
        self.assertTrue(controller.Failed())
        self.assertEqual(RpcController.WRONG_RSP_META_ERROR, controller.err_code)
예제 #4
0
    def test_CallMethodWithErrorInRspMeta(self):
        channel = self.channel
        sock = channel.get_socket()
        self.assertEqual(0, channel.get_flow_id())

        serialized_request = self.get_serialize_message(0, self.request)
        rsp = rpc_meta_pb2.ErrorResponse(err_code=rpc_meta_pb2.SERVER_SERVICE_ERROR,
                                         err_msg='test error')
        meta_info = rpc_meta_pb2.MetaInfo(flow_id=0,
                                          service_name=self.service_descriptor.full_name,
                                          method_name=self.method.name,
                                          has_error=True)
        serialized_response = serialize_message(meta_info, rsp)
        sock.set_recv_content(serialized_response)

        controller = RpcController()
        actual_rsp = channel.CallMethod(self.method, controller,
                                        self.request, self.response_class, None)

        self.assertEqual(serialized_request, sock.get_send_content())
        self.assertEqual(1, channel.get_flow_id())
        self.assertIsNone(actual_rsp)
        self.assertTrue(controller.Failed())
        self.assertEqual(rpc_meta_pb2.SERVER_SERVICE_ERROR, controller.err_code)
예제 #5
0
 def get_serialize_message(self, flow_id, msg):
     meta_info = rpc_meta_pb2.MetaInfo(
         flow_id=flow_id,
         service_name=self.service_descriptor.full_name,
         method_name=self.method.name)
     return serialize_message(meta_info, msg)
예제 #6
0
 def get_serialize_message(self, flow_id, service_desc, method_name, msg):
     has_error = isinstance(msg, rpc_meta_pb2.ErrorResponse)
     meta_info = rpc_meta_pb2.MetaInfo(flow_id=flow_id, service_name=service_desc.full_name,
                                       method_name=method_name, has_error=has_error)
     return serialize_message(meta_info, msg)