Skip to content

Commit 56772f5

Browse files
authored
fix(bigquery): respect context during query execution (#7693)
This PR updates query polling and insertion to better respect context status. Key change is to push context to the discovery library, but there are some small refactors to make use of context passing more consistent at various callsites. Fixes: https://togithub.com/googleapis/google-cloud-go/issues/7604
1 parent c02273d commit 56772f5

File tree

5 files changed

+31
-11
lines changed

5 files changed

+31
-11
lines changed

β€Žbigquery/bigquery.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func (c *Client) insertJob(ctx context.Context, job *bq.Job, media io.Reader) (*
173173
// Due to differences in options it supports, it cannot be used for all existing
174174
// jobs.insert requests that are query jobs.
175175
func (c *Client) runQuery(ctx context.Context, queryRequest *bq.QueryRequest) (*bq.QueryResponse, error) {
176-
call := c.bqs.Jobs.Query(c.projectID, queryRequest)
176+
call := c.bqs.Jobs.Query(c.projectID, queryRequest).Context(ctx)
177177
setClientHeader(call.Header())
178178

179179
var res *bq.QueryResponse

β€Žbigquery/iam.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ func (c *bqIAMClient) GetWithVersion(ctx context.Context, resource string, reque
5858
RequestedPolicyVersion: int64(requestedPolicyVersion),
5959
},
6060
}
61-
call := c.bqs.Tables.GetIamPolicy(resource, iamReq)
61+
call := c.bqs.Tables.GetIamPolicy(resource, iamReq).Context(ctx)
6262
setClientHeader(call.Header())
6363

6464
var bqp *bq.Policy
6565
err = runWithRetry(ctx, func() error {
66-
bqp, err = call.Context(ctx).Do()
66+
bqp, err = call.Do()
6767
return err
6868
})
6969
if err != nil {
@@ -77,10 +77,10 @@ func (c *bqIAMClient) Set(ctx context.Context, resource string, p *iampb.Policy)
7777
defer func() { trace.EndSpan(ctx, err) }()
7878

7979
bqp := iamToBigQueryPolicy(p)
80-
call := c.bqs.Tables.SetIamPolicy(resource, &bq.SetIamPolicyRequest{Policy: bqp})
80+
call := c.bqs.Tables.SetIamPolicy(resource, &bq.SetIamPolicyRequest{Policy: bqp}).Context(ctx)
8181
setClientHeader(call.Header())
8282
return runWithRetry(ctx, func() error {
83-
_, err := call.Context(ctx).Do()
83+
_, err := call.Do()
8484
return err
8585
})
8686
}
@@ -89,12 +89,12 @@ func (c *bqIAMClient) Test(ctx context.Context, resource string, perms []string)
8989
ctx = trace.StartSpan(ctx, "cloud.google.com/go/bigquery.IAM.Test")
9090
defer func() { trace.EndSpan(ctx, err) }()
9191

92-
call := c.bqs.Tables.TestIamPermissions(resource, &bq.TestIamPermissionsRequest{Permissions: perms})
92+
call := c.bqs.Tables.TestIamPermissions(resource, &bq.TestIamPermissionsRequest{Permissions: perms}).Context(ctx)
9393
setClientHeader(call.Header())
9494

9595
var res *bq.TestIamPermissionsResponse
9696
err = runWithRetry(ctx, func() error {
97-
res, err = call.Context(ctx).Do()
97+
res, err = call.Do()
9898
return err
9999
})
100100
if err != nil {

β€Žbigquery/inserter.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,7 @@ func (u *Inserter) putMulti(ctx context.Context, src []ValueSaver) error {
177177
if req == nil {
178178
return nil
179179
}
180-
call := u.t.c.bqs.Tabledata.InsertAll(u.t.ProjectID, u.t.DatasetID, u.t.TableID, req)
181-
call = call.Context(ctx)
180+
call := u.t.c.bqs.Tabledata.InsertAll(u.t.ProjectID, u.t.DatasetID, u.t.TableID, req).Context(ctx)
182181
setClientHeader(call.Header())
183182
var res *bq.TableDataInsertAllResponse
184183
err = runWithRetry(ctx, func() (err error) {

β€Žbigquery/integration_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,26 @@ func TestIntegration_JobFrom(t *testing.T) {
357357

358358
}
359359

360+
func TestIntegration_QueryContextTimeout(t *testing.T) {
361+
if client == nil {
362+
t.Skip("Integration tests skipped")
363+
}
364+
ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
365+
defer cancel()
366+
367+
q := client.Query("select count(*) from unnest(generate_array(1,1000000)), unnest(generate_array(1, 1000)) as foo")
368+
q.DisableQueryCache = true
369+
before := time.Now()
370+
_, err := q.Read(ctx)
371+
if err != context.DeadlineExceeded {
372+
t.Errorf("Read() error, wanted %v, got %v", context.DeadlineExceeded, err)
373+
}
374+
wantMaxDur := 500 * time.Millisecond
375+
if d := time.Since(before); d > wantMaxDur {
376+
t.Errorf("return duration too long, wanted max %v got %v", wantMaxDur, d)
377+
}
378+
}
379+
360380
func TestIntegration_SnapshotRestoreClone(t *testing.T) {
361381

362382
if client == nil {
@@ -581,6 +601,7 @@ func TestIntegration_RangePartitioning(t *testing.T) {
581601
t.Errorf("Range.Interval: got %v, wanted %v", gotInt64, wantedRange.Interval)
582602
}
583603
}
604+
584605
func TestIntegration_RemoveTimePartitioning(t *testing.T) {
585606
if client == nil {
586607
t.Skip("Integration tests skipped")

β€Žbigquery/iterator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ func fetchTableResultPage(ctx context.Context, src *rowSource, schema Schema, st
292292
func fetchJobResultPage(ctx context.Context, src *rowSource, schema Schema, startIndex uint64, pageSize int64, pageToken string) (*fetchPageResult, error) {
293293
// reduce data transfered by leveraging api projections
294294
projectedFields := []googleapi.Field{"rows", "pageToken", "totalRows"}
295-
call := src.j.c.bqs.Jobs.GetQueryResults(src.j.projectID, src.j.jobID).Location(src.j.location)
295+
call := src.j.c.bqs.Jobs.GetQueryResults(src.j.projectID, src.j.jobID).Location(src.j.location).Context(ctx)
296296
if schema == nil {
297297
// only project schema if we weren't supplied one.
298298
projectedFields = append(projectedFields, "schema")
@@ -309,7 +309,7 @@ func fetchJobResultPage(ctx context.Context, src *rowSource, schema Schema, star
309309
}
310310
var res *bq.GetQueryResultsResponse
311311
err := runWithRetry(ctx, func() (err error) {
312-
res, err = call.Context(ctx).Do()
312+
res, err = call.Do()
313313
return err
314314
})
315315
if err != nil {

0 commit comments

Comments
 (0)