{"record":{"id":"20c994860fca97d5","repo":"apache/iceberg","slug":"s-20c994","errorCode":null,"errorMessage":"%s","messagePattern":"%s","errorType":"exception","errorClass":"RuntimeIOException","httpStatus":null,"severity":"error","filePath":"bigquery/src/main/java/org/apache/iceberg/gcp/bigquery/BigQueryMetastoreClientImpl.java","lineNumber":361,"sourceCode":"      handleBigQueryRetryException(e);\n    }\n\n    return response;\n  }\n\n  private Table internalCreate(Table table) {\n    try {\n      HttpResponse response =\n          client\n              .tables()\n              .insert(\n                  Preconditions.checkNotNull(table.getTableReference()).getProjectId(),\n                  Preconditions.checkNotNull(table.getTableReference()).getDatasetId(),\n                  table)\n              .executeUnparsed();\n      return convertExceptionIfUnsuccessful(response).parseAs(Table.class);\n    } catch (IOException e) {\n      throw new RuntimeIOException(\"%s\", e);\n    } catch (AlreadyExistsException e) {\n      throw new AlreadyExistsException(e, \"Table already exists: %s\", table);\n    }\n  }\n\n  @Override\n  public Table load(TableReference tableReference) {\n    try {\n      HttpResponse response =\n          client\n              .tables()\n              .get(\n                  tableReference.getProjectId(),\n                  tableReference.getDatasetId(),\n                  tableReference.getTableId())\n              .executeUnparsed();\n      if (response.getStatusCode() == HttpStatusCodes.STATUS_CODE_NOT_FOUND) {\n        throw new NoSuchTableException(\"%s\", response.getStatusMessage());","sourceCodeStart":343,"sourceCodeEnd":379,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/bigquery/src/main/java/org/apache/iceberg/gcp/bigquery/BigQueryMetastoreClientImpl.java#L343-L379","documentation":"RuntimeIOException from BigQueryMetastoreClientImpl.internalCreate when the tables.insert HTTP call to BigQuery fails with an IOException (network error, interrupted connection, transport failure). The message is the exception's own text, with the original exception chained as the cause.","triggerScenarios":"client.create(table) (via catalog.buildTable/registerTable create paths) where the underlying HTTP transport to the BigQuery API breaks: DNS failure, socket timeout, connection reset, or interrupted request.","commonSituations":"Transient GCP API outages, VPC/egress firewall blocking googleapis.com, proxy misconfiguration, long request bodies dropped on flaky networks, tight HTTP timeouts under load.","solutions":["Retry with backoff; RuntimeIOException here is usually transient","Verify network path to bigquery.googleapis.com (firewall, proxy, DNS)","Increase HTTP transport timeout configuration for the BigQuery client","Inspect the chained cause (e.getCause()) for the root transport error"],"exampleFix":"// before\ncatalog.createTable(ident, schema); // transient IOException aborts job\n// after\ntry {\n  catalog.createTable(ident, schema);\n} catch (RuntimeIOException e) {\n  // retry with backoff\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { client.create(table); } catch (RuntimeIOException e) { /* retry with exponential backoff; inspect e.getCause() */ }","preventionTips":["Configure adequate HTTP timeouts for the BigQuery transport","Ensure firewall/proxy allows egress to bigquery.googleapis.com","Retry transient IO failures with backoff instead of failing the job"],"tags":["bigquery","io","network","http"],"backgroundTag":"http-request-failed","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}