aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/manager
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-08-27 12:10:17 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-11-03 15:02:52 +0000
commitdd2fced87f380640148c47009a36e6b5e1a1da19 (patch)
tree7111cc7f52166ffd697998cb836e5bae4090cf1d /pkg/manager
parent791d18fa26e3c5b62656e16b65aac5b748fcf8fc (diff)
pkg/manager: omit fs images from big coverage reports
In the presence of numerous program seeds that mount fs images, our html coverage reports end up being as big as 1GB, which makes it problematic to render/manipulate them in the web browser. Adjust coverage report generation: once the total size of program seeds exceeds 100MB, switch to the compact seed serialization mode.
Diffstat (limited to 'pkg/manager')
-rw-r--r--pkg/manager/http.go66
1 files changed, 52 insertions, 14 deletions
diff --git a/pkg/manager/http.go b/pkg/manager/http.go
index 61d208f41..881c8154d 100644
--- a/pkg/manager/http.go
+++ b/pkg/manager/http.go
@@ -539,7 +539,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
}()
}
- var progs []cover.Prog
+ var progs []coverProgRaw
if sig := r.FormValue("input"); sig != "" {
inp := corpus.Item(sig)
if inp == nil {
@@ -552,16 +552,16 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
http.Error(w, "bad call_id", http.StatusBadRequest)
return
}
- progs = append(progs, cover.Prog{
- Sig: sig,
- Data: string(inp.Prog.Serialize()),
- PCs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover),
+ progs = append(progs, coverProgRaw{
+ sig: sig,
+ prog: inp.Prog,
+ pcs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover),
})
} else {
- progs = append(progs, cover.Prog{
- Sig: sig,
- Data: string(inp.Prog.Serialize()),
- PCs: CoverToPCs(serv.Cfg, inp.Cover),
+ progs = append(progs, coverProgRaw{
+ sig: sig,
+ prog: inp.Prog,
+ pcs: CoverToPCs(serv.Cfg, inp.Cover),
})
}
} else {
@@ -570,10 +570,10 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
if call != "" && call != inp.StringCall() {
continue
}
- progs = append(progs, cover.Prog{
- Sig: inp.Sig,
- Data: string(inp.Prog.Serialize()),
- PCs: CoverToPCs(serv.Cfg, inp.Cover),
+ progs = append(progs, coverProgRaw{
+ sig: inp.Sig,
+ prog: inp.Prog,
+ pcs: CoverToPCs(serv.Cfg, inp.Cover),
})
}
}
@@ -588,7 +588,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
}
params := cover.HandlerParams{
- Progs: progs,
+ Progs: serv.serializeCoverProgs(progs),
Filter: coverFilter,
Debug: r.FormValue("debug") != "",
Force: r.FormValue("force") != "",
@@ -621,6 +621,44 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
}
}
+type coverProgRaw struct {
+ sig string
+ prog *prog.Prog
+ pcs []uint64
+}
+
+// Once the total size of corpus programs exceeds 100MB, skip fs images from it.
+const compactProgsCutOff = 100 * 1000 * 1000
+
+func (serv *HTTPServer) serializeCoverProgs(rawProgs []coverProgRaw) []cover.Prog {
+ skipImages := false
+outerLoop:
+ for {
+ var flags []prog.SerializeFlag
+ if skipImages {
+ flags = append(flags, prog.SkipImages)
+ }
+ totalSize := 0
+ var ret []cover.Prog
+ for _, item := range rawProgs {
+ prog := cover.Prog{
+ Sig: item.sig,
+ Data: string(item.prog.Serialize(flags...)),
+ PCs: item.pcs,
+ }
+ totalSize += len(prog.Data)
+ if totalSize > compactProgsCutOff && !skipImages {
+ log.Logf(0, "total size of corpus programs is too big, "+
+ "full fs image won't be included in the cover reports")
+ skipImages = true
+ continue outerLoop
+ }
+ ret = append(ret, prog)
+ }
+ return ret
+ }
+}
+
func (serv *HTTPServer) httpCoverFallback(w http.ResponseWriter, r *http.Request) {
corpus := serv.Corpus.Load()
if corpus == nil {