Stop profiling on exit of main goroutine (#1670)

* Stop profiling on exit of main goroutine

Previously, profiling was stopped since Stop() method was called on exit of cli.BeforeFunc.
This lead to profiling to be stopped prematurely.

* Moved profiling switch statement to a separate func
master
Krishnan Parthasarathi 9 years ago committed by Harshavardhana
parent dc36594ef4
commit 2f05aacbf2
  1. 34
      main.go

@ -150,6 +150,19 @@ func mustGetProfilePath() string {
return filepath.Join(mustGetConfigPath(), globalMinioProfilePath) return filepath.Join(mustGetConfigPath(), globalMinioProfilePath)
} }
func setupProfilingFromEnv(profiler *interface {
Stop()
}) {
switch os.Getenv("MINIO_PROFILER") {
case "cpu":
*profiler = profile.Start(profile.CPUProfile, profile.ProfilePath(mustGetProfilePath()))
case "mem":
*profiler = profile.Start(profile.MemProfile, profile.ProfilePath(mustGetProfilePath()))
case "block":
*profiler = profile.Start(profile.BlockProfile, profile.ProfilePath(mustGetProfilePath()))
}
}
func main() { func main() {
// Set global trace flag. // Set global trace flag.
trace := os.Getenv("MINIO_TRACE") trace := os.Getenv("MINIO_TRACE")
@ -159,6 +172,9 @@ func main() {
probe.SetAppInfo("Release-Tag", minioReleaseTag) probe.SetAppInfo("Release-Tag", minioReleaseTag)
probe.SetAppInfo("Commit-ID", minioShortCommitID) probe.SetAppInfo("Commit-ID", minioShortCommitID)
var profiler interface {
Stop()
}
app := registerApp() app := registerApp()
app.Before = func(c *cli.Context) error { app.Before = func(c *cli.Context) error {
// Sets new config folder. // Sets new config folder.
@ -195,18 +211,20 @@ func main() {
// Enable profiling supported modes are [cpu, mem, block]. // Enable profiling supported modes are [cpu, mem, block].
// ``MINIO_PROFILER`` supported options are [cpu, mem, block]. // ``MINIO_PROFILER`` supported options are [cpu, mem, block].
switch os.Getenv("MINIO_PROFILER") { setupProfilingFromEnv(&profiler)
case "cpu":
defer profile.Start(profile.CPUProfile, profile.ProfilePath(mustGetProfilePath())).Stop()
case "mem":
defer profile.Start(profile.MemProfile, profile.ProfilePath(mustGetProfilePath())).Stop()
case "block":
defer profile.Start(profile.BlockProfile, profile.ProfilePath(mustGetProfilePath())).Stop()
}
// Return here. // Return here.
return nil return nil
} }
// Stop profiling on exit.
// N B If any inner function calls os.Exit() the defer(s) stacked wouldn't be called
defer func() {
if profiler != nil {
profiler.Stop()
}
}()
// Run the app - exit on error. // Run the app - exit on error.
app.RunAndExitOnError() app.RunAndExitOnError()
} }

Loading…
Cancel
Save