mirror of
https://github.com/aljazceru/kata-containers.git
synced 2026-01-28 18:54:37 +01:00
in wait function, should send msg to exit channel after task status has updated, since shim.Wait() is running in another goroutine, when it receive msg from exit channel, it will stop waiting and return, then someone who hold this Wait() get return, it can delete task, if exit msg is send first, the container status may still be running. Fixes: #1600 Signed-off-by: Ace-Tang <aceapril@126.com>
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
// Copyright (c) 2018 HyperHQ Inc.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package containerdshim
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/containerd/containerd/api/types/task"
|
|
"github.com/containerd/containerd/errdefs"
|
|
taskAPI "github.com/containerd/containerd/runtime/v2/task"
|
|
|
|
vc "github.com/kata-containers/runtime/virtcontainers"
|
|
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
|
|
)
|
|
|
|
type container struct {
|
|
s *service
|
|
ttyio *ttyIO
|
|
spec *oci.CompatOCISpec
|
|
exitTime time.Time
|
|
execs map[string]*exec
|
|
exitIOch chan struct{}
|
|
exitCh chan uint32
|
|
id string
|
|
stdin string
|
|
stdout string
|
|
stderr string
|
|
bundle string
|
|
cType vc.ContainerType
|
|
mu sync.Mutex
|
|
exit uint32
|
|
status task.Status
|
|
terminal bool
|
|
}
|
|
|
|
func newContainer(s *service, r *taskAPI.CreateTaskRequest, containerType vc.ContainerType, spec *oci.CompatOCISpec) (*container, error) {
|
|
if r == nil {
|
|
return nil, errdefs.ToGRPCf(errdefs.ErrInvalidArgument, " CreateTaskRequest points to nil")
|
|
}
|
|
|
|
// in order to avoid deferencing a nil pointer in test
|
|
if spec == nil {
|
|
spec = &oci.CompatOCISpec{}
|
|
}
|
|
|
|
c := &container{
|
|
s: s,
|
|
spec: spec,
|
|
id: r.ID,
|
|
bundle: r.Bundle,
|
|
stdin: r.Stdin,
|
|
stdout: r.Stdout,
|
|
stderr: r.Stderr,
|
|
terminal: r.Terminal,
|
|
cType: containerType,
|
|
execs: make(map[string]*exec),
|
|
status: task.StatusCreated,
|
|
exitIOch: make(chan struct{}),
|
|
exitCh: make(chan uint32, 1),
|
|
}
|
|
return c, nil
|
|
}
|