Skip to content

Commit 9a94381

Browse files
authored
cherry pick #24041: fixing BigQuery Query retry vulnerability (#24095)
* add random string at the end of query job name * use deterministic temp table name
1 parent 21b4320 commit 9a94381

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryQueryHelper.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,21 @@ public static TableReference executeQuery(
119119
}
120120

121121
// Step 2: Create a temporary dataset in the query location only if the user has not specified
122-
// a temp dataset.
123-
String queryJobId =
122+
// a temp dataset. The temp table name may be deterministic but the query job ID has to be
123+
// non-deterministic to protect against retries. If BigQuery sees a repeated query job ID, it
124+
// will be skipped.
125+
String tempTableID =
124126
BigQueryResourceNaming.createJobIdPrefix(options.getJobName(), stepUuid, JobType.QUERY);
127+
String queryJobId =
128+
BigQueryResourceNaming.createJobIdPrefix(
129+
options.getJobName(), stepUuid, JobType.QUERY, BigQueryHelpers.randomUUIDString());
125130
Optional<String> queryTempDatasetOpt = Optional.ofNullable(queryTempDatasetId);
126131
TableReference queryResultTable =
127132
createTempTableReference(
128133
options.getBigQueryProject() == null
129134
? options.getProject()
130135
: options.getBigQueryProject(),
131-
queryJobId,
136+
tempTableID,
132137
queryTempDatasetOpt);
133138

134139
boolean beamToCreateTempDataset = !queryTempDatasetOpt.isPresent();

0 commit comments

Comments
 (0)