def test_relookup_on_failure(): hostname = 'example.org' port = 9092 conn = BrokerConnection(hostname, port, socket.AF_UNSPEC) assert conn.host == hostname mock_return1 = [] with mock.patch("socket.getaddrinfo", return_value=mock_return1) as m: last_attempt = conn.last_attempt conn.connect() m.assert_called_once_with(hostname, port, 0, 1) assert conn.disconnected() assert conn.last_attempt > last_attempt afi2 = socket.AF_INET sockaddr2 = ('127.0.0.2', 9092) mock_return2 = [ (afi2, socket.SOCK_STREAM, 6, '', sockaddr2), ] with mock.patch("socket.getaddrinfo", return_value=mock_return2) as m: conn.last_attempt = 0 conn.connect() m.assert_called_once_with(hostname, port, 0, 1) assert conn._sock_afi == afi2 assert conn._sock_addr == sockaddr2 conn.close()
def _maybe_connect(self, node_id): """Idempotent non-blocking connection attempt to the given node id.""" with self._lock: broker = self.cluster.broker_metadata(node_id) conn = self._conns.get(node_id) if conn is None: assert broker, 'Broker id %s not in current metadata' % ( node_id, ) log.debug("Initiating connection to node %s at %s:%s", node_id, broker.host, broker.port) host, port, afi = get_ip_port_afi(broker.host) cb = functools.partial(WeakMethod(self._conn_state_change), node_id) conn = BrokerConnection(host, broker.port, afi, state_change_callback=cb, node_id=node_id, **self.config) self._conns[node_id] = conn # Check if existing connection should be recreated because host/port changed elif conn.disconnected() and broker is not None: host, _, __ = get_ip_port_afi(broker.host) if conn.host != host or conn.port != broker.port: log.info( "Broker metadata change detected for node %s" " from %s:%s to %s:%s", node_id, conn.host, conn.port, broker.host, broker.port) # Drop old connection object. # It will be recreated on next _maybe_connect self._conns.pop(node_id) return False elif conn.connected(): return True conn.connect() return conn.connected()
def test_relookup_on_failure(): hostname = 'example.org' port = 9092 conn = BrokerConnection(hostname, port, socket.AF_UNSPEC) assert conn.host == conn.hostname == hostname mock_return1 = [] with mock.patch("socket.getaddrinfo", return_value=mock_return1) as m: last_attempt = conn.last_attempt conn.connect() m.assert_called_once_with(hostname, port, 0, 1) assert conn.disconnected() assert conn.last_attempt > last_attempt ip2 = '127.0.0.2' mock_return2 = [ (2, 2, 17, '', (ip2, 9092)), ] with mock.patch("socket.getaddrinfo", return_value=mock_return2) as m: conn.connect() m.assert_called_once_with(hostname, port, 0, 1) conn.close() assert conn.host == ip2
def _maybe_connect(self, node_id): """Idempotent non-blocking connection attempt to the given node id.""" with self._lock: broker = self.cluster.broker_metadata(node_id) conn = self._conns.get(node_id) if conn is None: assert broker, 'Broker id %s not in current metadata' % node_id log.debug("Initiating connection to node %s at %s:%s", node_id, broker.host, broker.port) host, port, afi = get_ip_port_afi(broker.host) cb = functools.partial(WeakMethod(self._conn_state_change), node_id) conn = BrokerConnection(host, broker.port, afi, state_change_callback=cb, node_id=node_id, **self.config) self._conns[node_id] = conn # Check if existing connection should be recreated because host/port changed elif conn.disconnected() and broker is not None: host, _, __ = get_ip_port_afi(broker.host) if conn.host != host or conn.port != broker.port: log.info("Broker metadata change detected for node %s" " from %s:%s to %s:%s", node_id, conn.host, conn.port, broker.host, broker.port) # Drop old connection object. # It will be recreated on next _maybe_connect self._conns.pop(node_id) return False elif conn.connected(): return True conn.connect() return conn.connected()
def test_recv_disconnected(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', 0)) port = sock.getsockname()[1] sock.listen(5) conn = BrokerConnection('127.0.0.1', port, socket.AF_INET) timeout = time.time() + 1 while time.time() < timeout: conn.connect() if conn.connected(): break else: assert False, 'Connection attempt to local socket timed-out ?' conn.send(MetadataRequest[0]([])) # Disconnect server socket sock.close() # Attempt to receive should mark connection as disconnected assert conn.connected() conn.recv() assert conn.disconnected()