internal/buildstats: Close bigquery and datastore clients after use

SyncBuilds and SyncSpans are invoked by cmd/coordinator/*
without invoking Close for the various bigquery and datastore
clients instantiations. In syncBuildStatsLoop, SyncSpans is
invoked in a [5min, 16min) loop, which will leave a bunch of
underlying resources and HTTP connections unclosed.

Change-Id: I8713c26c31daef3fc1b2c65a2d1bbfc74c8a63ba
Reviewed-on: https://go-review.googlesource.com/138695
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/internal/buildstats/buildstats.go b/internal/buildstats/buildstats.go
index 1b0995a..799744a 100644
--- a/internal/buildstats/buildstats.go
+++ b/internal/buildstats/buildstats.go
@@ -30,6 +30,8 @@
 	if err != nil {
 		return err
 	}
+	defer bq.Close()
+
 	buildsTable := bq.Dataset("builds").Table("Builds")
 	meta, err := buildsTable.Metadata(ctx)
 	if ae, ok := err.(*googleapi.Error); ok && ae.Code == 404 {
@@ -104,6 +106,7 @@
 	if err != nil {
 		return fmt.Errorf("datastore.NewClient: %v", err)
 	}
+	defer ds.Close()
 
 	up := buildsTable.Uploader()
 
@@ -176,6 +179,8 @@
 	if err != nil {
 		log.Fatal(err)
 	}
+	defer bq.Close()
+
 	table := bq.Dataset("builds").Table("Spans")
 	meta, err := table.Metadata(ctx)
 	if ae, ok := err.(*googleapi.Error); ok && ae.Code == 404 {
@@ -247,6 +252,7 @@
 	if err != nil {
 		return fmt.Errorf("datastore.NewClient: %v", err)
 	}
+	defer ds.Close()
 
 	up := table.Uploader()