From dd2fced87f380640148c47009a36e6b5e1a1da19 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 27 Aug 2025 12:10:17 +0200 Subject: 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. --- pkg/manager/http.go | 66 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 14 deletions(-) (limited to 'pkg') 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 { -- cgit mrf-deployment