arcalot/arcaflow-plugin-sdk-python

Recursion depth exceeded on multiple typing.Annotated parameters

Closed this issue · 0 comments

Describe the bug

The plugin throws an error when more than two parameters are passed into the dataclass attribute typing annotation.

To reproduce

Given an active python environment based off of my fio plugin,

@dataclass
class FioParams:
    name: str
    size: str
    ioengine: IoEngine
    iodepth: int
    rate_iops: int
    io_submit_mode: IoSubmitMode
    direct: typing.Annotated[Optional[int], validation.min(0), validation.max(1)] = 0
    atomic: typing.Annotated[Optional[int], validation.min(0), validation.max(1)] = 0
    buffered: typing.Annotated[Optional[int], validation.min(0), validation.max(1)] = 1
    readwrite: Optional[IoPattern] = IoPattern.read.value
    rate_process: Optional[RateProcess] = RateProcess.linear.value
❯ python fio_plugin.py -f mocks/poisson-rate-submission_input.yaml --debug
Traceback (most recent call last):
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 320, in _resolve_annotated
    underlying_t = args[i](underlying_t)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/validation.py", line 58, in call
    effective_t.max = param
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/schema.py", line 460, in max
    self.max = max
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/schema.py", line 460, in max
    self.max = max
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/schema.py", line 460, in max
    self.max = max
  [Previous line repeated 983 more times]
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/schema.py", line 459, in max
    self._validate(self._min, max)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/schema.py", line 429, in _validate
    if not isinstance(min, int):
RecursionError: maximum recursion depth exceeded while calling a Python object

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/mleader/workspace/arcaflow/arca-fio/fio_plugin.py", line 202, in <module>
    fio_input_schema = plugin.build_object_schema(FioParams)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 473, in build_object_schema
    r = _Resolver.resolve(t)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 109, in resolve
    return cls._resolve_abstract_type(t, tuple(path))
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 113, in _resolve_abstract_type
    result = cls._resolve(t, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 138, in _resolve
    return cls._resolve_type(t, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 182, in _resolve_type
    return _Resolver._resolve_class(t, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 235, in _resolve_class
    name, final_field = cls._resolve_dataclass_field(f, tuple(new_path))
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 195, in _resolve_dataclass_field
    underlying_type = cls._resolve_field(t.type, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 128, in _resolve_field
    result = cls._resolve(t, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 158, in _resolve
    return cls._resolve_annotated(t, path)
  File "/home/mleader/.cache/pypoetry/virtualenvs/arca-fio-7ELhrWBI-py3.10/lib/python3.10/site-packages/arcaflow_plugin_sdk/plugin.py", line 322, in _resolve_annotated
    raise SchemaBuildException(
arcaflow_plugin_sdk.plugin.SchemaBuildException: Invalid schema definition for FioParams -> direct -> typing.Annotated -> 2: Failed to execute Annotated argument: maximum recursion depth exceeded while calling a Python object

Additional context

No error is thrown when only two parameters are passed to the annotation.

@dataclass
class FioParams:
    name: str
    size: str
    ioengine: IoEngine
    iodepth: int
    rate_iops: int
    io_submit_mode: IoSubmitMode
    direct: typing.Annotated[Optional[int], validation.min(0)] = 0
    atomic: typing.Annotated[Optional[int], validation.min(0)] = 0
    buffered: typing.Annotated[Optional[int], validation.min(0)] = 1
    readwrite: Optional[IoPattern] = IoPattern.read.value
    rate_process: Optional[RateProcess] = RateProcess.linear.value
❯ python fio_plugin.py -f mocks/poisson-rate-submission_input.yaml --debug
output_id: success
output_data:
  fio version: fio-3.29
  timestamp: 1660068143
  timestamp_ms: 1660068143658
  time: Tue Aug  9 14:02:23 2022
  jobs:
  - jobname: poisson-rate-submit
    groupid: 0
    error: 0
    eta: 2147483647
    elapsed: 1
    job options:
      name: poisson-rate-submit
      size: 100k
      ioengine: sync
      iodepth: '32'
      rate_iops: '50'
      io_submit_mode: inline
      direct: '1'
      atomic: '0'
      buffered: '1'
      rw: randrw
      rate_process: poisson
    read:
      io_bytes: 28672
      io_kbytes: 28
      bw_bytes: 141241
      bw: 137
      iops: 34.482759
      runtime: 203
      total_ios: 7
      short_ios: 0
      drop_ios: 0
      slat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
      clat_ns:
        min: 300748
        max: 1064058
        mean: 487893.0
        stddev: 261419.937943
        N: 7
        percentile:
          '1.000000': 301056
          '5.000000': 301056
          '10.000000': 301056
          '20.000000': 333824
          '30.000000': 374784
          '40.000000': 374784
          '50.000000': 411648
          '60.000000': 464896
          '70.000000': 464896
          '80.000000': 464896
          '90.000000': 1056768
          '95.000000': 1056768
          '99.000000': 1056768
          '99.500000': 1056768
          '99.900000': 1056768
          '99.950000': 1056768
          '99.990000': 1056768
        bins:
          '301056': 1
          '333824': 1
          '374784': 1
          '411648': 1
          '464896': 2
          '1056768': 1
      lat_ns:
        min: 301981
        max: 1065275
        mean: 489172.285714
        stddev: 261379.680253
        N: 7
      bw_min: 0
      bw_max: 0
      bw_agg: 0.0
      bw_mean: 0.0
      bw_dev: 0.0
      bw_samples: 0
      iops_min: 0
      iops_max: 0
      iops_mean: 0.0
      iops_stddev: 0.0
      iops_samples: 0
    write:
      io_bytes: 73728
      io_kbytes: 72
      bw_bytes: 363192
      bw: 354
      iops: 88.669951
      runtime: 203
      total_ios: 18
      short_ios: 0
      drop_ios: 0
      slat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
      clat_ns:
        min: 68450
        max: 133276
        mean: 91804.888889
        stddev: 17230.069379
        N: 18
        percentile:
          '1.000000': 68096
          '5.000000': 68096
          '10.000000': 73216
          '20.000000': 75264
          '30.000000': 79360
          '40.000000': 82432
          '50.000000': 83456
          '60.000000': 95744
          '70.000000': 103936
          '80.000000': 107008
          '90.000000': 107008
          '95.000000': 134144
          '99.000000': 134144
          '99.500000': 134144
          '99.900000': 134144
          '99.950000': 134144
          '99.990000': 134144
        bins:
          '68096': 1
          '73216': 1
          '74240': 1
          '75264': 1
          '78336': 1
          '79360': 1
          '80384': 1
          '82432': 1
          '83456': 1
          '94720': 1
          '95744': 1
          '103936': 2
          '107008': 4
          '134144': 1
      lat_ns:
        min: 69953
        max: 135634
        mean: 93775.388889
        stddev: 17508.57394
        N: 18
      bw_min: 0
      bw_max: 0
      bw_agg: 0.0
      bw_mean: 0.0
      bw_dev: 0.0
      bw_samples: 0
      iops_min: 0
      iops_max: 0
      iops_mean: 0.0
      iops_stddev: 0.0
      iops_samples: 0
    trim:
      io_bytes: 0
      io_kbytes: 0
      bw_bytes: 0
      bw: 0
      iops: 0.0
      runtime: 0
      total_ios: 0
      short_ios: 0
      drop_ios: 0
      slat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
      clat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
      lat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
      bw_min: 0
      bw_max: 0
      bw_agg: 0.0
      bw_mean: 0.0
      bw_dev: 0.0
      bw_samples: 0
      iops_min: 0
      iops_max: 0
      iops_mean: 0.0
      iops_stddev: 0.0
      iops_samples: 0
    sync:
      total_ios: 0
      lat_ns:
        min: 0
        max: 0
        mean: 0.0
        stddev: 0.0
        N: 0
    job_runtime: 202
    usr_cpu: 0.0
    sys_cpu: 1.485149
    ctx: 30
    majf: 0
    minf: 15
    iodepth_level:
      '1': 100.0
      '2': 0.0
      '4': 0.0
      '8': 0.0
      '16': 0.0
      '32': 0.0
      '>=64': 0.0
    iodepth_submit:
      '0': 0.0
      '4': 100.0
      '8': 0.0
      '16': 0.0
      '32': 0.0
      '64': 0.0
      '>=64': 0.0
    iodepth_complete:
      '0': 0.0
      '4': 100.0
      '8': 0.0
      '16': 0.0
      '32': 0.0
      '64': 0.0
      '>=64': 0.0
    latency_ns:
      '2': 0.0
      '4': 0.0
      '10': 0.0
      '20': 0.0
      '50': 0.0
      '100': 0.0
      '250': 0.0
      '500': 0.0
      '750': 0.0
      '1000': 0.0
    latency_us:
      '2': 0.0
      '4': 0.0
      '10': 0.0
      '20': 0.0
      '50': 0.0
      '100': 44.0
      '250': 28.0
      '500': 24.0
      '750': 0.0
      '1000': 0.0
    latency_ms:
      '2': 4.0
      '4': 0.0
      '10': 0.0
      '20': 0.0
      '50': 0.0
      '100': 0.0
      '250': 0.0
      '500': 0.0
      '750': 0.0
      '1000': 0.0
      '2000': 0.0
      '>=2000': 0.0
    latency_depth: 32
    latency_target: 0
    latency_percentile: 100.0
    latency_window: 0
  disk_util:
  - name: dm-3
    read_ios: 5
    write_ios: 0
    read_merges: 0
    write_merges: 0
    read_ticks: 2
    write_ticks: 0
    in_queue: 2
    util: 2.857143
    aggr_read_ios: 7
    aggr_write_ios: 0
    aggr_read_merges: 0
    aggr_write_merge: 0
    aggr_read_ticks: 3
    aggr_write_ticks: 0
    aggr_in_queue: 3
    aggr_util: 3.08642
  - name: dm-0
    read_ios: 7
    write_ios: 0
    read_merges: 0
    write_merges: 0
    read_ticks: 3
    write_ticks: 0
    in_queue: 3
    util: 3.08642
    aggr_read_ios: 7
    aggr_write_ios: 0
    aggr_read_merges: 0
    aggr_write_merge: 0
    aggr_read_ticks: 2
    aggr_write_ticks: 0
    aggr_in_queue: 2
    aggr_util: 3.08642
  - name: nvme0n1
    read_ios: 7
    write_ios: 0
    read_merges: 0
    write_merges: 0
    read_ticks: 2
    write_ticks: 0
    in_queue: 2
    util: 3.08642