Пример #1
0
    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)