Skip to content

Commit 1c4acea

Browse files
rhyshgopherbot
authored andcommitted
internal/trace: make Reader output deterministic
Multiple Ms can offer Events with identical timestamps. The Reader edits those so the timestamps are strictly increasing, but it needs a way to break the tie. Use something deterministic (such as the order of the batches), rather than map iteration order. Updates #68277 Change-Id: I4a1f70c1669ce1c9b52d09e2bc99acbc831ef9a4 Reviewed-on: https://go-review.googlesource.com/c/go/+/596355 LUCI-TryBot-Result: Go LUCI <[email protected]> Auto-Submit: Rhys Hiltner <[email protected]> Reviewed-by: Carlos Amedee <[email protected]> Reviewed-by: Than McIntosh <[email protected]> Reviewed-by: Michael Pratt <[email protected]> Reviewed-by: Michael Knyszek <[email protected]>
1 parent 601ea46 commit 1c4acea

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

src/internal/trace/generation.go

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
type generation struct {
2626
gen uint64
2727
batches map[ThreadID][]batch
28+
batchMs []ThreadID
2829
cpuSamples []cpuSample
2930
*evTable
3031
}
@@ -169,6 +170,9 @@ func processBatch(g *generation, b batch) error {
169170
return err
170171
}
171172
default:
173+
if _, ok := g.batches[b.m]; !ok {
174+
g.batchMs = append(g.batchMs, b.m)
175+
}
172176
g.batches[b.m] = append(g.batches[b.m], b)
173177
}
174178
return nil

src/internal/trace/reader.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ func (r *Reader) ReadEvent() (e Event, err error) {
142142
r.cpuSamples = r.gen.cpuSamples
143143

144144
// Reset frontier.
145-
for m, batches := range r.gen.batches {
145+
for _, m := range r.gen.batchMs {
146+
batches := r.gen.batches[m]
146147
bc := &batchCursor{m: m}
147148
ok, err := bc.nextEvent(batches, r.gen.freq)
148149
if err != nil {

src/internal/trace/trace_test.go

+38-1
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ func TestTraceStress(t *testing.T) {
507507
case "js", "wasip1":
508508
t.Skip("no os.Pipe on " + runtime.GOOS)
509509
}
510-
testTraceProg(t, "stress.go", nil)
510+
testTraceProg(t, "stress.go", checkReaderDeterminism)
511511
}
512512

513513
func TestTraceStressStartStop(t *testing.T) {
@@ -535,6 +535,43 @@ func TestTraceIterPull(t *testing.T) {
535535
testTraceProg(t, "iter-pull.go", nil)
536536
}
537537

538+
func checkReaderDeterminism(t *testing.T, tb, _ []byte, _ bool) {
539+
events := func() []trace.Event {
540+
var evs []trace.Event
541+
542+
r, err := trace.NewReader(bytes.NewReader(tb))
543+
if err != nil {
544+
t.Error(err)
545+
}
546+
for {
547+
ev, err := r.ReadEvent()
548+
if err == io.EOF {
549+
break
550+
}
551+
if err != nil {
552+
t.Fatal(err)
553+
}
554+
evs = append(evs, ev)
555+
}
556+
557+
return evs
558+
}
559+
560+
evs1 := events()
561+
evs2 := events()
562+
563+
if l1, l2 := len(evs1), len(evs2); l1 != l2 {
564+
t.Fatalf("re-reading trace gives different event count (%d != %d)", l1, l2)
565+
}
566+
for i, ev1 := range evs1 {
567+
ev2 := evs2[i]
568+
if s1, s2 := ev1.String(), ev2.String(); s1 != s2 {
569+
t.Errorf("re-reading trace gives different event %d:\n%s\n%s\n", i, s1, s2)
570+
break
571+
}
572+
}
573+
}
574+
538575
func testTraceProg(t *testing.T, progName string, extra func(t *testing.T, trace, stderr []byte, stress bool)) {
539576
testenv.MustHaveGoRun(t)
540577

0 commit comments

Comments
 (0)