def _get_conn(self, node_id, *, group=ConnectionGroup.DEFAULT, no_hint=False): "Get or create a connection to a broker using host and port" conn_id = (node_id, group) if conn_id in self._conns: conn = self._conns[conn_id] if not conn.connected(): del self._conns[conn_id] else: return conn try: if group == ConnectionGroup.DEFAULT: broker = self.cluster.broker_metadata(node_id) # XXX: earlier we only did an assert here, but it seems it's # possible to get a leader that is for some reason not in # metadata. # I think requerying metadata should solve this problem if broker is None: raise StaleMetadata( 'Broker id %s not in current metadata' % node_id) else: broker = self.cluster.coordinator_metadata(node_id) assert broker is not None log.debug("Initiating connection to node %s at %s:%s", node_id, broker.host, broker.port) with (yield from self._get_conn_lock): if conn_id in self._conns: return self._conns[conn_id] version_hint = self._api_version if version_hint == "auto" or no_hint: version_hint = None self._conns[conn_id] = yield from create_conn( broker.host, broker.port, loop=self._loop, client_id=self._client_id, request_timeout_ms=self._request_timeout_ms, ssl_context=self._ssl_context, security_protocol=self._security_protocol, on_close=self._on_connection_closed, max_idle_ms=self._connections_max_idle_ms, sasl_mechanism=self._sasl_mechanism, sasl_plain_username=self._sasl_plain_username, sasl_plain_password=self._sasl_plain_password, sasl_kerberos_service_name=self._sasl_kerberos_service_name, # noqa: ignore=E501 sasl_kerberos_domain_name=self._sasl_kerberos_domain_name, version_hint=version_hint ) except (OSError, asyncio.TimeoutError, KafkaError) as err: log.error('Unable connect to node with id %s: %s', node_id, err) if group == ConnectionGroup.DEFAULT: # Connection failures imply that our metadata is stale, so # let's refresh self.force_metadata_update() return None else: return self._conns[conn_id]
def _get_conn(self, node_id, *, group=ConnectionGroup.DEFAULT): "Get or create a connection to a broker using host and port" conn_id = (node_id, group) if conn_id in self._conns: conn = self._conns[conn_id] if not conn.connected(): del self._conns[conn_id] else: return conn try: broker = self.cluster.broker_metadata(node_id) # XXX: earlier we only did an assert here, but it seems it's # possible to get a leader that is for some reason not in metadata. # I think requerying metadata should solve this problem if broker is None: raise StaleMetadata('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) with (yield from self._get_conn_lock): if conn_id in self._conns: return self._conns[conn_id] self._conns[conn_id] = yield from create_conn( broker.host, broker.port, loop=self._loop, client_id=self._client_id, request_timeout_ms=self._request_timeout_ms, ssl_context=self._ssl_context, security_protocol=self._security_protocol, on_close=self._on_connection_closed, max_idle_ms=self._connections_max_idle_ms) except (OSError, asyncio.TimeoutError) as err: log.error('Unable connect to node with id %s: %s', node_id, err) # Connection failures imply that our metadata is stale, so let's # refresh self.force_metadata_update() return None else: return self._conns[conn_id]