o
    $i
                     @   s2   d dl mZmZmZ d dlmZ G dd dZdS )    )ListSetTuple)	constantsc                   @   sp   e Zd ZdZdd ZdedefddZdeded	efd
dZdefddZde	e de
eeef  fddZdS )NodeTrackeraJ  Map nodes to their corresponding logs.

    We need to be a little careful here. At an given point in time, node_id <->
    ip can be interchangeably used, but the node_id -> ip relation is not
    bijective _across time_ since IP addresses can be reused. Therefore, we
    should treat node_id as the only unique identifier.
    c                 C   s   i | _ g | _d S N)node_mapping	lru_order)self r   a/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/ray/autoscaler/_private/node_tracker.py__init__   s   
zNodeTracker.__init__node_idvaluec                 C   sd   || j v rd S t| jt| j ksJ t| jtjkr%| jd}| j |= || j |< | j| d S )Nr   )r   lenr	   r   AUTOSCALER_MAX_NODES_TRACKEDpopappend)r
   r   r   r   r   r   _add_node_mapping   s   

zNodeTracker._add_node_mappingip	node_typec                 C   s"   || j vr| |||f dS dS )z
        Begin to track a new node.

        Args:
            node_id: The node id.
            ip: The node ip address.
            node_type: The node type.
        N)r   r   )r
   r   r   r   r   r   r   track#   s   
	zNodeTracker.trackc                 C   s&   || j v r| j| | j |= dS dS )zGracefully stop tracking a node. If a node is intentionally removed from
        the cluster, we should stop tracking it so we don't mistakenly mark it
        as failed.

        Args:
            node_id: The node id which failed.
        N)r   r	   remove)r
   r   r   r   r   untrack/   s   
zNodeTracker.untracknon_failed_idsreturnc                    s@   | j  |  g }t fdd| jD ]
}|| j |  q|S )a  Get the information about all failed nodes. A failed node is any node which
        we began to track that is not pending or alive (i.e. not failed).

        Args:
            non_failed_ids: Nodes are failed unless they are in this set.

        Returns:
            List[Tuple[str, str]]: A list of tuples. Each tuple is the ip
            address and type of a failed node.
        c                    s   |  v S r   r   )r   failed_nodesr   r   <lambda>K   s    z6NodeTracker.get_all_failed_node_info.<locals>.<lambda>)r   keysfilterr	   r   )r
   r   failed_infor   r   r   r   get_all_failed_node_info;   s
   z$NodeTracker.get_all_failed_node_infoN)__name__
__module____qualname____doc__r   strr   r   r   r   r   r   r"   r   r   r   r   r      s    r   N)typingr   r   r   ray.autoscaler._privater   r   r   r   r   r   <module>   s    