From dabed2e09a888ec33b385006890d3c66f2ced8ca Mon Sep 17 00:00:00 2001
From: Than McIntosh <thanm@google.com>
Date: Tue, 16 Jul 2024 19:13:47 +0000
Subject: [PATCH] [release-branch.go1.21] cmd/internal/cov: close counter data
 files eagerly

When reading the counter data files from a given pod, close the
underlying *os.File immediately after each one is read, as opposed to
using a deferred close in the loop (which will close them all at the
end of the function). Doing things this way avoids running into "too
many open files" when processing large clumps of counter data files.

Fixes #68491.
Updates #68468.

Change-Id: Ic1fe1d36c44d3f5d7318578cd18d0e65465d71d9
Reviewed-on: https://go-review.googlesource.com/c/go/+/598735
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit 355711821eea51c6456a31ab61d0dc2e9db034f7)
Reviewed-on: https://go-review.googlesource.com/c/go/+/599055
---
 src/cmd/internal/cov/readcovdata.go | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/cmd/internal/cov/readcovdata.go b/src/cmd/internal/cov/readcovdata.go
index 086be40e903..e0e06344595 100644
--- a/src/cmd/internal/cov/readcovdata.go
+++ b/src/cmd/internal/cov/readcovdata.go
@@ -204,15 +204,12 @@ func (r *CovDataReader) visitPod(p pods.Pod) error {
 	}
 	r.vis.VisitMetaDataFile(p.MetaFile, mfr)
 
-	// Read counter data files.
-	for k, cdf := range p.CounterDataFiles {
+	processCounterDataFile := func(cdf string, k int) error {
 		cf, err := os.Open(cdf)
 		if err != nil {
 			return r.fatal("opening counter data file %s: %s", cdf, err)
 		}
-		defer func(f *os.File) {
-			f.Close()
-		}(cf)
+		defer cf.Close()
 		var mr *MReader
 		mr, err = NewMreader(cf)
 		if err != nil {
@@ -236,6 +233,14 @@ func (r *CovDataReader) visitPod(p pods.Pod) error {
 			r.vis.VisitFuncCounterData(data)
 		}
 		r.vis.EndCounterDataFile(cdf, cdr, p.Origins[k])
+		return nil
+	}
+
+	// Read counter data files.
+	for k, cdf := range p.CounterDataFiles {
+		if err := processCounterDataFile(cdf, k); err != nil {
+			return err
+		}
 	}
 	r.vis.EndCounters()
 
-- 
GitLab