shimv2: fix the issue of leaking wait goroutines

After create an container/exec successfully, containerd
would wait it immediately, and if start it failed, there
is no chance to send value to exitCh, thus the wait goroutine
would blocked for ever and had no chance to exit.

Fixes: #2087

Signed-off-by: fupan.lfp <fupan.lfp@antgroup.com>
This commit is contained in:
fupan.lfp 2021-06-23 19:20:28 +08:00
parent c0cc6d5978
commit b3623a2c40

View File

@ -13,7 +13,13 @@ import (
"github.com/kata-containers/kata-containers/src/runtime/pkg/katautils"
)
func startContainer(ctx context.Context, s *service, c *container) error {
func startContainer(ctx context.Context, s *service, c *container) (retErr error) {
defer func() {
if retErr != nil {
// notify the wait goroutine to continue
c.exitCh <- exitCode255
}
}()
// start a container
if c.cType == "" {
err := fmt.Errorf("Bug, the container %s type is empty", c.id)
@ -87,7 +93,7 @@ func startContainer(ctx context.Context, s *service, c *container) error {
return nil
}
func startExec(ctx context.Context, s *service, containerID, execID string) (*exec, error) {
func startExec(ctx context.Context, s *service, containerID, execID string) (e *exec, retErr error) {
// start an exec
c, err := s.getContainer(containerID)
if err != nil {
@ -99,6 +105,13 @@ func startExec(ctx context.Context, s *service, containerID, execID string) (*ex
return nil, err
}
defer func() {
if retErr != nil {
// notify the wait goroutine to continue
execs.exitCh <- exitCode255
}
}()
_, proc, err := s.sandbox.EnterContainer(ctx, containerID, *execs.cmds)
if err != nil {
err := fmt.Errorf("cannot enter container %s, with err %s", containerID, err)