{"record":{"id":"58dc0e47842ca2d1","repo":"apache/beam","slug":"per-element-sleep-time-must-be-at-least-1e-3-received-r","errorCode":null,"errorMessage":"Per element sleep time must be at least 1e-3. Received: %r","messagePattern":"Per element sleep time must be at least 1e-3\\. Received: %r","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/testing/synthetic_pipeline.py","lineNumber":154,"sourceCode":"      break\n    stop = start + int(num_total_records * relative_bundle_sizes[index])\n    bundle_ranges.append((start, stop))\n    start = stop\n    index += 1\n  return bundle_ranges\n\n\nclass SyntheticStep(beam.DoFn):\n  \"\"\"A DoFn of which behavior can be controlled through prespecified parameters.\n  \"\"\"\n  def __init__(\n      self,\n      per_element_delay_sec=0,\n      per_bundle_delay_sec=0,\n      output_records_per_input_record=1,\n      output_filter_ratio=0):\n    if per_element_delay_sec and per_element_delay_sec < 1e-3:\n      raise ValueError(\n          'Per element sleep time must be at least 1e-3. '\n          'Received: %r',\n          per_element_delay_sec)\n    self._per_element_delay_sec = per_element_delay_sec\n    self._per_bundle_delay_sec = per_bundle_delay_sec\n    self._output_records_per_input_record = output_records_per_input_record\n    self._output_filter_ratio = output_filter_ratio\n\n  def start_bundle(self):\n    self._start_time = time.time()\n\n  def finish_bundle(self):\n    # The target is for the enclosing stage to take as close to as possible\n    # the given number of seconds, so we only sleep enough to make up for\n    # overheads not incurred elsewhere.\n    to_sleep = self._per_bundle_delay_sec - (time.time() - self._start_time)\n\n    # Ignoring sub-millisecond sleep times.","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/testing/synthetic_pipeline.py#L136-L172","documentation":"SyntheticStep.__init__ enforces that a nonzero per_element_delay_sec is at least 1e-3 seconds, because per-element sleeps are implemented with time granularity finer delays cannot honor. Values like 0.0005 are rejected with ValueError.","triggerScenarios":"Constructing SyntheticStep with per_element_delay_sec between 0 and 1e-3 (exclusive), e.g. 0.0001; 0 itself is allowed since the check is guarded by truthiness.","commonSituations":"Config JSON generated by tools specifying sub-millisecond delays; unit confusion (microseconds vs seconds); blindly scaling delays down.","solutions":["Set per_element_delay_sec >= 0.001, or use 0 to disable per-element delay","Convert your desired delay into per-bundle delay (per_bundle_delay_sec) if sub-millisecond per-element pauses are needed","Update the config spec producing the value"],"exampleFix":"// before\nSyntheticStep(per_element_delay_sec=0.0001)\n// after\nSyntheticStep(per_element_delay_sec=0.001)  # or per_bundle_delay_sec=0.0001*batch","handlingStrategy":"validation","validationCode":"if per_element_delay_sec and per_element_delay_sec < 1e-3:\n    raise ValueError('per_element_delay_sec must be 0 or >= 1e-3')","typeGuard":"def valid_delay(v):\n    return not v or v >= 1e-3","tryCatchPattern":"try:\n    step = SyntheticStep(per_element_delay_sec=d)\nexcept ValueError as e:\n    _LOGGER.error('%s; clamping to 1e-3', e)\n    step = SyntheticStep(per_element_delay_sec=1e-3)","preventionTips":["Clamp delays to >= 0.001 in spec-loading code","Keep all delay values in seconds consistently","Validate the whole synthetic spec before building the pipeline"],"tags":["value-out-of-range","synthetic-pipeline","delay"],"backgroundTag":"value-out-of-range","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}