Skip to content

Commit

Permalink
internal/trace: merge event and tracev2 packages
Browse files Browse the repository at this point in the history
These two packages were historically separate in an attempt to provide a
unified description of trace v1 and trace v2 formats. In practice this
turned out to be pointless, since it made more sense to keep the trace
v1 parser in a self-contained bubble with a converter to v2. Future
trace wire format migrations should probably just follow the same
general strategy, if there's a substantial change. (Minor changes can be
handled more organically.)

Change-Id: Ic765df62065fe53cfae59b505297527c3fa42dfb
Reviewed-on: https://go-review.googlesource.com/c/go/+/645395
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
  • Loading branch information
mknyszek authored and gopherbot committed Feb 10, 2025
1 parent 9faa00a commit 8b8ab25
Show file tree
Hide file tree
Showing 18 changed files with 190 additions and 154 deletions.
6 changes: 3 additions & 3 deletions src/cmd/trace/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
"fmt"
"internal/trace"
"internal/trace/raw"
"internal/trace/tracev2/event"
"internal/trace/tracev2"
"internal/trace/traceviewer"
"io"
"log"
Expand Down Expand Up @@ -372,13 +372,13 @@ func debugEventsFootprint(trc io.Reader) error {
return err
}
type eventStats struct {
typ event.Type
typ tracev2.EventType
count int
bytes int
}
var stats [256]eventStats
for i := range stats {
stats[i].typ = event.Type(i)
stats[i].typ = tracev2.EventType(i)
}
eventsRead := 0
for {
Expand Down
8 changes: 3 additions & 5 deletions src/go/build/deps_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ var depsRules = `
internal/platform,
internal/profilerecord,
internal/syslist,
internal/trace/tracev2/event,
internal/trace/tracev2,
internal/trace/traceviewer/format,
log/internal,
math/bits,
Expand All @@ -80,6 +80,7 @@ var depsRules = `
internal/goexperiment,
internal/goos,
internal/profilerecord,
internal/trace/tracev2,
math/bits,
structs
< internal/bytealg
Expand Down Expand Up @@ -699,16 +700,13 @@ var depsRules = `
< crypto/internal/fips140/check/checktest;
# v2 execution trace parser.
internal/trace/tracev2/event
< internal/trace/tracev2;
FMT, io, internal/trace/tracev2
< internal/trace/version;
FMT, encoding/binary, internal/trace/version
< internal/trace/raw;
FMT, internal/trace/tracev2/event, internal/trace/version, io, sort, encoding/binary
FMT, internal/trace/version, io, sort, encoding/binary
< internal/trace/internal/tracev1;
FMT, encoding/binary, internal/trace/version, internal/trace/internal/tracev1, container/heap, math/rand
Expand Down
5 changes: 2 additions & 3 deletions src/internal/trace/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"strings"

"internal/trace/tracev2"
"internal/trace/tracev2/event"
"internal/trace/version"
)

Expand All @@ -28,7 +27,7 @@ type timedEventArgs [maxArgs - 1]uint64
// baseEvent is the basic unprocessed event. This serves as a common
// fundamental data structure across.
type baseEvent struct {
typ event.Type
typ tracev2.EventType
time Time
args timedEventArgs
}
Expand Down Expand Up @@ -59,7 +58,7 @@ type evTable struct {
nextExtra extraStringID

// expBatches contains extra unparsed data relevant to a specific experiment.
expBatches map[event.Experiment][]ExperimentalBatch
expBatches map[tracev2.Experiment][]ExperimentalBatch
}

// addExtraString adds an extra string to the evTable and returns
Expand Down
19 changes: 9 additions & 10 deletions src/internal/trace/batch.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"io"

"internal/trace/tracev2"
"internal/trace/tracev2/event"
)

// timestamp is an unprocessed timestamp.
Expand All @@ -23,23 +22,23 @@ type batch struct {
m ThreadID
time timestamp
data []byte
exp event.Experiment
exp tracev2.Experiment
}

func (b *batch) isStringsBatch() bool {
return b.exp == event.NoExperiment && len(b.data) > 0 && event.Type(b.data[0]) == tracev2.EvStrings
return b.exp == tracev2.NoExperiment && len(b.data) > 0 && tracev2.EventType(b.data[0]) == tracev2.EvStrings
}

func (b *batch) isStacksBatch() bool {
return b.exp == event.NoExperiment && len(b.data) > 0 && event.Type(b.data[0]) == tracev2.EvStacks
return b.exp == tracev2.NoExperiment && len(b.data) > 0 && tracev2.EventType(b.data[0]) == tracev2.EvStacks
}

func (b *batch) isCPUSamplesBatch() bool {
return b.exp == event.NoExperiment && len(b.data) > 0 && event.Type(b.data[0]) == tracev2.EvCPUSamples
return b.exp == tracev2.NoExperiment && len(b.data) > 0 && tracev2.EventType(b.data[0]) == tracev2.EvCPUSamples
}

func (b *batch) isFreqBatch() bool {
return b.exp == event.NoExperiment && len(b.data) > 0 && event.Type(b.data[0]) == tracev2.EvFrequency
return b.exp == tracev2.NoExperiment && len(b.data) > 0 && tracev2.EventType(b.data[0]) == tracev2.EvFrequency
}

// readBatch reads the next full batch from r.
Expand All @@ -52,18 +51,18 @@ func readBatch(r interface {
if err != nil {
return batch{}, 0, err
}
if typ := event.Type(b); typ != tracev2.EvEventBatch && typ != tracev2.EvExperimentalBatch {
if typ := tracev2.EventType(b); typ != tracev2.EvEventBatch && typ != tracev2.EvExperimentalBatch {
return batch{}, 0, fmt.Errorf("expected batch event, got event %d", typ)
}

// Read the experiment of we have one.
exp := event.NoExperiment
if event.Type(b) == tracev2.EvExperimentalBatch {
exp := tracev2.NoExperiment
if tracev2.EventType(b) == tracev2.EvExperimentalBatch {
e, err := r.ReadByte()
if err != nil {
return batch{}, 0, err
}
exp = event.Experiment(e)
exp = tracev2.Experiment(e)
}

// Read the batch header: gen (generation), thread (M) ID, base timestamp
Expand Down
3 changes: 1 addition & 2 deletions src/internal/trace/batchcursor.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"fmt"

"internal/trace/tracev2"
"internal/trace/tracev2/event"
)

type batchCursor struct {
Expand Down Expand Up @@ -66,7 +65,7 @@ func (b *batchCursor) compare(a *batchCursor) int {
// be the case for every event in a plain EventBatch.
func readTimedBaseEvent(b []byte, e *baseEvent) (int, timestamp, error) {
// Get the event type.
typ := event.Type(b[0])
typ := tracev2.EventType(b[0])
specs := tracev2.Specs()
if int(typ) >= len(specs) {
return 0, 0, fmt.Errorf("found invalid event type: %v", typ)
Expand Down
3 changes: 1 addition & 2 deletions src/internal/trace/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"time"

"internal/trace/tracev2"
"internal/trace/tracev2/event"
"internal/trace/version"
)

Expand Down Expand Up @@ -693,7 +692,7 @@ func (e Event) Experimental() ExperimentalEvent {
}
}

const evSync = ^event.Type(0)
const evSync = ^tracev2.EventType(0)

var tracev2Type2Kind = [...]EventKind{
tracev2.EvCPUSample: EventStackSample,
Expand Down
25 changes: 12 additions & 13 deletions src/internal/trace/generation.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"strings"

"internal/trace/tracev2"
"internal/trace/tracev2/event"
)

// generation contains all the trace data for a single
Expand Down Expand Up @@ -166,9 +165,9 @@ func processBatch(g *generation, b batch) error {
return fmt.Errorf("found multiple frequency events")
}
g.freq = freq
case b.exp != event.NoExperiment:
case b.exp != tracev2.NoExperiment:
if g.expBatches == nil {
g.expBatches = make(map[event.Experiment][]ExperimentalBatch)
g.expBatches = make(map[tracev2.Experiment][]ExperimentalBatch)
}
if err := addExperimentalBatch(g.expBatches, b); err != nil {
return err
Expand Down Expand Up @@ -222,7 +221,7 @@ func addStrings(stringTable *dataTable[stringID, string], b batch) error {
}
r := bytes.NewReader(b.data)
hdr, err := r.ReadByte() // Consume the EvStrings byte.
if err != nil || event.Type(hdr) != tracev2.EvStrings {
if err != nil || tracev2.EventType(hdr) != tracev2.EvStrings {
return fmt.Errorf("missing strings batch header")
}

Expand All @@ -233,7 +232,7 @@ func addStrings(stringTable *dataTable[stringID, string], b batch) error {
if err != nil {
return err
}
if event.Type(ev) != tracev2.EvString {
if tracev2.EventType(ev) != tracev2.EvString {
return fmt.Errorf("expected string event, got %d", ev)
}

Expand All @@ -248,8 +247,8 @@ func addStrings(stringTable *dataTable[stringID, string], b batch) error {
if err != nil {
return err
}
if len > tracev2.MaxStringSize {
return fmt.Errorf("invalid string size %d, maximum is %d", len, tracev2.MaxStringSize)
if len > tracev2.MaxEventTrailerDataSize {
return fmt.Errorf("invalid string size %d, maximum is %d", len, tracev2.MaxEventTrailerDataSize)
}

// Copy out the string.
Expand Down Expand Up @@ -280,7 +279,7 @@ func addStacks(stackTable *dataTable[stackID, stack], pcs map[uint64]frame, b ba
}
r := bytes.NewReader(b.data)
hdr, err := r.ReadByte() // Consume the EvStacks byte.
if err != nil || event.Type(hdr) != tracev2.EvStacks {
if err != nil || tracev2.EventType(hdr) != tracev2.EvStacks {
return fmt.Errorf("missing stacks batch header")
}

Expand All @@ -290,7 +289,7 @@ func addStacks(stackTable *dataTable[stackID, stack], pcs map[uint64]frame, b ba
if err != nil {
return err
}
if event.Type(ev) != tracev2.EvStack {
if tracev2.EventType(ev) != tracev2.EvStack {
return fmt.Errorf("expected stack event, got %d", ev)
}

Expand Down Expand Up @@ -358,7 +357,7 @@ func addCPUSamples(samples []cpuSample, b batch) ([]cpuSample, error) {
}
r := bytes.NewReader(b.data)
hdr, err := r.ReadByte() // Consume the EvCPUSamples byte.
if err != nil || event.Type(hdr) != tracev2.EvCPUSamples {
if err != nil || tracev2.EventType(hdr) != tracev2.EvCPUSamples {
return nil, fmt.Errorf("missing CPU samples batch header")
}

Expand All @@ -368,7 +367,7 @@ func addCPUSamples(samples []cpuSample, b batch) ([]cpuSample, error) {
if err != nil {
return nil, err
}
if event.Type(ev) != tracev2.EvCPUSample {
if tracev2.EventType(ev) != tracev2.EvCPUSample {
return nil, fmt.Errorf("expected CPU sample event, got %d", ev)
}

Expand Down Expand Up @@ -441,8 +440,8 @@ func parseFreq(b batch) (frequency, error) {

// addExperimentalBatch takes an experimental batch and adds it to the list of experimental
// batches for the experiment its a part of.
func addExperimentalBatch(expBatches map[event.Experiment][]ExperimentalBatch, b batch) error {
if b.exp == event.NoExperiment {
func addExperimentalBatch(expBatches map[tracev2.Experiment][]ExperimentalBatch, b batch) error {
if b.exp == tracev2.NoExperiment {
return fmt.Errorf("internal error: addExperimentalBatch called on non-experimental batch")
}
expBatches[b.exp] = append(expBatches[b.exp], ExperimentalBatch{
Expand Down
13 changes: 6 additions & 7 deletions src/internal/trace/internal/testgen/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import (
"internal/trace"
"internal/trace/raw"
"internal/trace/tracev2"
"internal/trace/tracev2/event"
"internal/trace/version"
"internal/txtar"
)
Expand Down Expand Up @@ -51,8 +50,8 @@ func Main(ver version.Version, f func(*Trace)) {
type Trace struct {
// Trace data state.
ver version.Version
names map[string]event.Type
specs []event.Spec
names map[string]tracev2.EventType
specs []tracev2.EventSpec
events []raw.Event
gens []*Generation
validTimestamps bool
Expand All @@ -65,7 +64,7 @@ type Trace struct {
// NewTrace creates a new trace.
func NewTrace(ver version.Version) *Trace {
return &Trace{
names: event.Names(ver.Specs()),
names: tracev2.EventNames(ver.Specs()),
specs: ver.Specs(),
validTimestamps: true,
}
Expand All @@ -86,7 +85,7 @@ func (t *Trace) ExpectSuccess() {
// RawEvent emits an event into the trace. name must correspond to one
// of the names in Specs() result for the version that was passed to
// this trace.
func (t *Trace) RawEvent(typ event.Type, data []byte, args ...uint64) {
func (t *Trace) RawEvent(typ tracev2.EventType, data []byte, args ...uint64) {
t.events = append(t.events, t.createEvent(typ, data, args...))
}

Expand Down Expand Up @@ -146,7 +145,7 @@ func (t *Trace) Generate() []byte {
})
}

func (t *Trace) createEvent(ev event.Type, data []byte, args ...uint64) raw.Event {
func (t *Trace) createEvent(ev tracev2.EventType, data []byte, args ...uint64) raw.Event {
spec := t.specs[ev]
if ev != tracev2.EvStack {
if arity := len(spec.Args); len(args) != arity {
Expand Down Expand Up @@ -362,7 +361,7 @@ func (b *Batch) uintArgFor(arg any, argSpec string) uint64 {
// RawEvent emits an event into a batch. name must correspond to one
// of the names in Specs() result for the version that was passed to
// this trace.
func (b *Batch) RawEvent(typ event.Type, data []byte, args ...uint64) {
func (b *Batch) RawEvent(typ tracev2.EventType, data []byte, args ...uint64) {
ev := b.gen.trace.createEvent(typ, data, args...)

// Compute the size of the event and add it to the batch.
Expand Down
Loading

0 comments on commit 8b8ab25

Please sign in to comment.