{"record":{"id":"9723422b069ca488","repo":"apache/beam","slug":"fuzz-parameter-expected-to-be-in-0-1-range","errorCode":null,"errorMessage":"fuzz parameter expected to be in [0, 1] range.","messagePattern":"fuzz parameter expected to be in \\[0, 1\\] range\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/utils/retry.py","lineNumber":106,"sourceCode":"      seconds), such that the sum is <= stop_after_secs. Defaults to disabled\n      (None). You may need to increase num_retries to effectively use this\n      feature.\n  \"\"\"\n  def __init__(\n      self,\n      initial_delay_secs,\n      num_retries,\n      factor=2,\n      fuzz=0.5,\n      max_delay_secs=60 * 60 * 1,\n      stop_after_secs=None):\n    self._initial_delay_secs = initial_delay_secs\n    if num_retries > 10000:\n      raise ValueError('num_retries parameter cannot exceed 10000.')\n    self._num_retries = num_retries\n    self._factor = factor\n    if not 0 <= fuzz <= 1:\n      raise ValueError('fuzz parameter expected to be in [0, 1] range.')\n    self._fuzz = fuzz\n    self._max_delay_secs = max_delay_secs\n    self._stop_after_secs = stop_after_secs\n\n  def __iter__(self):\n    current_delay_secs = min(self._max_delay_secs, self._initial_delay_secs)\n    total_delay_secs = 0\n    for _ in range(self._num_retries):\n      fuzz_multiplier = 1 - self._fuzz + random.random() * self._fuzz\n      delay_secs = current_delay_secs * fuzz_multiplier\n      total_delay_secs += delay_secs\n      if (self._stop_after_secs is not None and\n          total_delay_secs > self._stop_after_secs):\n        break\n      yield delay_secs\n      current_delay_secs = min(\n          self._max_delay_secs, current_delay_secs * self._factor)\n","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/utils/retry.py#L88-L124","documentation":"RetryPolicy.__init__ validates the `fuzz` argument, which randomizes backoff delays to avoid thundering-herd retries; values outside [0, 1] would produce negative or magnified delays, so they are rejected at policy construction.","triggerScenarios":"Constructing a retry guard with fuzz < 0 or fuzz > 1 (e.g. fuzz=2 intended as '2x jitter', or fuzz passed in percent like 50).","commonSituations":"Passing jitter as a percentage (50) or multiplier (1.5) instead of a fraction (0.5); sign errors from computed values.","solutions":["Pass fuzz as a fraction: 0 for no jitter, 0.5 for ±50%","Clamp the value: fuzz = max(0.0, min(1.0, fuzz))","Check config parsing if fuzz comes from a YAML/flag that supplies percent values"],"exampleFix":"// before\nretry.WithFixedDelay(1, 60, fuzz=50)\n// after\nretry.WithFixedDelay(1, 60, fuzz=0.5)","handlingStrategy":"validation","validationCode":"fuzz = max(0.0, min(1.0, float(fuzz)))\nassert 0 <= fuzz <= 1","typeGuard":null,"tryCatchPattern":"try:\n    guard = retry.WithFixedDelay(1, 60, fuzz=fuzz)\nexcept ValueError as e:\n    logging.error('bad fuzz value: %s', e)\n    guard = retry.WithFixedDelay(1, 60, fuzz=0.5)","preventionTips":["Remember fuzz is a fraction in [0,1], not a percent or multiplier","Clamp values computed from config before constructing the guard","Add a config-schema check for jitter settings"],"tags":["retry","validation","config"],"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"}