aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2024-07-16 19:13:47 +0000
committerCherry Mui <cherryyz@google.com>2024-07-17 22:41:09 +0000
commit4c50f9162cafaccc1ab1bc26b0dea18f124b536d (patch)
tree77471a34701f97a6c4012b4977a796ccc402f05d
parent9e148a4150ece0c24e60197893c8821b2c67e151 (diff)
downloadgo-4c50f9162cafaccc1ab1bc26b0dea18f124b536d.tar.xz
[release-branch.go1.22] 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 #68492. 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/+/599036
-rw-r--r--src/cmd/internal/cov/readcovdata.go15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/cmd/internal/cov/readcovdata.go b/src/cmd/internal/cov/readcovdata.go
index 086be40e90..e0e0634459 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()