runtime-v2: Make sure Shutdown() only shuts the server down

Because the runtime v2 runs as a RPC server, the caller will at some
point use the Shutdown() API to shut down the server. Because this
will cause the server to exit, the caller cannot expect any valid
answer when calling this. That's why we cannot afford stopping and
deleting the sandbox from this function.

Instead, we move sandbox.Stop() and sandbox.Delete() to a more
appropriate API, the Delete() one.

Fixes #1150

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf 2019-01-17 22:15:29 -08:00
parent d7b02c502e
commit 5329a71b3d

View File

@ -386,6 +386,22 @@ func (s *service) Delete(ctx context.Context, r *taskAPI.DeleteRequest) (*taskAP
return nil, err return nil, err
} }
// Take care of the use case where it is a sandbox.
// Right after the container representing the sandbox has
// been deleted, let's make sure we stop and delete the
// sandbox.
if c.cType.IsSandbox() {
if err = s.sandbox.Stop(); err != nil {
logrus.WithField("sandbox", s.sandbox.ID()).Error("failed to stop sandbox")
return nil, err
}
if err = s.sandbox.Delete(); err != nil {
logrus.WithField("sandbox", s.sandbox.ID()).Error("failed to delete sandbox")
return nil, err
}
}
return &taskAPI.DeleteResponse{ return &taskAPI.DeleteResponse{
ExitStatus: c.exit, ExitStatus: c.exit,
ExitedAt: c.time, ExitedAt: c.time,
@ -654,26 +670,17 @@ func (s *service) Connect(ctx context.Context, r *taskAPI.ConnectRequest) (*task
func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*ptypes.Empty, error) { func (s *service) Shutdown(ctx context.Context, r *taskAPI.ShutdownRequest) (*ptypes.Empty, error) {
s.Lock() s.Lock()
defer s.Unlock()
if len(s.containers) != 0 { if len(s.containers) != 0 {
s.Unlock()
return empty, nil return empty, nil
} }
s.Unlock()
defer os.Exit(0) os.Exit(0)
err := s.sandbox.Stop() // This will never be called, but this is only there to make sure the
if err != nil { // program can compile.
logrus.WithField("sandbox", s.sandbox.ID()).Error("failed to stop sandbox") return empty, nil
return empty, err
}
err = s.sandbox.Delete()
if err != nil {
logrus.WithField("sandbox", s.sandbox.ID()).Error("failed to delete sandbox")
}
return empty, err
} }
func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (*taskAPI.StatsResponse, error) { func (s *service) Stats(ctx context.Context, r *taskAPI.StatsRequest) (*taskAPI.StatsResponse, error) {