From 20c89ebbb30f44bbd0eba4e462846a89ab3a56fa Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Thu, 22 Sep 2022 19:57:27 +0100 Subject: [PATCH] freeze before exit when _MINIO_DEBUG_NO_EXIT is defined (#15709) this is to ensure keep k8s pods running, when they reach a "crashloop" stage --- cmd/main.go | 23 ++++++++++++++++++++++- internal/logger/console.go | 7 +++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 8e1486ad9..e727d0914 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -23,11 +23,13 @@ import ( "os" "path/filepath" "runtime" + "runtime/debug" "sort" "strings" "github.com/minio/cli" "github.com/minio/minio/internal/color" + "github.com/minio/minio/internal/logger" "github.com/minio/pkg/console" "github.com/minio/pkg/trie" "github.com/minio/pkg/words" @@ -189,8 +191,27 @@ func Main(args []string) { // Set the minio app name. appName := filepath.Base(args[0]) + if os.Getenv("_MINIO_DEBUG_NO_EXIT") != "" { + freeze := func(_ int) { + // Infinite blocking op + <-make(chan struct{}) + } + + // Override the logger os.Exit() + logger.ExitFunc = freeze + + defer func() { + if err := recover(); err != nil { + fmt.Println("panic:", err) + fmt.Println("") + fmt.Println(string(debug.Stack())) + } + freeze(-1) + }() + } + // Run the app - exit on error. if err := newApp(appName).Run(args); err != nil { - os.Exit(1) + os.Exit(1) //nolint:gocritic } } diff --git a/internal/logger/console.go b/internal/logger/console.go index 70100d1b9..dd2c8b122 100644 --- a/internal/logger/console.go +++ b/internal/logger/console.go @@ -32,6 +32,9 @@ import ( // ConsoleLoggerTgt is a stringified value to represent console logging const ConsoleLoggerTgt = "console+http" +// ExitFunc is called by Fatal() class functions, by default it calls os.Exit() +var ExitFunc = os.Exit + // Logger interface describes the methods that need to be implemented to satisfy the interface requirements. type Logger interface { json(msg string, args ...interface{}) @@ -90,7 +93,7 @@ func (f fatalMsg) json(msg string, args ...interface{}) { } fmt.Println(string(logJSON)) - os.Exit(1) + ExitFunc(1) } func (f fatalMsg) quiet(msg string, args ...interface{}) { @@ -143,7 +146,7 @@ func (f fatalMsg) pretty(msg string, args ...interface{}) { } // Exit because this is a fatal error message - os.Exit(1) + ExitFunc(1) } type infoMsg struct{}