in elastic_transport/_node_pool.py [0:0]
def resurrect(self, force: bool = False) -> Optional[BaseNode]:
"""
Attempt to resurrect a node from the dead queue. It will try to
locate one (not all) eligible (it's timeout is over) node to
return to the live pool. Any resurrected node is also returned.
:arg force: resurrect a node even if there is none eligible (used
when we have no live nodes). If force is 'True'' resurrect
always returns a node.
"""
node: Optional[BaseNode]
mark_node_alive_after: float = 0.0
try:
# Try to resurrect a dead node if any.
mark_node_alive_after, node = self._dead_nodes.get(block=False)
except Empty: # No dead nodes.
if force:
# If we're being forced to return a node we randomly
# pick between alive and dead nodes.
return random.choice(list(self._all_nodes.values()))
node = None
if node is not None and not force and mark_node_alive_after > time.time():
# return it back if not eligible and not forced
self._dead_nodes.put((mark_node_alive_after, node))
node = None
# either we were forced or the node is eligible to be retried
if node is not None:
self._alive_nodes[node.config] = node
_logger.info("Resurrected node %r (force=%s)", node, force)
return node