class_docstr: 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.
code: def _add_node_mapping(self, node_id: str, value: str):
      if node_id in self.node_mapping:
          return
  
      assert len(self.lru_order) == len(self.node_mapping)
      if len(self.lru_order) >= constants.AUTOSCALER_MAX_NODES_TRACKED:
          # The LRU eviction case
          node_id = self.lru_order.pop(0)
          del self.node_mapping[node_id]
  
      self.node_mapping[node_id] = value
      self.lru_order.append(node_id)
  
file_path: ray/python/ray/autoscaler/_private/node_tracker.py
imports: from typing import List, Set, Tuple
  from ray.autoscaler._private import constants
label_desc: Use image node_id 2 for calling the NodeTracker obj's underlying member method code with example usage: obj._add_node_mapping(node_id, value) without return types