@@ -517,7 +517,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
517
517
}()
518
518
}
519
519
520
- var progs []cover. Prog
520
+ var progs []coverProgRaw
521
521
if sig := r .FormValue ("input" ); sig != "" {
522
522
inp := corpus .Item (sig )
523
523
if inp == nil {
@@ -530,16 +530,16 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
530
530
http .Error (w , "bad call_id" , http .StatusBadRequest )
531
531
return
532
532
}
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 ),
537
537
})
538
538
} 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 ),
543
543
})
544
544
}
545
545
} else {
@@ -548,10 +548,10 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
548
548
if call != "" && call != inp .StringCall () {
549
549
continue
550
550
}
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 ),
555
555
})
556
556
}
557
557
}
@@ -566,7 +566,7 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
566
566
}
567
567
568
568
params := cover.HandlerParams {
569
- Progs : progs ,
569
+ Progs : serv . serializeCoverProgs ( progs ) ,
570
570
Filter : coverFilter ,
571
571
Debug : r .FormValue ("debug" ) != "" ,
572
572
Force : r .FormValue ("force" ) != "" ,
@@ -599,6 +599,44 @@ func (serv *HTTPServer) httpCoverCover(w http.ResponseWriter, r *http.Request, f
599
599
}
600
600
}
601
601
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
+
602
640
func (serv * HTTPServer ) httpCoverFallback (w http.ResponseWriter , r * http.Request ) {
603
641
corpus := serv .Corpus .Load ()
604
642
if corpus == nil {
0 commit comments