class SandeshSession(TcpSession): _KEEPALIVE_IDLE_TIME = 45 # in secs _KEEPALIVE_INTERVAL = 3 # in secs _KEEPALIVE_PROBES = 5 def __init__(self, sandesh_instance, server, event_handler, sandesh_msg_handler): self._sandesh_instance = sandesh_instance self._logger = sandesh_instance._logger self._event_handler = event_handler self._reader = SandeshReader(self, sandesh_msg_handler) self._writer = SandeshWriter(self) self._send_queue = WorkQueue(self._send_sandesh, self._is_ready_to_send_sandesh) TcpSession.__init__(self, server) # end __init__ # Public functions def sandesh_instance(self): return self._sandesh_instance # end sandesh_instance def is_send_queue_empty(self): return self._send_queue.is_queue_empty() # end is_send_queue_empty def is_connected(self): return self._connected # end is_connected def enqueue_sandesh(self, sandesh): self._send_queue.enqueue(sandesh) # end enqueue_sandesh def send_queue(self): return self._send_queue # end send_queue # Overloaded functions from TcpSession def connect(self): TcpSession.connect(self, timeout=5) # end connect def _on_read(self, buf): if self._reader.read_msg(buf) < 0: self._logger.error('SandeshReader Error. Close Collector session') self.close() # end _on_read def _handle_event(self, event): self._event_handler(self, event) # end _handle_event def _set_socket_options(self): self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) if hasattr(socket, 'TCP_KEEPIDLE'): self._socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, self._KEEPALIVE_IDLE_TIME) if hasattr(socket, 'TCP_KEEPALIVE'): self._socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPALIVE, self._KEEPALIVE_IDLE_TIME) if hasattr(socket, 'TCP_KEEPINTVL'): self._socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, self._KEEPALIVE_INTERVAL) if hasattr(socket, 'TCP_KEEPCNT'): self._socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPCNT, self._KEEPALIVE_PROBES) # end _set_socket_options # Private functions def _send_sandesh(self, sandesh): if self._send_queue.is_queue_empty(): more = False else: more = True if not self._connected: if self._sandesh_instance.is_logging_dropped_allowed(sandesh): self._logger.error( "SANDESH: %s: %s" % ("Not connected", sandesh.log())) return if sandesh.is_logging_allowed(self._sandesh_instance): self._logger.log( SandeshLogger.get_py_logger_level(sandesh.level()), sandesh.log()) self._writer.send_msg(sandesh, more) # end _send_sandesh def _is_ready_to_send_sandesh(self): return self._sandesh_instance.is_send_queue_enabled()