Skip to content

Commit

Permalink
cmd/preprofile: clean up error handling
Browse files Browse the repository at this point in the history
This CL adjusts error handling to be a bit more idiomatic. The
processing function returns errors, leaving main to log and exit on
error.

This CL contains no functional changes.

For golang#58102.

Change-Id: I9074127cc675e177d046474b7f01fbc37d0bd4c0
Reviewed-on: https://go-review.googlesource.com/c/go/+/569335
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
  • Loading branch information
prattmic authored and Mchnan committed Mar 28, 2024
1 parent 24882c1 commit c3ea99c
Showing 1 changed file with 26 additions and 28 deletions.
54 changes: 26 additions & 28 deletions src/cmd/preprofile/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
//
// Usage:
//
// go tool preprofile [-v] [-o output] [-i (pprof)input]
// go tool preprofile [-v] [-o output] -i input
//
//

Expand All @@ -32,45 +32,50 @@ import (
// in current Go Compiler.
// The format of the pre-processed output is as follows.
//
// Header
// caller_name
// Header
// caller_name
// callee_name
// "call site offset" "call edge weight"
// ...
// caller_name
// caller_name
// callee_name
// "call site offset" "call edge weight"

func usage() {
fmt.Fprintf(os.Stderr, "MUST have (pprof) input file \n")
fmt.Fprintf(os.Stderr, "usage: go tool preprofile [-v] [-o output] [-i (pprof)input] \n\n")
fmt.Fprintf(os.Stderr, "usage: go tool preprofile [-v] [-o output] -i input\n\n")
flag.PrintDefaults()
os.Exit(2)
}

var (
output = flag.String("o", "", "output file path")
input = flag.String("i", "", "input pprof file path")
verbose = flag.Bool("v", false, "enable verbose logging")
)

type NodeMapKey struct {
CallerName string
CalleeName string
CallSiteOffset int // Line offset from function start line.
}

func readPprofFile(profileFile string, outputFile string, verbose bool) bool {
func preprocess(profileFile string, outputFile string, verbose bool) error {
// open the pprof profile file
f, err := os.Open(profileFile)
if err != nil {
log.Fatal("failed to open file " + profileFile)
return false
return fmt.Errorf("error opening profile: %w", err)
}
defer f.Close()
p, err := profile.Parse(f)
if err != nil {
log.Fatal("failed to Parse profile file.")
return false
return fmt.Errorf("error parsing profile: %w", err)
}

if len(p.Sample) == 0 {
// We accept empty profiles, but there is nothing to do.
return false
//
// TODO(prattmic): write an "empty" preprocessed file.
return nil
}

valueIndex := -1
Expand All @@ -85,8 +90,7 @@ func readPprofFile(profileFile string, outputFile string, verbose bool) bool {
}

if valueIndex == -1 {
log.Fatal("failed to find CPU samples count or CPU nanoseconds value-types in profile.")
return false
return fmt.Errorf("failed to find CPU samples count or CPU nanoseconds value-types in profile.")
}

// The processing here is equivalent to cmd/compile/internal/pgo.createNamedEdgeMap.
Expand Down Expand Up @@ -131,16 +135,15 @@ func readPprofFile(profileFile string, outputFile string, verbose bool) bool {
dirPath := filepath.Dir(outputFile)
_, err := os.Stat(dirPath)
if err != nil {
log.Fatal("Directory does not exist: ", dirPath)
return fmt.Errorf("directory does not exist: %s", dirPath)
}
base := filepath.Base(outputFile)
outputFile = filepath.Join(dirPath, base)

// write out NodeMap to a file
fNodeMap, err = os.Create(outputFile)
if err != nil {
log.Fatal("Error creating output file:", err)
return false
return fmt.Errorf("Error creating output file: %w", err)
}

defer fNodeMap.Close() // Close the file when done writing
Expand All @@ -162,26 +165,21 @@ func readPprofFile(profileFile string, outputFile string, verbose bool) bool {
count += 1
}

if TotalEdgeWeight == 0 {
return false
}

return true
return nil
}

var dumpCode = flag.String("o", "", "dump output file ")
var input = flag.String("i", "", "input pprof file ")
var verbose = flag.Bool("v", false, "verbose log")

func main() {
log.SetFlags(0)
log.SetPrefix("preprofile: ")

flag.Usage = usage
flag.Parse()
if *input == "" {
log.Print("Input pprof path required (-i)")
usage()
} else {
readPprofFile(*input, *dumpCode, *verbose)
}

if err := preprocess(*input, *output, *verbose); err != nil {
log.Fatal(err)
}
}

0 comments on commit c3ea99c

Please sign in to comment.