Skip to content

Commit

Permalink
Merge pull request #24082 from Luap99/netns-leak
Browse files Browse the repository at this point in the history
Fix netns leak on container creation and exit code 1 on SIGTERM.
  • Loading branch information
openshift-merge-bot[bot] authored Oct 1, 2024
2 parents 13b78c9 + 5de7b7c commit 857a47d
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 33 deletions.
4 changes: 4 additions & 0 deletions libpod/container_internal_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/containers/common/pkg/cgroups"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v5/libpod/define"
"github.com/containers/podman/v5/libpod/shutdown"
"github.com/containers/podman/v5/pkg/rootless"
spec "github.com/opencontainers/runtime-spec/specs-go"
"github.com/opencontainers/runtime-tools/generate"
Expand Down Expand Up @@ -67,6 +68,9 @@ func (c *Container) prepare() error {
tmpStateLock sync.Mutex
)

shutdown.Inhibit()
defer shutdown.Uninhibit()

wg.Add(2)

go func() {
Expand Down
5 changes: 0 additions & 5 deletions libpod/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,11 +218,6 @@ func newRuntimeFromConfig(ctx context.Context, conf *config.Config, options ...R
if runtime.store != nil {
_, _ = 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
}); err != nil && !errors.Is(err, shutdown.ErrHandlerExists) {
logrus.Errorf("Registering shutdown handler for libpod: %v", err)
Expand Down
37 changes: 10 additions & 27 deletions libpod/shutdown/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,18 @@ var (
shutdownInhibit sync.RWMutex
logrus = logrusImport.WithField("PID", os.Getpid())
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
// 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 {
if sigChan != nil {
// Already running, do nothing.
Expand Down Expand Up @@ -75,6 +83,7 @@ func Start() error {
}
handlerLock.Unlock()
shutdownInhibit.Unlock()
os.Exit(exitCode)
return
}
}()
Expand Down Expand Up @@ -131,29 +140,3 @@ func Register(name string, handler func(os.Signal) error) error {

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
}
8 changes: 7 additions & 1 deletion pkg/api/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,13 @@ func (s *APIServer) Serve() error {
s.setupPprof()

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 {
return err
}
Expand Down

1 comment on commit 857a47d

@packit-as-a-service
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

podman-next COPR build failed. @containers/packit-build please check.

Please sign in to comment.