maintnerd: reduce some log verbosity, add goroutine handler

Change-Id: Iad57acc5ff889883fed3e85dc1f5b37ac5f72e46
Reviewed-on: https://go-review.googlesource.com/c/build/+/206179
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/maintner/maintnerd/gcslog/gcslog.go b/maintner/maintnerd/gcslog/gcslog.go
index c8bf2dd..a6f8076 100644
--- a/maintner/maintnerd/gcslog/gcslog.go
+++ b/maintner/maintnerd/gcslog/gcslog.go
@@ -49,6 +49,7 @@
 	bucketName    string
 	bucket        *storage.BucketHandle
 	segmentPrefix string
+	debug         bool
 
 	mu         sync.Mutex // guards the following
 	cond       *sync.Cond
@@ -279,7 +280,9 @@
 	defer gl.mu.Unlock()
 	for {
 		if curSize := gl.sumSizeLocked(); curSize != v {
-			log.Printf("waitSize fired. from %d => %d", v, curSize)
+			if gl.debug {
+				log.Printf("gcslog: waitSize fired. from %d => %d", v, curSize)
+			}
 			return true
 		}
 		select {
@@ -362,6 +365,11 @@
 	return len(p), nil
 }
 
+// SetDebug controls whether verbose debugging is enabled on this log.
+//
+// It must only be called before it's used.
+func (gl *GCSLog) SetDebug(v bool) { gl.debug = v }
+
 // Log writes m to GCS after the buffer is full or after a periodic flush.
 func (gl *GCSLog) Log(m *maintpb.Mutation) error {
 	data, err := proto.Marshal(m)
diff --git a/maintner/maintnerd/maintnerd.go b/maintner/maintnerd/maintnerd.go
index c271696..b5ca11f 100644
--- a/maintner/maintnerd/maintnerd.go
+++ b/maintner/maintnerd/maintnerd.go
@@ -18,6 +18,7 @@
 	"net"
 	"net/http"
 	"net/http/httptest"
+	_ "net/http/pprof"
 	"os"
 	"path/filepath"
 	"runtime"
@@ -161,6 +162,7 @@
 			if err != nil {
 				log.Fatalf("newGCSLog: %v", err)
 			}
+			gl.SetDebug(*debug)
 			gl.RegisterHandlers(http.DefaultServeMux)
 			if *migrateGCSFlag {
 				diskLog := maintner.NewDiskMutationLogger(*dataDir)
@@ -255,6 +257,9 @@
 	grpcServer := grpc.NewServer()
 	apipb.RegisterMaintnerServiceServer(grpcServer, maintapi.NewAPIService(corpus))
 	http.Handle("/apipb.MaintnerService/", grpcServer)
+	http.HandleFunc("/debug/goroutines", func(w http.ResponseWriter, r *http.Request) {
+		http.Redirect(w, r, "/debug/pprof/goroutine?debug=1", http.StatusFound)
+	})
 
 	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 		if strings.HasPrefix(r.Header.Get("Content-Type"), "application/grpc") {