{"record":{"id":"2cff9863b7b1a6f7","repo":"apache/beam","slug":"poll-interval-sec-must-be-15-got-poll-interval-sec","errorCode":null,"errorMessage":"poll_interval_sec must be >= 15, got {poll_interval_sec}","messagePattern":"poll_interval_sec must be >= 15, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/io/gcp/bigquery_change_history.py","lineNumber":1218,"sourceCode":"      batch_arrow_read: bool = True,\n      max_split_rounds: int = 1,\n      reshuffle_decompress: bool = True) -> None:\n    super().__init__()\n    if bq_storage is None:\n      raise ImportError(\n          'google-cloud-bigquery-storage is required for '\n          'ReadBigQueryChangeHistory. Install it with: '\n          'pip install google-cloud-bigquery-storage')\n    if pyarrow is None:\n      raise ImportError(\n          'pyarrow is required for ReadBigQueryChangeHistory. '\n          'Install it with: pip install pyarrow')\n    if change_function not in ('CHANGES', 'APPENDS'):\n      raise ValueError(\n          f\"change_function must be 'CHANGES' or 'APPENDS', \"\n          f\"got '{change_function}'\")\n    if poll_interval_sec < 15:\n      raise ValueError(\n          f'poll_interval_sec must be >= 15, got {poll_interval_sec}')\n    if buffer_sec < 0:\n      raise ValueError(f'buffer_sec must be >= 0, got {buffer_sec}')\n    self._table = table\n    self._poll_interval_sec = poll_interval_sec\n    self._start_time = start_time\n    self._stop_time = stop_time\n    self._change_function = change_function\n    self._buffer_sec = buffer_sec\n    self._project = project\n    self._temp_dataset = temp_dataset\n    self._location = location\n    self._change_type_column = change_type_column\n    self._change_timestamp_column = change_timestamp_column\n    self._columns = columns\n    self._row_filter = row_filter\n    self._batch_arrow_read = batch_arrow_read\n    self._max_split_rounds = max_split_rounds","sourceCodeStart":1200,"sourceCodeEnd":1236,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/io/gcp/bigquery_change_history.py#L1200-L1236","documentation":"The change-history poller enforces a minimum poll interval of 15 seconds, because BigQuery's change history has latency and polling more aggressively wastes API quota without yielding new data. A smaller poll_interval_sec raises ValueError at construction time.","triggerScenarios":"Constructing ReadFromBigQueryChangeHistory with poll_interval_sec < 15 (e.g. poll_interval_sec=5 or 0) in a streaming pipeline.","commonSituations":"Trying to reduce latency by tightening the poll interval; passing 0 or None-like values expecting defaults; unit-test configs with tiny intervals.","solutions":["Set poll_interval_sec to at least 15 (e.g. poll_interval_sec=30).","If you need lower end-to-end latency, consider the arrow-batch/streaming read paths instead of faster polling.","Omit the parameter to use the transform's default interval if one exists."],"exampleFix":"// before\nReadFromBigQueryChangeHistory(..., poll_interval_sec=5)\n// after\nReadFromBigQueryChangeHistory(..., poll_interval_sec=30)","handlingStrategy":"validation","validationCode":"if poll_interval_sec < 15:\n    poll_interval_sec = 15  # or raise early with a clear message","typeGuard":null,"tryCatchPattern":"try:\n    transform = ReadFromBigQueryChangeHistory(..., poll_interval_sec=p)\nexcept ValueError as e:\n    log.error(\"invalid poll_interval_sec: %s\", e)","preventionTips":["Clamp poll_interval_sec to >= 15 when sourced from pipeline options","Do not try to lower latency below the API-supported poll floor","Use 30-60s intervals in production to respect BigQuery quota"],"tags":["python","apache-beam","bigquery","config","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}