Merge pull request #24082 from Luap99/netns-leak

Fix netns leak on container creation and exit code 1 on SIGTERM.
This commit is contained in:
openshift-merge-bot[bot] 2024-10-01 21:02:05 +00:00 committed by GitHub
commit 857a47de9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 21 additions and 33 deletions

View File

@ -19,6 +19,7 @@ import (
"github.com/containers/common/pkg/cgroups" "github.com/containers/common/pkg/cgroups"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/podman/v5/libpod/define" "github.com/containers/podman/v5/libpod/define"
"github.com/containers/podman/v5/libpod/shutdown"
"github.com/containers/podman/v5/pkg/rootless" "github.com/containers/podman/v5/pkg/rootless"
spec "github.com/opencontainers/runtime-spec/specs-go" spec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/opencontainers/runtime-tools/generate" "github.com/opencontainers/runtime-tools/generate"
@ -67,6 +68,9 @@ func (c *Container) prepare() error {
tmpStateLock sync.Mutex tmpStateLock sync.Mutex
) )
shutdown.Inhibit()
defer shutdown.Uninhibit()
wg.Add(2) wg.Add(2)
go func() { go func() {

View File

@ -218,11 +218,6 @@ func newRuntimeFromConfig(ctx context.Context, conf *config.Config, options ...R
if runtime.store != nil { if runtime.store != nil {
_, _ = runtime.store.Shutdown(false) _, _ = runtime.store.Shutdown(false)
} }
// For `systemctl stop podman.service` support, exit code should be 0
if sig == syscall.SIGTERM {
os.Exit(0)
}
os.Exit(1)
return nil return nil
}); err != nil && !errors.Is(err, shutdown.ErrHandlerExists) { }); err != nil && !errors.Is(err, shutdown.ErrHandlerExists) {
logrus.Errorf("Registering shutdown handler for libpod: %v", err) logrus.Errorf("Registering shutdown handler for libpod: %v", err)

View File

@ -28,10 +28,18 @@ var (
shutdownInhibit sync.RWMutex shutdownInhibit sync.RWMutex
logrus = logrusImport.WithField("PID", os.Getpid()) logrus = logrusImport.WithField("PID", os.Getpid())
ErrNotStarted = errors.New("shutdown signal handler has not yet been started") ErrNotStarted = errors.New("shutdown signal handler has not yet been started")
// exitCode used to exit once we are done with all signal handlers, by default 1
exitCode = 1
) )
// SetExitCode when we exit after we ran all shutdown handlers, it should be positive.
func SetExitCode(i int) {
exitCode = i
}
// Start begins handling SIGTERM and SIGINT and will run the given on-signal // Start begins handling SIGTERM and SIGINT and will run the given on-signal
// handlers when one is called. This can be cancelled by calling Stop(). // handlers when one is called and then exit with the exit code of 1 if not
// overwritten with SetExitCode(). This can be cancelled by calling Stop().
func Start() error { func Start() error {
if sigChan != nil { if sigChan != nil {
// Already running, do nothing. // Already running, do nothing.
@ -75,6 +83,7 @@ func Start() error {
} }
handlerLock.Unlock() handlerLock.Unlock()
shutdownInhibit.Unlock() shutdownInhibit.Unlock()
os.Exit(exitCode)
return return
} }
}() }()
@ -131,29 +140,3 @@ func Register(name string, handler func(os.Signal) error) error {
return nil return nil
} }
// Unregister un-registers a given shutdown handler.
func Unregister(name string) error {
handlerLock.Lock()
defer handlerLock.Unlock()
if handlers == nil {
return nil
}
if _, ok := handlers[name]; !ok {
return nil
}
delete(handlers, name)
newOrder := []string{}
for _, checkName := range handlerOrder {
if checkName != name {
newOrder = append(newOrder, checkName)
}
}
handlerOrder = newOrder
return nil
}

View File

@ -197,7 +197,13 @@ func (s *APIServer) Serve() error {
s.setupPprof() s.setupPprof()
if err := shutdown.Register("service", func(sig os.Signal) error { if err := shutdown.Register("service", func(sig os.Signal) error {
return s.Shutdown(true) err := s.Shutdown(true)
if err == nil {
// For `systemctl stop podman.service` support, exit code should be 0
// but only if we did indeed gracefully shutdown
shutdown.SetExitCode(0)
}
return err
}); err != nil { }); err != nil {
return err return err
} }