From 36d1b7d2a576aa0ca88a7c3478a9c5904ac8ec01 Mon Sep 17 00:00:00 2001 From: Evan Lezar <7723350-elezar@users.noreply.gitlab.com> Date: Thu, 1 Jun 2023 07:44:56 +0000 Subject: [PATCH] Merge branch 'treat-log-errors-as-non-fatal' into 'main' Ignore errors when creating debug log file See merge request nvidia/container-toolkit/container-toolkit!404 --- CHANGELOG.md | 1 + internal/runtime/logger.go | 22 +++++++++++++--------- internal/runtime/runtime.go | 12 ++++-------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cde0fe8..f3f42979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Fix bug in creation of `/dev/char` symlinks by failing operation if kernel modules are not loaded. * Add option to load kernel modules when creating device nodes * Add option to create device nodes when creating `/dev/char` symlinks +* Treat failures to open debug log files as non-fatal. ## v1.13.1 diff --git a/internal/runtime/logger.go b/internal/runtime/logger.go index 879c6bc0..b3122acc 100644 --- a/internal/runtime/logger.go +++ b/internal/runtime/logger.go @@ -17,6 +17,7 @@ package runtime import ( + "errors" "fmt" "io" "os" @@ -43,7 +44,7 @@ func NewLogger() *Logger { } // Update constructs a Logger with a preddefined formatter -func (l *Logger) Update(filename string, logLevel string, argv []string) error { +func (l *Logger) Update(filename string, logLevel string, argv []string) { configFromArgs := parseArgs(argv) @@ -61,7 +62,7 @@ func (l *Logger) Update(filename string, logLevel string, argv []string) error { if !configFromArgs.version { configLogFile, err := createLogFile(filename) if err != nil { - return fmt.Errorf("error opening debug log file: %v", err) + argLogFileError = errors.Join(argLogFileError, err) } if configLogFile != nil { logFiles = append(logFiles, configLogFile) @@ -71,7 +72,7 @@ func (l *Logger) Update(filename string, logLevel string, argv []string) error { if argLogFile != nil { logFiles = append(logFiles, argLogFile) } - argLogFileError = err + argLogFileError = errors.Join(argLogFileError, err) } defer func() { if argLogFileError != nil { @@ -119,8 +120,6 @@ func (l *Logger) Update(filename string, logLevel string, argv []string) error { previousLogger: l.Logger, logFiles: logFiles, } - - return nil } // Reset closes the log file (if any) and resets the logger output to what it @@ -157,11 +156,16 @@ func (l *Logger) Reset() error { } func createLogFile(filename string) (*os.File, error) { - if filename != "" && filename != os.DevNull { - return os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if filename == "" || filename == os.DevNull { + return nil, nil } - - return nil, nil + if dir := filepath.Dir(filepath.Clean(filename)); dir != "." { + err := os.MkdirAll(dir, 0755) + if err != nil { + return nil, err + } + } + return os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) } type loggerConfig struct { diff --git a/internal/runtime/runtime.go b/internal/runtime/runtime.go index 62838ec1..850b2865 100644 --- a/internal/runtime/runtime.go +++ b/internal/runtime/runtime.go @@ -44,18 +44,11 @@ func (r rt) Run(argv []string) (rerr error) { if err != nil { return fmt.Errorf("error loading config: %v", err) } - if r.modeOverride != "" { - cfg.NVIDIAContainerRuntimeConfig.Mode = r.modeOverride - } - - err = r.logger.Update( + r.logger.Update( cfg.NVIDIAContainerRuntimeConfig.DebugFilePath, cfg.NVIDIAContainerRuntimeConfig.LogLevel, argv, ) - if err != nil { - return fmt.Errorf("failed to set up logger: %v", err) - } defer func() { if rerr != nil { r.logger.Errorf("%v", rerr) @@ -65,6 +58,9 @@ func (r rt) Run(argv []string) (rerr error) { // We apply some config updates here to ensure that the config is valid in // all cases. + if r.modeOverride != "" { + cfg.NVIDIAContainerRuntimeConfig.Mode = r.modeOverride + } cfg.NVIDIAContainerRuntimeHookConfig.Path = config.ResolveNVIDIAContainerRuntimeHookPath(r.logger.Logger, cfg.NVIDIAContainerRuntimeHookConfig.Path) // Print the config to the output.