in elastic_transport/_node_pool.py [0:0]
def get(self) -> BaseNode:
"""
Return a node from the pool using the ``NodeSelector`` instance.
It tries to resurrect eligible nodes, forces a resurrection when
no nodes are available and passes the list of live nodes to
the selector instance to choose from.
"""
# Even with the optimization below we want to participate in the
# dead/alive cycle in case more nodes join after sniffing, for example.
self.resurrect()
# Flag that short-circuits the extra logic if we have only one node.
# The only way this flag can be set to 'True' is if there were only
# one node defined within 'seed_nodes' so we know this good to do.
if self._all_nodes_len_1:
return self._all_nodes[self._seed_nodes[0]]
# Filter nodes in 'alive_nodes' to ones not marked as removed.
nodes = [
node
for node_config, node in self._alive_nodes.items()
if node_config not in self._removed_nodes
]
# No live nodes, resurrect one by force and return it
if not nodes:
return self.resurrect(force=True)
# Only call selector if we have a choice to make
if len(nodes) > 1:
return self._node_selector.select(nodes)
return nodes[0]