diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-08-27 12:10:17 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-11-03 15:02:52 +0000 |
| commit | dd2fced87f380640148c47009a36e6b5e1a1da19 (patch) | |
| tree | 7111cc7f52166ffd697998cb836e5bae4090cf1d | |
| parent | 791d18fa26e3c5b62656e16b65aac5b748fcf8fc (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.
| -rw-r--r-- | pkg/manager/http.go | 66 |
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 { |
