From f537061e1b7599e97bafc0c8f9cc0bf686eb813e Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Tue, 3 Jun 2025 20:30:43 +0000 Subject: [PATCH] cmd/trace: handle Sync event at the beginning of the trace Currently the code assumes that there's no Sync event at the start of the trace, but this hasn't been correct for some time. Count Syncs and look for at least one instead of looking for zero. Fixes #73962. Change-Id: I2b4199a21c699c5b50b3d5add37dc46a515108c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/678555 LUCI-TryBot-Result: Go LUCI Reviewed-by: Carlos Amedee Auto-Submit: Michael Knyszek Reviewed-by: Michael Pratt --- src/cmd/trace/gen.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/cmd/trace/gen.go b/src/cmd/trace/gen.go index 6e4d82799e..4455f83046 100644 --- a/src/cmd/trace/gen.go +++ b/src/cmd/trace/gen.go @@ -215,12 +215,12 @@ func (g *stackSampleGenerator[R]) StackSample(ctx *traceContext, ev *trace.Event // to trace.ResourceNone (the global scope). type globalRangeGenerator struct { ranges map[string]activeRange - seenSync bool + seenSync int } // Sync notifies the generator of an EventSync event. func (g *globalRangeGenerator) Sync() { - g.seenSync = true + g.seenSync++ } // GlobalRange implements a handler for EventRange* events whose Scope.Kind is ResourceNone. @@ -234,8 +234,9 @@ func (g *globalRangeGenerator) GlobalRange(ctx *traceContext, ev *trace.Event) { case trace.EventRangeBegin: g.ranges[r.Name] = activeRange{ev.Time(), ev.Stack()} case trace.EventRangeActive: - // If we've seen a Sync event, then Active events are always redundant. - if !g.seenSync { + // If we've seen at least 2 Sync events (indicating that we're in at least the second + // generation), then Active events are always redundant. + if g.seenSync < 2 { // Otherwise, they extend back to the start of the trace. g.ranges[r.Name] = activeRange{ctx.startTime, ev.Stack()} } @@ -294,12 +295,12 @@ func (g *globalMetricGenerator) GlobalMetric(ctx *traceContext, ev *trace.Event) // ResourceProc. type procRangeGenerator struct { ranges map[trace.Range]activeRange - seenSync bool + seenSync int } // Sync notifies the generator of an EventSync event. func (g *procRangeGenerator) Sync() { - g.seenSync = true + g.seenSync++ } // ProcRange implements a handler for EventRange* events whose Scope.Kind is ResourceProc. @@ -313,8 +314,9 @@ func (g *procRangeGenerator) ProcRange(ctx *traceContext, ev *trace.Event) { case trace.EventRangeBegin: g.ranges[r] = activeRange{ev.Time(), ev.Stack()} case trace.EventRangeActive: - // If we've seen a Sync event, then Active events are always redundant. - if !g.seenSync { + // If we've seen at least 2 Sync events (indicating that we're in at least the second + // generation), then Active events are always redundant. + if g.seenSync < 2 { // Otherwise, they extend back to the start of the trace. g.ranges[r] = activeRange{ctx.startTime, ev.Stack()} } -- 2.50.0