sweet/benchmarks/internal/server: collect at least one profile
For profiles that can't be truncated, make sure we collect at least
one 1-second profile from servers. This is important for PGO
benchmarks, which must first do a profile run. Etcd, in particular,
may not run long enough for a complete profile without this.
Change-Id: I4f26dd43d0a3cfd5fa7a4eda488e8b71bbfb65f0
Reviewed-on: https://go-review.googlesource.com/c/benchmarks/+/600756
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
diff --git a/sweet/benchmarks/internal/server/server.go b/sweet/benchmarks/internal/server/server.go
index 42681fe..c71b20c 100644
--- a/sweet/benchmarks/internal/server/server.go
+++ b/sweet/benchmarks/internal/server/server.go
@@ -13,6 +13,7 @@
"os"
"strings"
"sync"
+ "time"
"golang.org/x/benchmarks/sweet/benchmarks/internal/driver"
"golang.org/x/benchmarks/sweet/common/diagnostics"
@@ -51,8 +52,18 @@
go func() {
defer wg.Done()
+ // If we can't truncate this diagnostic, make sure we collect it at
+ // least once. This is important for PGO, which first does a profiling run.
+ ctx1 := ctx
+ if typ.CanMerge() && !typ.CanTruncate() {
+ var cancel1 func()
+ ctx1, cancel1 = context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel1()
+ }
+
for {
- err := collectTo(ctx, host, diag, typ, name)
+ err := collectTo(ctx1, host, diag, typ, name)
+ ctx1 = ctx
if err != nil {
if !errors.Is(err, context.Canceled) {
fmt.Fprintf(os.Stderr, "failed to read diagnostic %s: %v", typ, err)