aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2025-06-03 20:30:43 +0000
committerGopher Robot <gobot@golang.org>2025-06-04 08:16:42 -0700
commitf537061e1b7599e97bafc0c8f9cc0bf686eb813e (patch)
tree4b2f2b7dc58659af03efe0db053f86ad987e16d6 /src/cmd
parentd4bf7167935e84e7200e95649563d1368cf05331 (diff)
downloadgo-f537061e1b7599e97bafc0c8f9cc0bf686eb813e.tar.xz
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 <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Carlos Amedee <carlos@golang.org> Auto-Submit: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/trace/gen.go18
1 files 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()}
}