internal/vulndb: create vulndb table when reading from it

This is a correction of
https://go-review.git.corp.google.com/c/pkgsite-metrics/+/489855.

Change-Id: I0204fe59c0f78a0a36ff759bc6b8a7c87468c4ff
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/489935
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Julie Qiu <julieqiu@google.com>
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
diff --git a/internal/vulndb/vulndb.go b/internal/vulndb/vulndb.go
index 9f9d1df..738a9d8 100644
--- a/internal/vulndb/vulndb.go
+++ b/internal/vulndb/vulndb.go
@@ -114,6 +114,14 @@
 // most recent state of the vulnerability database at c.
 func ReadMostRecentDB(ctx context.Context, c *bigquery.Client) (entries []*Entry, err error) {
 	defer derrors.Wrap(&err, "ReadMostRecentDB")
+
+	// The server does not create vulndb table since it lives
+	// in a different dataset. Hence, one could get an error
+	// accessing it if it was not created in the past.
+	if _, err := c.CreateOrUpdateTable(ctx, TableName); err != nil {
+		return nil, err
+	}
+
 	query := bigquery.PartitionQuery{
 		Table:       c.FullTableName(TableName),
 		PartitionOn: "ID",
diff --git a/internal/worker/vulndb.go b/internal/worker/vulndb.go
index 273d80f..078e39a 100644
--- a/internal/worker/vulndb.go
+++ b/internal/worker/vulndb.go
@@ -69,18 +69,15 @@
 		return errors.New("failed to create go-vulndb bucket")
 	}
 
-	entries, err := vulndbEntries(ctx, bucket)
-	if err != nil {
-		return err
-	}
-	// lastModified should be run after vulndbEntries. The latter
-	// will create a vulndb table if one does not exist. The server
-	// does not create this table since it lives in a different
-	// dataset. Hence, one could get an error otherwise.
 	lmts, err := lastModified(ctx, dbClient)
 	if err != nil {
 		return err
 	}
+	entries, err := vulndbEntries(ctx, bucket)
+	if err != nil {
+		return err
+	}
+
 	for _, e := range entries {
 		lmt, ok := lmts[e.ID]
 		if ok && e.ModifiedTime.Equal(lmt) {