class_docstr: InstanceReconciler is responsible for reconciling the difference between
  node provider and instance storage. It is also responsible for handling
  failures.
code: def __init__(
      self,
      instance_storage: InstanceStorage,
      node_provider: NodeProvider,
      reconcile_interval_s: int = 120,
  ) -> None:
      self._instance_storage = instance_storage
      self._node_provider = node_provider
      self._failure_handling_executor = ThreadPoolExecutor(
          max_workers=1
      )
      self._reconcile_interval_s = reconcile_interval_s
      self._reconcile_timer_lock = threading.Lock()
      with self._reconcile_timer_lock:
          self._reconcile_timer = threading.Timer(
              self._reconcile_interval_s,
              self._periodic_reconcile_helper,
          )
  
file_path: ray/python/ray/autoscaler/v2/instance_manager/subscribers/reconciler.py
imports: import logging
  import threading
  from concurrent.futures import ThreadPoolExecutor
  from typing import List
  from ray.autoscaler.v2.instance_manager.instance_storage import InstanceStorage, InstanceUpdatedSubscriber
  from ray.autoscaler.v2.instance_manager.node_provider import NodeProvider
  from ray.core.generated.instance_manager_pb2 import Instance, InstanceUpdateEvent
label_desc: Use image node_id 1 to create a new InstanceReconciler object from inherited base classes: InstanceUpdatedSubscriber with example: obj = InstanceReconciler(instance_storage, node_provider, reconcile_interval_s)