code: def test_scheduling_class_depth(ray_start_regular):
      @ray.remote(num_cpus=1000)
      def infeasible():
          pass
  
      @ray.remote(num_cpus=0)
      def start_infeasible(n):
          if n == 1:
              ray.get(infeasible.remote())
          ray.get(start_infeasible.remote(n - 1))
  
      start_infeasible.remote(1)
      infeasible.remote()
  
      # We expect the 2 calls to `infeasible` to be separate scheduling classes
      # because one has depth=1, and the other has depth=2.
      metric_name = "ray_internal_num_infeasible_scheduling_classes"
  
      # timeout=60 necessary to pass on windows debug/asan builds.
      wait_for_condition(
          get_metric_check_condition(
              [MetricSamplePattern(name=metric_name, value=2)]
          ),
          timeout=60,
      )
      start_infeasible.remote(2)
      wait_for_condition(
          get_metric_check_condition(
              [MetricSamplePattern(name=metric_name, value=3)]
          ),
          timeout=60,
      )
      start_infeasible.remote(4)
      wait_for_condition(
          get_metric_check_condition(
              [MetricSamplePattern(name=metric_name, value=4)]
          ),
          timeout=60,
      )
  
imports: import collections
  import logging
  import platform
  import subprocess
  import sys
  import time
  import unittest
  import numpy
  import pytest
  import ray
  import ray.cluster_utils
  import ray.util.accelerators
  from ray._private.internal_api import memory_summary
  from ray.util.scheduling_strategies import PlacementGroupSchedulingStrategy
  from ray._private.test_utils import Semaphore, SignalActor, object_memory_usage, get_metric_check_condition, wait_for_condition, MetricSamplePattern
label_desc: Use image node_id 19 for calling a global function with example usage: test_scheduling_class_depth(ray_start_regular) without return types