Beispiel #1
0
    def send(self, byte_array):
        if not self._s:
            raise error.ConnectionError("Not connected.")

        try:
            ret = self._s.send(byte_array)
        except socket.error:
            raise error.ConnectionError("Socket connection broken.")
        if ret == 0:
            raise error.ConnectionError("Socket connection broken.")
Beispiel #2
0
 def connect(self):
     if self._s:
         raise error.ConnectionError("Already connected.")
     self._s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     try:
         self._s.connect((self.host, self.port))
         self._s.setblocking(0)
     except socket.error:
         self._s = None
         raise error.ConnectionError("Connection refused.")
Beispiel #3
0
    def recv(self):
        if not self._s:
            raise error.ConnectionError("Not connected.")

        n = 1
        while n != 0:
            try:
                packet = self._read_packet(n)
            except socket.error:
                raise error.ConnectionError("Connection reset by peer.")
            if not packet:
                raise error.ConnectionError(
                    "The remote end hung up unexpectedly.")
            n = yield packet
            # must test for None as 0 is termination
            n = n if n is not None else 1
Beispiel #4
0
 def disconnect(self):
     if not self._s:
         raise error.ConnectionError("Not connected.")
     try:
         self._s.shutdown(0)
     except socket.error:
         # TODO: Logging
         pass
     self._s.close()
     self._s = None
Beispiel #5
0
    def _read_packet(self, n):
        packet = None
        delay = 50.0 / 1000.0
        mustend = time.time() + self.timeout
        try_again = True
        while try_again:
            try_again = False
            try:
                packet = self._s.recv(n)
            except socket.error as ex:
                if ex.errno != 11:
                    raise ex
                try_again = True

                if time.time() > mustend:
                    raise error.ConnectionError("Connection timeout.")
                time.sleep(delay)
                if delay < 0.4:
                    delay *= 2
        return packet
Beispiel #6
0
    def send(self, request):
        """Sends a request to the server.

        :param request: Request to be sent to the associated Infinispan server.
        :return: Response from the server.
        """

        # encode request
        req_id = self._get_next_id()
        request.header.id = req_id
        encoder = self._encoder_f.get()
        encoded_request = encoder.encode(request)

        # send request and wait until received the correct response
        with self.conn.context() as ctx:
            log.debug("Sending request id=%r encoded as %r to %s",
                      req_id, encoded_request, ctx)
            ctx.send(encoded_request)
            # receive and decode
            decoder = self._decoder_f.get()
            with ctx.lock:
                data = ctx.recv()
                response = decoder.decode(data)
            log.debug("Received response id=%r from %s",
                      response.header.id, ctx)
            self._cache_resp(response)

        mustend = time.time() + self.timeout
        while req_id not in self._responses:
            # if there is an error response in the cache, raise an error
            err_resp = self._pop_resp(0)
            if err_resp:
                log.error("Received server error without id, message: %s",
                          err_resp.error_message)
                raise error.ServerError(err_resp.error_message, err_resp)

            time.sleep(0.005)
            if time.time() > mustend:
                log.error("Timeout waiting on response with id=%r", req_id)
                raise error.ConnectionError("Timeout.")
        return self._pop_resp(req_id)