From 77f911e31c243a8302c086d64dbef340b0c999b8 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Fri, 15 Aug 2025 23:30:08 +0000 Subject: [PATCH] internal/trace: emit final sync event for generation in Go 1.26+ CL 693398 returned the error from reading a generation immediately, but this is wrong -- a Sync event must be emitted to indicate the end of the trace before reporting the error. This caused TestCrashWhileTracing to fail because that test has a high likelihood of producing a truncated trace, and it expects at least 2 Sync events. The truncated trace error would be reported before the second Sync event, which is incorrect. Fixes #75045. Change-Id: Ia71592c4ec56a544afc85cdb7b575e143f80e048 Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest Reviewed-on: https://go-review.googlesource.com/c/go/+/696436 Reviewed-by: Carlos Amedee Auto-Submit: Michael Knyszek LUCI-TryBot-Result: Go LUCI --- src/internal/trace/reader.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/internal/trace/reader.go b/src/internal/trace/reader.go index 5a094277fb..bb9cc280f5 100644 --- a/src/internal/trace/reader.go +++ b/src/internal/trace/reader.go @@ -31,6 +31,7 @@ type Reader struct { cpuSamples []cpuSample order ordering syncs int + readGenErr error done bool // Spill state. @@ -153,9 +154,18 @@ func (r *Reader) ReadEvent() (e Event, err error) { if r.version < version.Go126 { return r.nextGenWithSpill() } + if r.readGenErr != nil { + return Event{}, r.readGenErr + } gen, err := readGeneration(r.r, r.version) if err != nil { - return Event{}, err + // Before returning an error, emit the sync event + // for the current generation and queue up the error + // for the next call. + r.readGenErr = err + r.gen = nil + r.syncs++ + return syncEvent(nil, r.lastTs, r.syncs), nil } return r.installGen(gen) } -- 2.51.0