{"record":{"id":"594f272a394e3858","repo":"apache/beam","slug":"buffer-sec-must-be-0-got-buffer-sec","errorCode":null,"errorMessage":"buffer_sec must be >= 0, got {buffer_sec}","messagePattern":"buffer_sec must be >= 0, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/io/gcp/bigquery_change_history.py","lineNumber":1221,"sourceCode":"    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\n    self._reshuffle_decompress = reshuffle_decompress\n\n  def expand(self, pbegin: beam.pvalue.PBegin) -> beam.PCollection:","sourceCodeStart":1203,"sourceCodeEnd":1239,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/io/gcp/bigquery_change_history.py#L1203-L1239","documentation":"buffer_sec is a safety buffer subtracted/added around poll boundaries to avoid missing late-committing rows near the watermark. A negative value is meaningless and rejected with ValueError at construction time.","triggerScenarios":"Constructing ReadFromBigQueryChangeHistory with a negative buffer_sec (e.g. buffer_sec=-10).","commonSituations":"Sign errors when computing the buffer from another duration; misreading buffer_sec as an offset that may be negative; templated parameters defaulting to negative values.","solutions":["Set buffer_sec to a non-negative number (e.g. buffer_sec=0 or a small positive value like 1-5 seconds).","Use 0 if you want no buffer; positive values add safety margin for late commits.","If the value comes from a pipeline option, clamp it: max(0, option_value)."],"exampleFix":"// before\nReadFromBigQueryChangeHistory(..., buffer_sec=-5)\n// after\nReadFromBigQueryChangeHistory(..., buffer_sec=0)","handlingStrategy":"validation","validationCode":"if buffer_sec < 0:\n    raise ValueError(\"buffer_sec must be >= 0\")","typeGuard":null,"tryCatchPattern":"try:\n    transform = ReadFromBigQueryChangeHistory(..., buffer_sec=b)\nexcept ValueError as e:\n    log.error(\"invalid buffer_sec: %s\", e)","preventionTips":["Clamp buffer_sec with max(0, value) when it comes from options or config","Use 0 for no buffer; positive values only for late-commit safety","Check signs when computing buffer_sec from other durations"],"tags":["python","apache-beam","bigquery","config","validation"],"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-14T16:17:12.679Z"}