Skip to content

Commit 68fb260

Browse files
committed
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.
1 parent 6c336ed commit 68fb260

File tree

1 file changed

+52
-14
lines changed

1 file changed

+52
-14
lines changed

pkg/manager/http.go

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
517517
}()
518518
}
519519

520-
var progs []cover.Prog
520+
var progs []coverProgRaw
521521
if sig := r.FormValue("input"); sig != "" {
522522
inp := corpus.Item(sig)
523523
if inp == nil {
@@ -530,16 +530,16 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
530530
http.Error(w, "bad call_id", http.StatusBadRequest)
531531
return
532532
}
533-
progs = append(progs, cover.Prog{
534-
Sig: sig,
535-
Data: string(inp.Prog.Serialize()),
536-
PCs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover),
533+
progs = append(progs, coverProgRaw{
534+
sig: sig,
535+
prog: inp.Prog,
536+
pcs: CoverToPCs(serv.Cfg, inp.Updates[updateID].RawCover),
537537
})
538538
} else {
539-
progs = append(progs, cover.Prog{
540-
Sig: sig,
541-
Data: string(inp.Prog.Serialize()),
542-
PCs: CoverToPCs(serv.Cfg, inp.Cover),
539+
progs = append(progs, coverProgRaw{
540+
sig: sig,
541+
prog: inp.Prog,
542+
pcs: CoverToPCs(serv.Cfg, inp.Cover),
543543
})
544544
}
545545
} else {
@@ -548,10 +548,10 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
548548
if call != "" && call != inp.StringCall() {
549549
continue
550550
}
551-
progs = append(progs, cover.Prog{
552-
Sig: inp.Sig,
553-
Data: string(inp.Prog.Serialize()),
554-
PCs: CoverToPCs(serv.Cfg, inp.Cover),
551+
progs = append(progs, coverProgRaw{
552+
sig: inp.Sig,
553+
prog: inp.Prog,
554+
pcs: CoverToPCs(serv.Cfg, inp.Cover),
555555
})
556556
}
557557
}
@@ -566,7 +566,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
566566
}
567567

568568
params := cover.HandlerParams{
569-
Progs: progs,
569+
Progs: serv.serializeCoverProgs(progs),
570570
Filter: coverFilter,
571571
Debug: r.FormValue("debug") != "",
572572
Force: r.FormValue("force") != "",
@@ -599,6 +599,44 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
599599
}
600600
}
601601

602+
type coverProgRaw struct {
603+
sig string
604+
prog *prog.Prog
605+
pcs []uint64
606+
}
607+
608+
// Once the total size of corpus programs exceeds 100MB, skip fs images from it.
609+
const compactProgsCutOff = 100 * 1000 * 1000
610+
611+
func (serv *HTTPServer) serializeCoverProgs(rawProgs []coverProgRaw) []cover.Prog {
612+
skipImages := false
613+
outerLoop:
614+
for {
615+
var flags []prog.SerializeFlag
616+
if skipImages {
617+
flags = append(flags, prog.SkipImages)
618+
}
619+
totalSize := 0
620+
var ret []cover.Prog
621+
for _, item := range rawProgs {
622+
prog := cover.Prog{
623+
Sig: item.sig,
624+
Data: string(item.prog.Serialize(flags...)),
625+
PCs: item.pcs,
626+
}
627+
totalSize += len(prog.Data)
628+
if totalSize > compactProgsCutOff && !skipImages {
629+
log.Logf(0, "total size of corpus programs is too big,"+
630+
"fullfs image won't be included in the cover reports")
631+
skipImages = true
632+
continue outerLoop
633+
}
634+
ret = append(ret, prog)
635+
}
636+
return ret
637+
}
638+
}
639+
602640
func (serv *HTTPServer) httpCoverFallback(w http.ResponseWriter, r *http.Request) {
603641
corpus := serv.Corpus.Load()
604642
if corpus == nil {

0 commit comments

Comments
 (0)