@@ -715,7 +715,7 @@ func serveTryStatusHTML(w http.ResponseWriter, ts *trySet, tss trySetState) {
715
715
fmt .Fprintf (buf , "<tr valign=top><td align=left>%s</td><td align=center>%s</td><td><pre>%s</pre></td></tr>\n " ,
716
716
html .EscapeString (bs .NameAndBranch ()),
717
717
status ,
718
- bs .HTMLStatusLine ())
718
+ bs .HTMLStatusTruncated ())
719
719
}
720
720
fmt .Fprintf (buf , "</table>" )
721
721
w .Write (buf .Bytes ())
@@ -809,7 +809,7 @@ func writeStatusHeader(w http.ResponseWriter, st *buildStatus) {
809
809
}
810
810
if len (st .events ) > 0 {
811
811
io .WriteString (w , "\n Events:\n " )
812
- st .writeEventsLocked (w , false )
812
+ st .writeEventsLocked (w , false , 0 )
813
813
}
814
814
io .WriteString (w , "\n Build log:\n " )
815
815
workaroundFlush (w )
@@ -1818,6 +1818,34 @@ func (st *buildStatus) checkDep(ctx context.Context, dep string) (have bool, err
1818
1818
1819
1819
var errSkipBuildDueToDeps = errors .New ("build was skipped due to missing deps" )
1820
1820
1821
+ func (st * buildStatus ) getBuildlet () (* buildlet.Client , error ) {
1822
+ schedItem := & SchedItem {
1823
+ HostType : st .conf .HostType ,
1824
+ IsTry : st .trySet != nil ,
1825
+ BuilderRev : st .BuilderRev ,
1826
+ }
1827
+ st .mu .Lock ()
1828
+ st .schedItem = schedItem
1829
+ st .mu .Unlock ()
1830
+
1831
+ sp := st .CreateSpan ("get_buildlet" )
1832
+ bc , err := sched .GetBuildlet (st .ctx , st , schedItem )
1833
+ sp .Done (err )
1834
+ if err != nil {
1835
+ err = fmt .Errorf ("failed to get a buildlet: %v" , err )
1836
+ go st .reportErr (err )
1837
+ return nil , err
1838
+ }
1839
+ atomic .StoreInt32 (& st .hasBuildlet , 1 )
1840
+
1841
+ st .mu .Lock ()
1842
+ st .bc = bc
1843
+ st .mu .Unlock ()
1844
+ st .LogEventTime ("using_buildlet" , bc .IPPort ())
1845
+
1846
+ return bc , nil
1847
+ }
1848
+
1821
1849
func (st * buildStatus ) build () error {
1822
1850
if deps := st .conf .GoDeps ; len (deps ) > 0 {
1823
1851
ctx , cancel := context .WithTimeout (st .ctx , 30 * time .Second )
@@ -1854,25 +1882,11 @@ func (st *buildStatus) build() error {
1854
1882
st .forceSnapshotUsage ()
1855
1883
}
1856
1884
1857
- sp = st .CreateSpan ("get_buildlet" )
1858
- bc , err := sched .GetBuildlet (st .ctx , st , & SchedItem {
1859
- HostType : st .conf .HostType ,
1860
- IsTry : st .trySet != nil ,
1861
- BuilderRev : st .BuilderRev ,
1862
- })
1863
- sp .Done (err )
1885
+ bc , err := st .getBuildlet ()
1864
1886
if err != nil {
1865
- err = fmt .Errorf ("failed to get a buildlet: %v" , err )
1866
- go st .reportErr (err )
1867
1887
return err
1868
1888
}
1869
- atomic .StoreInt32 (& st .hasBuildlet , 1 )
1870
1889
defer bc .Close ()
1871
- st .mu .Lock ()
1872
- st .bc = bc
1873
- st .mu .Unlock ()
1874
-
1875
- st .LogEventTime ("using_buildlet" , bc .IPPort ())
1876
1890
1877
1891
if st .useSnapshot () {
1878
1892
sp := st .CreateSpan ("write_snapshot_tar" )
@@ -1967,6 +1981,8 @@ func (st *buildStatus) build() error {
1967
1981
return nil
1968
1982
}
1969
1983
1984
+ func (st * buildStatus ) HasBuildlet () bool { return atomic .LoadInt32 (& st .hasBuildlet ) != 0 }
1985
+
1970
1986
func (st * buildStatus ) isTry () bool { return st .trySet != nil }
1971
1987
1972
1988
func (st * buildStatus ) isSlowBot () bool {
@@ -3367,8 +3383,8 @@ func (s byTestDuration) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
3367
3383
3368
3384
type eventAndTime struct {
3369
3385
t time.Time
3370
- evt string
3371
- text string
3386
+ evt string // "get_source", "make_and_test", "make", etc
3387
+ text string // optional detail text
3372
3388
}
3373
3389
3374
3390
// buildStatus is the status of a build.
@@ -3391,6 +3407,7 @@ type buildStatus struct {
3391
3407
hasBenchResults bool // set by runTests, may only be used when build() returns.
3392
3408
3393
3409
mu sync.Mutex // guards following
3410
+ schedItem * SchedItem // for the initial buildlet (ignoring helpers for now)
3394
3411
logURL string // if non-empty, permanent URL of log
3395
3412
bc * buildlet.Client // nil initially, until pool returns one
3396
3413
done time.Time // finished running
@@ -3544,8 +3561,9 @@ func (st *buildStatus) hasEvent(event string) bool {
3544
3561
3545
3562
// HTMLStatusLine returns the HTML to show within the <pre> block on
3546
3563
// the main page's list of active builds.
3547
- func (st * buildStatus ) HTMLStatusLine () template.HTML { return st .htmlStatusLine (true ) }
3548
- func (st * buildStatus ) HTMLStatusLine_done () template.HTML { return st .htmlStatusLine (false ) }
3564
+ func (st * buildStatus ) HTMLStatusLine () template.HTML { return st .htmlStatus (singleLine ) }
3565
+ func (st * buildStatus ) HTMLStatusTruncated () template.HTML { return st .htmlStatus (truncated ) }
3566
+ func (st * buildStatus ) HTMLStatus () template.HTML { return st .htmlStatus (full ) }
3549
3567
3550
3568
func strSliceTo (s string , n int ) string {
3551
3569
if len (s ) <= n {
@@ -3554,7 +3572,15 @@ func strSliceTo(s string, n int) string {
3554
3572
return s [:n ]
3555
3573
}
3556
3574
3557
- func (st * buildStatus ) htmlStatusLine (full bool ) template.HTML {
3575
+ type buildStatusDetail int
3576
+
3577
+ const (
3578
+ singleLine buildStatusDetail = iota
3579
+ truncated
3580
+ full
3581
+ )
3582
+
3583
+ func (st * buildStatus ) htmlStatus (detail buildStatusDetail ) template.HTML {
3558
3584
if st == nil {
3559
3585
return "[nil]"
3560
3586
}
@@ -3588,13 +3614,17 @@ func (st *buildStatus) htmlStatusLine(full bool) template.HTML {
3588
3614
3589
3615
var state string
3590
3616
if st .done .IsZero () {
3591
- state = "running"
3617
+ if st .HasBuildlet () {
3618
+ state = "running"
3619
+ } else {
3620
+ state = "waiting_for_machine"
3621
+ }
3592
3622
} else if st .succeeded {
3593
3623
state = "succeeded"
3594
3624
} else {
3595
3625
state = "<font color='#700000'>failed</font>"
3596
3626
}
3597
- if full {
3627
+ if detail > singleLine {
3598
3628
fmt .Fprintf (& buf , "; <a href='%s'>%s</a>; %s" , html .EscapeString (st .logsURLLocked ()), state , html .EscapeString (st .bc .String ()))
3599
3629
} else {
3600
3630
fmt .Fprintf (& buf , "; <a href='%s'>%s</a>" , html .EscapeString (st .logsURLLocked ()), state )
@@ -3605,9 +3635,13 @@ func (st *buildStatus) htmlStatusLine(full bool) template.HTML {
3605
3635
t = st .startTime
3606
3636
}
3607
3637
fmt .Fprintf (& buf , ", %v ago" , time .Since (t ).Round (time .Second ))
3608
- if full {
3638
+ if detail > singleLine {
3609
3639
buf .WriteByte ('\n' )
3610
- st .writeEventsLocked (& buf , true )
3640
+ lastLines := 0
3641
+ if detail == truncated {
3642
+ lastLines = 3
3643
+ }
3644
+ st .writeEventsLocked (& buf , true , lastLines )
3611
3645
}
3612
3646
return template .HTML (buf .String ())
3613
3647
}
@@ -3633,10 +3667,20 @@ func (st *buildStatus) logsURLLocked() string {
3633
3667
}
3634
3668
3635
3669
// st.mu must be held.
3636
- func (st * buildStatus ) writeEventsLocked (w io.Writer , htmlMode bool ) {
3637
- var lastT time.Time
3638
- for _ , evt := range st .events {
3639
- lastT = evt .t
3670
+ // If numLines is greater than zero, it's the number of final lines to truncate to.
3671
+ func (st * buildStatus ) writeEventsLocked (w io.Writer , htmlMode bool , numLines int ) {
3672
+ startAt := 0
3673
+ if numLines > 0 {
3674
+ startAt = len (st .events ) - numLines
3675
+ if startAt > 0 {
3676
+ io .WriteString (w , "...\n " )
3677
+ } else {
3678
+ startAt = 0
3679
+ }
3680
+ }
3681
+
3682
+ for i := startAt ; i < len (st .events ); i ++ {
3683
+ evt := st .events [i ]
3640
3684
e := evt .evt
3641
3685
text := evt .text
3642
3686
if htmlMode {
@@ -3648,8 +3692,9 @@ func (st *buildStatus) writeEventsLocked(w io.Writer, htmlMode bool) {
3648
3692
}
3649
3693
fmt .Fprintf (w , " %v %s %s\n " , evt .t .Format (time .RFC3339 ), e , text )
3650
3694
}
3651
- if st .isRunningLocked () {
3652
- fmt .Fprintf (w , " %7s (now)\n " , fmt .Sprintf ("+%0.1fs" , time .Since (lastT ).Seconds ()))
3695
+ if st .isRunningLocked () && len (st .events ) > 0 {
3696
+ lastEvt := st .events [len (st .events )- 1 ]
3697
+ fmt .Fprintf (w , " %7s (now)\n " , fmt .Sprintf ("+%0.1fs" , time .Since (lastEvt .t ).Seconds ()))
3653
3698
}
3654
3699
}
3655
3700
0 commit comments