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()
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()
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()