internal/worker: store govulncheck rows in a single transaction
The idea is to hopefully reduce the number of update operations
to the table, making it less likely to hit table.write quotas.
Change-Id: I7de75020b247c82194202396b5c67ee034bffee4
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/523715
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Maceo Thompson <maceothompson@google.com>
diff --git a/internal/worker/govulncheck_scan.go b/internal/worker/govulncheck_scan.go
index 206b2f6..c125868 100644
--- a/internal/worker/govulncheck_scan.go
+++ b/internal/worker/govulncheck_scan.go
@@ -355,25 +355,22 @@
}
log.Infof(ctx, "scanner.runScanModule returned %d vulns for %s: row.Vulns=%d err=%v", len(vulns), sreq.Path(), len(row.Vulns), err)
- if err := writeResult(ctx, sreq.Serve, w, s.bqClient, govulncheck.TableName, row); err != nil {
- return err
+ rows := []bigquery.Row{row}
+ if sreq.Mode == ModeGovulncheck {
+ // For ModeGovulncheck, add the copy of row and report
+ // each vulnerability as imported. We set the performance
+ // numbers to 0 since we don't actually perform a scan
+ // at the level of import chains. Also makes a copy if
+ // the original row has an error and no vulns.
+ impRow := *row
+ impRow.ScanMode = modeImports
+ impRow.ScanSeconds = 0
+ impRow.ScanMemory = 0
+ impRow.Vulns = vulnsForMode(vulns, modeImports)
+ log.Infof(ctx, "scanner.runScanModule also storing imports vulns for %s: row.Vulns=%d", sreq.Path(), len(impRow.Vulns))
+ rows = append(rows, &impRow)
}
-
- if sreq.Mode != ModeGovulncheck {
- return nil
- }
- // For ModeGovulncheck, add the copy of row and report
- // each vulnerability as imported. We set the performance
- // numbers to 0 since we don't actually perform a scan
- // at the level of import chains. Also makes a copy if
- // the original row has an error and no vulns.
- impRow := *row
- impRow.ScanMode = modeImports
- impRow.ScanSeconds = 0
- impRow.ScanMemory = 0
- impRow.Vulns = vulnsForMode(vulns, modeImports)
- log.Infof(ctx, "scanner.runScanModule also storing imports vulns for %s: row.Vulns=%d", sreq.Path(), len(impRow.Vulns))
- return writeResult(ctx, sreq.Serve, w, s.bqClient, govulncheck.TableName, &impRow)
+ return writeResults(ctx, sreq.Serve, w, s.bqClient, govulncheck.TableName, rows)
}
// vulnsForMode returns vulns that make sense to report for
diff --git a/internal/worker/scan.go b/internal/worker/scan.go
index 65e2f12..52306ef 100644
--- a/internal/worker/scan.go
+++ b/internal/worker/scan.go
@@ -168,6 +168,7 @@
return client.Upload(ctx, table, row)
}
+// writeResults is like writeResult but stores the rows in a single transaction.
func writeResults(ctx context.Context, serve bool, w http.ResponseWriter, client *bigquery.Client, table string, rows []bigquery.Row) (err error) {
defer derrors.Wrap(&err, "writeResults")