class_docstr: A backfill job runner consists of a dag or subdag for a specific time range.
  
  It triggers a set of task instance runs, in the right order and lasts for
  as long as it takes for the set of task instance to be completed.
code: def _log_progress(self, ti_status: _DagRunTaskStatus) -> None:
      self.log.info(
          "[backfill progress] | finished run %s of %s | tasks waiting: %s | succeeded: %s | "
          "running: %s | failed: %s | skipped: %s | deadlocked: %s | not ready: %s",
          ti_status.finished_runs,
          ti_status.total_runs,
          len(ti_status.to_run),
          len(ti_status.succeeded),
          len(ti_status.running),
          len(ti_status.failed),
          len(ti_status.skipped),
          len(ti_status.deadlocked),
          len(ti_status.not_ready),
      )
  
      self.log.debug(
          "Finished dag run loop iteration. Remaining tasks %s",
          ti_status.to_run.values(),
      )
  
imports: from __future__ import annotations
  import time
  from typing import TYPE_CHECKING, Any, Iterable, Iterator, Mapping, Sequence
  import attr
  import pendulum
  from sqlalchemy import select, tuple_, update
  from sqlalchemy.exc import OperationalError
  from sqlalchemy.orm.session import make_transient
  from tabulate import tabulate
  from airflow import models
  from airflow.exceptions import AirflowException, BackfillUnfinished, DagConcurrencyLimitReached, NoAvailablePoolSlot, PoolNotFound, TaskConcurrencyLimitReached
  from airflow.executors.executor_loader import ExecutorLoader
  from airflow.jobs.base_job_runner import BaseJobRunner
  from airflow.jobs.job import Job, perform_heartbeat
  from airflow.models import DAG, DagPickle
  from airflow.models.dagrun import DagRun
  from airflow.models.taskinstance import TaskInstance
  from airflow.ti_deps.dep_context import DepContext
  from airflow.ti_deps.dependencies_deps import BACKFILL_QUEUED_DEPS
  from airflow.timetables.base import DagRunInfo
  from airflow.utils import helpers, timezone
  from airflow.utils.configuration import conf, tmp_configuration_copy
  from airflow.utils.log.logging_mixin import LoggingMixin
  from airflow.utils.session import NEW_SESSION, provide_session
  from airflow.utils.state import DagRunState, State, TaskInstanceState
  from airflow.utils.types import DagRunType
label_desc: Use image node_id 6 for calling the BackfillJobRunner obj's underlying member method code with example usage: obj._log_progress(ti_status) without return types