Ejemplo n.º 1
0
    def run(self):
        """
        Listener thread processing loop. Block on receive from port agent.
        Receive HEADER_SIZE bytes to receive the entire header.  From that,
        get the length of the whole packet (including header); compute the
        length of the remaining data and read that.
        """
        self.thread_name = threading.current_thread().name
        log.info('PortAgentClient listener thread: %s started.',
                 self.thread_name)

        if self.heartbeat:
            self.start_heartbeat_timer()

        while not self._done:
            try:
                header = self._receive_n_bytes(HEADER_SIZE)
                pa_packet = PortAgentPacket()
                pa_packet.unpack_header(header)
                data_size = pa_packet.get_data_length()
                data = self._receive_n_bytes(data_size)
                # Should have complete port agent packet.
                pa_packet.attach_data(data)
                self.handle_packet(pa_packet)

            except Done:
                pass

            except (SocketClosed, socket.error) as e:
                error_string = 'Listener: %s Socket error while receiving from port agent: %r' % (
                    self.thread_name, e)
                log.error(error_string)
                self.error()

            except Exception as e:
                if not isinstance(e, InstrumentException):
                    e = InstrumentException(e.message)

                log.error(e.get_triple())
                self.callback(e)

        log.info('Port_agent_client thread done listening; going away.')
Ejemplo n.º 2
0
    def run(self):
        """
        Listener thread processing loop. Block on receive from port agent.
        Receive HEADER_SIZE bytes to receive the entire header.  From that,
        get the length of the whole packet (including header); compute the
        length of the remaining data and read that.
        """
        self.thread_name = threading.current_thread().name
        log.info('PortAgentClient listener thread: %s started.', self.thread_name)

        if self.heartbeat:
            self.start_heartbeat_timer()

        while not self._done:
            try:
                header = self._receive_n_bytes(HEADER_SIZE)
                pa_packet = PortAgentPacket()
                pa_packet.unpack_header(header)
                data_size = pa_packet.get_data_length()
                data = self._receive_n_bytes(data_size)
                # Should have complete port agent packet.
                pa_packet.attach_data(data)
                self.handle_packet(pa_packet)

            except Done:
                pass

            except (SocketClosed, socket.error) as e:
                error_string = 'Listener: %s Socket error while receiving from port agent: %r' % (self.thread_name, e)
                log.error(error_string)
                self.error()

            except Exception as e:
                if not isinstance(e, InstrumentException):
                    e = InstrumentException(e.message)

                log.error(e.get_triple())
                self.callback(e)

        log.info('Port_agent_client thread done listening; going away.')
Ejemplo n.º 3
0
    def run(self):
        """
        Listener thread processing loop. Block on receive from port agent.
        Receive HEADER_SIZE bytes to receive the entire header.  From that,
        get the length of the whole packet (including header); compute the
        length of the remaining data and read that.
        """
        self.thread_name = str(threading.current_thread().name)
        log.info('PortAgentClient listener thread: %s started.', self.thread_name)

        if self.heartbeat:
            self.start_heartbeat_timer()

        while not self._done:
            try:
                log.trace('RX NEW PACKET')
                header = bytearray(HEADER_SIZE)
                headerview = memoryview(header)
                bytes_left = HEADER_SIZE
                while bytes_left and not self._done:
                    try:
                        bytesrx = self.sock.recv_into(headerview[HEADER_SIZE - bytes_left:], bytes_left)
                        log.trace('RX HEADER BYTES %d LEFT %d SOCK %r' % (
                            bytesrx, bytes_left, self.sock,))
                        if bytesrx <= 0:
                            raise SocketClosed()
                        bytes_left -= bytesrx
                    except socket.error as e:
                        if e.errno == errno.EWOULDBLOCK:
                            time.sleep(.1)
                        else:
                            raise

                # Only do this if we've received the whole header, otherwise (ex. during shutdown)
                # we can have a completely invalid header, resulting in negative count exceptions.
                if bytes_left == 0:
                    pa_packet = PortAgentPacket()
                    pa_packet.unpack_header(str(header))
                    data_size = pa_packet.get_data_length()
                    bytes_left = data_size
                    data = bytearray(data_size)
                    dataview = memoryview(data)
                    log.trace('Expecting DATA BYTES %d' % data_size)

                while bytes_left and not self._done:
                    try:
                        bytesrx = self.sock.recv_into(dataview[data_size - bytes_left:], bytes_left)
                        log.trace('RX DATA BYTES %d LEFT %d SOCK %r' % (
                            bytesrx, bytes_left, self.sock,))
                        if bytesrx <= 0:
                            raise SocketClosed()
                        bytes_left -= bytesrx
                    except socket.error as e:
                        if e.errno == errno.EWOULDBLOCK:
                            time.sleep(.1)
                        else:
                            raise

                if not self._done:
                    # Should have complete port agent packet.
                    pa_packet.attach_data(str(data))
                    log.trace("HANDLE PACKET")
                    self.handle_packet(pa_packet)

            except SocketClosed:
                error_string = 'Listener thread: %s SocketClosed exception from port_agent socket' \
                               % self.thread_name
                log.error(error_string)
                self._invoke_error_callback(self.recovery_attempt, error_string)
                # This next statement causes the thread to exit.  This
                # thread is done regardless of which condition exists
                # above; it is the job of the callbacks to restart the
                # thread
                self._done = True

            except socket.error as e:
                error_string = 'Listener thread: %s Socket error while receiving from port agent: %r' \
                               % (self.thread_name, e)
                log.error(error_string)
                self._invoke_error_callback(self.recovery_attempt, error_string)
                # This next statement causes the thread to exit.  This
                # thread is done regardless of which condition exists
                # above; it is the job of the callbacks to restart the
                # thread
                self._done = True

            except Exception as e:
                if not isinstance(e, InstrumentException):
                    e = InstrumentException(e.message)

                log.error(e.get_triple())
                self.default_callback_error(e)

        log.info('Port_agent_client thread done listening; going away.')