Commit e57f24ab authored by Hana Kim's avatar Hana Kim Committed by Hyang-Ah Hana Kim

cmd/trace: don't drop sweep slice details

For sweep events, we used to modify the ViewerEvent returned from
ctx.emitSlice later in order to embed more details about the sweep
operation. The trick no longer works after the change
https://golang.org/cl/92375 and caused a regression.

ctx.emit method encodes the ViewerEvent, so any modification to the
ViewerEvent object after ctx.emit returns will not be reflected.

Refactor ctx.emitSlice, so ctx.makeSlice can be used when producing
slices for SWEEP. ctx.emit* methods are meant to truely emit
ViewerEvents.

Fixes #27711

Change-Id: I0b733ebbbfd4facd8714db0535809ec3cab0833d
Reviewed-on: https://go-review.googlesource.com/135775Reviewed-by: 's avatarAustin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 8595868e
...@@ -685,13 +685,14 @@ func generateTrace(params *traceParams, consumer traceConsumer) error { ...@@ -685,13 +685,14 @@ func generateTrace(params *traceParams, consumer traceConsumer) error {
} }
ctx.emitSlice(&fakeMarkStart, text) ctx.emitSlice(&fakeMarkStart, text)
case trace.EvGCSweepStart: case trace.EvGCSweepStart:
slice := ctx.emitSlice(ev, "SWEEP") slice := ctx.makeSlice(ev, "SWEEP")
if done := ev.Link; done != nil && done.Args[0] != 0 { if done := ev.Link; done != nil && done.Args[0] != 0 {
slice.Arg = struct { slice.Arg = struct {
Swept uint64 `json:"Swept bytes"` Swept uint64 `json:"Swept bytes"`
Reclaimed uint64 `json:"Reclaimed bytes"` Reclaimed uint64 `json:"Reclaimed bytes"`
}{done.Args[0], done.Args[1]} }{done.Args[0], done.Args[1]}
} }
ctx.emit(slice)
case trace.EvGoStart, trace.EvGoStartLabel: case trace.EvGoStart, trace.EvGoStartLabel:
info := getGInfo(ev.G) info := getGInfo(ev.G)
if ev.Type == trace.EvGoStartLabel { if ev.Type == trace.EvGoStartLabel {
...@@ -846,7 +847,11 @@ func (ctx *traceContext) proc(ev *trace.Event) uint64 { ...@@ -846,7 +847,11 @@ func (ctx *traceContext) proc(ev *trace.Event) uint64 {
} }
} }
func (ctx *traceContext) emitSlice(ev *trace.Event, name string) *ViewerEvent { func (ctx *traceContext) emitSlice(ev *trace.Event, name string) {
ctx.emit(ctx.makeSlice(ev, name))
}
func (ctx *traceContext) makeSlice(ev *trace.Event, name string) *ViewerEvent {
// If ViewerEvent.Dur is not a positive value, // If ViewerEvent.Dur is not a positive value,
// trace viewer handles it as a non-terminating time interval. // trace viewer handles it as a non-terminating time interval.
// Avoid it by setting the field with a small value. // Avoid it by setting the field with a small value.
...@@ -885,7 +890,6 @@ func (ctx *traceContext) emitSlice(ev *trace.Event, name string) *ViewerEvent { ...@@ -885,7 +890,6 @@ func (ctx *traceContext) emitSlice(ev *trace.Event, name string) *ViewerEvent {
sl.Cname = colorLightGrey sl.Cname = colorLightGrey
} }
} }
ctx.emit(sl)
return sl return sl
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment