Skip to content

Commit

Permalink
cmd/go: add trace events for each action
Browse files Browse the repository at this point in the history
This change adds a trace event for each action and also
annotates each of the action execution goroutines with trace.Goroutine
so that the actions eaxecuted by each goroutine appear on different threads in
the chrome trace viewer.

Updates #38714

Change-Id: I2e58dc5606b2e3f7f87076a61e1cc6a2014255c5
Reviewed-on: https://go-review.googlesource.com/c/go/+/248320
Run-TryBot: Michael Matloob <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Bryan C. Mills <[email protected]>
  • Loading branch information
matloob committed Aug 17, 2020
1 parent 49003da commit 023d497
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/cmd/go/internal/trace/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ func StartSpan(ctx context.Context, name string) (context.Context, *Span) {
return ctx, childSpan
}

// Goroutine associates the context with a new Thread ID. The Chrome trace viewer associates each
// StartGoroutine associates the context with a new Thread ID. The Chrome trace viewer associates each
// trace event with a thread, and doesn't expect events with the same thread id to happen at the
// same time.
func Goroutine(ctx context.Context) context.Context {
func StartGoroutine(ctx context.Context) context.Context {
tc, ok := getTraceContext(ctx)
if !ok {
return ctx
Expand Down
13 changes: 11 additions & 2 deletions src/cmd/go/internal/work/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,21 @@ func (b *Builder) Do(ctx context.Context, root *Action) {

// Handle runs a single action and takes care of triggering
// any actions that are runnable as a result.
handle := func(a *Action) {
handle := func(ctx context.Context, a *Action) {
if a.json != nil {
a.json.TimeStart = time.Now()
}
var err error
if a.Func != nil && (!a.Failed || a.IgnoreFail) {
// TODO(matloob): Better action descriptions
desc := "Executing action "
if a.Package != nil {
desc += "(" + a.Mode + " " + a.Package.Desc() + ")"
}
ctx, span := trace.StartSpan(ctx, desc)
_ = ctx
err = a.Func(b, a)
span.Done()
}
if a.json != nil {
a.json.TimeDone = time.Now()
Expand Down Expand Up @@ -169,6 +177,7 @@ func (b *Builder) Do(ctx context.Context, root *Action) {
for i := 0; i < par; i++ {
wg.Add(1)
go func() {
ctx := trace.StartGoroutine(ctx)
defer wg.Done()
for {
select {
Expand All @@ -181,7 +190,7 @@ func (b *Builder) Do(ctx context.Context, root *Action) {
b.exec.Lock()
a := b.ready.pop()
b.exec.Unlock()
handle(a)
handle(ctx, a)
case <-base.Interrupted:
base.SetExitStatus(1)
return
Expand Down

0 comments on commit 023d497

Please sign in to comment.