Skip to content

Commit d3562c9

Browse files
committed
internal/trace: Revert "remove backlinks from span/task end to start"
This reverts commit 1639889. This broke TestUserTaskSpan test. Change-Id: If5ff8bdfe84e8cb30787b03ead87205ece3d5601 Reviewed-on: https://go-review.googlesource.com/98235 Reviewed-by: Heschi Kreinick <heschi@google.com>
1 parent 1639889 commit d3562c9

File tree

2 files changed

+38
-76
lines changed

2 files changed

+38
-76
lines changed

src/cmd/trace/annotations.go

Lines changed: 32 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -152,65 +152,6 @@ type annotationAnalysisResult struct {
152152
gcEvents []*trace.Event // GCStartevents, sorted
153153
}
154154

155-
type activeSpanTracker struct {
156-
stacks map[uint64][]*trace.Event // goid to stack of active span start events
157-
}
158-
159-
func (t *activeSpanTracker) top(goid uint64) *trace.Event {
160-
if t.stacks == nil {
161-
return nil
162-
}
163-
stk := t.stacks[goid]
164-
if len(stk) == 0 {
165-
return nil
166-
}
167-
return stk[len(stk)-1]
168-
}
169-
170-
func (t *activeSpanTracker) addSpanEvent(ev *trace.Event, task *taskDesc) *spanDesc {
171-
if ev.Type != trace.EvUserSpan {
172-
return nil
173-
}
174-
if t.stacks == nil {
175-
t.stacks = make(map[uint64][]*trace.Event)
176-
}
177-
178-
goid := ev.G
179-
stk := t.stacks[goid]
180-
181-
var sd *spanDesc
182-
switch mode := ev.Args[1]; mode {
183-
case 0: // span start
184-
t.stacks[goid] = append(stk, ev) // push
185-
sd = &spanDesc{
186-
name: ev.SArgs[0],
187-
task: task,
188-
goid: goid,
189-
start: ev,
190-
end: ev.Link,
191-
}
192-
case 1: // span end
193-
if n := len(stk); n > 0 {
194-
stk = stk[:n-1] // pop
195-
} else {
196-
// There is no matching span start event; can happen if the span start was before tracing.
197-
sd = &spanDesc{
198-
name: ev.SArgs[0],
199-
task: task,
200-
goid: goid,
201-
start: nil,
202-
end: ev,
203-
}
204-
}
205-
if len(stk) == 0 {
206-
delete(t.stacks, goid)
207-
} else {
208-
t.stacks[goid] = stk
209-
}
210-
}
211-
return sd
212-
}
213-
214155
// analyzeAnnotations analyzes user annotation events and
215156
// returns the task descriptors keyed by internal task id.
216157
func analyzeAnnotations() (annotationAnalysisResult, error) {
@@ -225,14 +166,14 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
225166
}
226167

227168
tasks := allTasks{}
169+
activeSpans := map[uint64][]*trace.Event{} // goid to active span start events
228170
var gcEvents []*trace.Event
229-
var activeSpans activeSpanTracker
230171

231172
for _, ev := range events {
232173
goid := ev.G
233174

234175
switch typ := ev.Type; typ {
235-
case trace.EvUserTaskCreate, trace.EvUserTaskEnd, trace.EvUserLog:
176+
case trace.EvUserTaskCreate, trace.EvUserTaskEnd, trace.EvUserLog, trace.EvUserSpan:
236177
taskid := ev.Args[0]
237178
task := tasks.task(taskid)
238179
task.addEvent(ev)
@@ -248,13 +189,18 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
248189
}
249190
}
250191

251-
case trace.EvUserSpan:
252-
taskid := ev.Args[0]
253-
task := tasks.task(taskid)
254-
task.addEvent(ev)
255-
sd := activeSpans.addSpanEvent(ev, task)
256-
if task != nil && sd != nil {
257-
task.spans = append(task.spans, sd)
192+
if typ == trace.EvUserSpan {
193+
mode := ev.Args[1]
194+
spans := activeSpans[goid]
195+
if mode == 0 { // start
196+
activeSpans[goid] = append(spans, ev) // push
197+
} else { // end
198+
if n := len(spans); n > 1 {
199+
activeSpans[goid] = spans[:n-1] // pop
200+
} else if n == 1 {
201+
delete(activeSpans, goid)
202+
}
203+
}
258204
}
259205

260206
case trace.EvGoCreate:
@@ -263,11 +209,11 @@ func analyzeAnnotations() (annotationAnalysisResult, error) {
263209
//
264210
// TODO(hyangah): the task info needs to propagate
265211
// to all decendents, not only to the immediate child.
266-
s := activeSpans.top(goid)
267-
if s == nil {
212+
spans := activeSpans[goid]
213+
if len(spans) == 0 {
268214
continue
269215
}
270-
taskid := s.Args[0]
216+
taskid := spans[len(spans)-1].Args[0]
271217
task := tasks.task(taskid)
272218
task.addEvent(ev)
273219

@@ -380,6 +326,21 @@ func (task *taskDesc) addEvent(ev *trace.Event) {
380326
task.create = ev
381327
case trace.EvUserTaskEnd:
382328
task.end = ev
329+
case trace.EvUserSpan:
330+
if mode := ev.Args[1]; mode == 0 { // start
331+
task.spans = append(task.spans, &spanDesc{
332+
name: ev.SArgs[0],
333+
task: task,
334+
goid: ev.G,
335+
start: ev,
336+
end: ev.Link})
337+
} else if ev.Link == nil { // span end without matching start
338+
task.spans = append(task.spans, &spanDesc{
339+
name: ev.SArgs[0],
340+
task: task,
341+
goid: ev.G,
342+
end: ev})
343+
}
383344
}
384345
}
385346

src/internal/trace/parser.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ type Event struct {
5656
// for GoSysExit: the next GoStart
5757
// for GCMarkAssistStart: the associated GCMarkAssistDone
5858
// for UserTaskCreate: the UserTaskEnd
59-
// for UserSpan: if the start span, the corresponding UserSpan end event
59+
// for UsetTaskEnd: the UserTaskCreate
60+
// for UserSpan: the corresponding span start or end event
6061
Link *Event
6162
}
6263

@@ -809,10 +810,9 @@ func postProcessTrace(ver int, events []*Event) error {
809810
}
810811
tasks[ev.Args[0]] = ev
811812
case EvUserTaskEnd:
812-
taskid := ev.Args[0]
813-
if taskCreateEv, ok := tasks[taskid]; ok {
814-
taskCreateEv.Link = ev
815-
delete(tasks, taskid)
813+
if prevEv, ok := tasks[ev.Args[0]]; ok {
814+
prevEv.Link = ev
815+
ev.Link = prevEv
816816
}
817817
case EvUserSpan:
818818
mode := ev.Args[1]
@@ -828,6 +828,7 @@ func postProcessTrace(ver int, events []*Event) error {
828828
}
829829
// Link span start event with span end event
830830
s.Link = ev
831+
ev.Link = s
831832

832833
if n > 1 {
833834
activeSpans[ev.G] = spans[:n-1]

0 commit comments

Comments
 (0)