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