def _detect_membership_events(self, old, new): new_members = [] dead_members = set(six.itervalues(old.members)) for member in six.itervalues(new.members): try: dead_members.remove(member) except KeyError: new_members.append(member) for dead_member in dead_members: connection = self._connection_manager.get_connection( dead_member.uuid) if connection: connection.close( None, TargetDisconnectedError( "The client has closed the connection to this member, " "after receiving a member left event from the cluster. " "%s" % connection), ) if (len(new_members) + len(dead_members)) > 0: if len(new.members) > 0: _logger.info(self._members_string(new)) return dead_members, new_members
def _check_connection(self, now, connection): if not connection.live: return if (now - connection.last_read_time) > self._heartbeat_timeout: _logger.warning("Heartbeat failed over the connection: %s", connection) connection.close( "Heartbeat timed out", TargetDisconnectedError("Heartbeat timed out to connection %s" % connection), ) return if (now - connection.last_write_time) > self._heartbeat_interval: request = client_ping_codec.encode_request() invocation = Invocation(request, connection=connection, urgent=True) self._invocation_service.invoke(invocation)
def run(): if self._shutdown: return now = time.time() for invocation in list(self._pending.values()): connection = invocation.sent_connection if not connection: continue if not connection.live: error = TargetDisconnectedError(connection.close_reason) self._notify_error(invocation, error) if self._backup_ack_to_client_enabled: self._detect_and_handle_backup_timeout(invocation, now) self._clean_resources_timer = self._reactor.add_timer( self._CLEAN_RESOURCES_PERIOD, run)