Exemplo n.º 1
0
  def validate_slaves(self, slave_uris):
    '''
    If we're at the check interval, confirm that all slaves are connected to their
    intended hosts and if not, reconnect them.
    '''
    if time.time()-self._last_validate_time < VALIDATE_INTERVAL: return
    
    hosts_ports = [_str_to_node(uri) for uri in slave_uris]

    # Walk a copy of the current slave list so that we can manipulate it. For
    # each connection that is not pointing to a configured slave, disconnect
    # it and remove from the list.
    for slave in self.slaves[:]:
      host_port = (slave._Connection__host, slave._Connection__port)
      if host_port not in hosts_ports:
        slave.disconnect()
        self.slaves.remove( slave )
      else:
        hosts_ports.remove( host_port )

    # For all hosts where there wasn't an existing connection, create one
    for host,port in hosts_ports:
      self.slaves.append( Connection(
        host=host, port=port, slave_okay=True, _connect=False) )

    self._last_validate_time = time.time()
Exemplo n.º 2
0
    def __init__(self, logger, host_list):
        """@param host_list: initial list of nodes in ReplicaSet (can change during the life time)"""
        self.logger = logger
        self.host_list = host_list
        master_connection = MongoConnection(self.host_list)

        slave_log_list = []
        slave_connections = []
        for host in self.host_list:
            slave_host, slave_port = _str_to_node(host)

            # remove master from list of slaves, so no reads are going its way
            # however, allow master to handle reads if its the only node in ReplicaSet
            if (
                len(self.host_list) > 1
                and slave_host == master_connection._Connection__host
                and slave_port == master_connection._Connection__port
            ):
                continue
            slave_log_list.append("%s:%r" % (slave_host, slave_port))
            slave_connections.append(MongoConnection(host=slave_host, port=slave_port, slave_okay=True, _connect=False))
        self.logger.info("ClusterConnection.init: master %r, slaves: %r" % (master_connection, slave_log_list))

        super(ClusterConnection, self).__init__(master=master_connection, slaves=slave_connections)
        self._last_validate_time = time.time()
Exemplo n.º 3
0
    def validate_slaves(self):
        """
        1. If we're at the check interval, confirm that all slaves are connected to their
        intended hosts and if not, reconnect them.
        2. Remove master from list of slaves.
        """
        if time.time() - self._last_validate_time < self.VALIDATE_INTERVAL:
            return

        master_host_port = (self.master._Connection__host, self.master._Connection__port)
        hosts_ports = [_str_to_node(uri) for uri in self.host_list]

        # For each connection that is not pointing to a configured slave:
        # - disconnect it and remove from the list.
        for slave in self.slaves:
            host_port = (slave._Connection__host, slave._Connection__port)
            if host_port == master_host_port:
                # use case: master connection is among slaves
                if len(self.slaves) > 1:
                    # remove master from list of slaves, so no reads are going its way
                    # however, allow master to handle reads if its the only node in ReplicaSet
                    slave.disconnect()
                    self.slaves.remove(slave)
                    hosts_ports.remove(master_host_port)
            elif host_port not in hosts_ports:
                slave.disconnect()
                self.slaves.remove(slave)
            else:
                hosts_ports.remove(host_port)

        # use case: remove master URI from "re-connection" list, if there are other active slave connections
        if len(self.slaves) > 0 and master_host_port in hosts_ports:
            # if at least one slave is active - do not try to (re)connect to master
            hosts_ports.remove(master_host_port)

        # For all hosts where there wasn't an existing connection, create one
        for host, port in hosts_ports:
            self.slaves.append(MongoConnection(host=host, port=port, slave_okay=True, _connect=False))

        self.logger.info("ClusterConnection.validate: master %r, slaves: %r" % (self.master, self.slaves))
        self._last_validate_time = time.time()