internal/worker: annotate errors

The initial approach used sync.Once to synchronize
the assignment of errString. This was still racey, however.

Instead, annotate the error to keep the values together, removing
the need for any sync.

Fixes #39611

Change-Id: Ifb889855a5bd583b36a876dff5e44f85812733d3
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/238041
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/worker/server.go b/internal/worker/server.go
index 3d18cfa..c78ec7c 100644
--- a/internal/worker/server.go
+++ b/internal/worker/server.go
@@ -345,15 +345,17 @@
 	var (
 		next, failures, recents []*internal.ModuleVersionState
 		stats                   *postgres.VersionStats
-		errString               string
 	)
+	type annotation struct {
+		error
+		msg string
+	}
 	g, ctx := errgroup.WithContext(r.Context())
 	g.Go(func() error {
 		var err error
 		next, err = s.db.GetNextModulesToFetch(ctx, pageSize)
 		if err != nil {
-			errString = "error fetching next versions"
-			return err
+			return annotation{err, "error fetching next versions"}
 		}
 		return nil
 	})
@@ -361,8 +363,7 @@
 		var err error
 		failures, err = s.db.GetRecentFailedVersions(ctx, pageSize)
 		if err != nil {
-			errString = "error fetching recent failures"
-			return err
+			return annotation{err, "error fetching recent failures"}
 		}
 		return nil
 	})
@@ -370,8 +371,7 @@
 		var err error
 		recents, err = s.db.GetRecentVersions(ctx, pageSize)
 		if err != nil {
-			errString = "error fetching recent versions"
-			return err
+			return annotation{err, "error fetching recent versions"}
 		}
 		return nil
 	})
@@ -379,13 +379,16 @@
 		var err error
 		stats, err = s.db.GetVersionStats(ctx)
 		if err != nil {
-			errString = "error fetching stats"
-			return err
+			return annotation{err, "error fetching stats"}
 		}
 		return nil
 	})
 	if err := g.Wait(); err != nil {
-		return errString, err
+		var e annotation
+		if errors.As(err, &e) {
+			return e.msg, err
+		}
+		return "", err
 	}
 
 	type count struct {