[kata-dev] kata-agent RemoveContainer timeout buggy?

Tao Peng bergwolf at hyper.sh
Fri Nov 9 11:10:02 UTC 2018


On Fri, Nov 9, 2018 at 6:46 PM Stefan Hajnoczi <stefanha at redhat.com> wrote:
>
> It looks like the goroutine will be left running when kata-agent
> RemoveContainer() returns after a timeout.  In addition, the sandbox
> lock is no longer held so any actions taken by the goroutine could cause
> problems.
>
> Am I understanding the code correctly?
>
Yes, you are right! The main issue with the approach is that
`ctr.removeContainer` doesn't honor timeout and we cannot force quit
it in the middle.

Any suggestions?

Cheers,
Tao

> func (a *agentGRPC) RemoveContainer(ctx context.Context, req *pb.RemoveContainerRequest) (*gpb.Empty, error) {
>         ...
>
>         timeout := int(req.Timeout)
>
>         a.sandbox.Lock()
>         defer a.sandbox.Unlock()
>
>         if timeout == 0 {
>                 ...
>         } else {
>                 done := make(chan error)
>                 go func() {
>                         if err := ctr.removeContainer(); err != nil {
>                                 done <- err
>                                 close(done)
>                                 return
>                         }
>
>                         //Find the sandbox storage used by this container
>                         for _, path := range ctr.mounts {
>                                 if _, ok := a.sandbox.storages[path]; ok {
>                                         if err := a.sandbox.unsetAndRemoveSandboxStorage(path); err != nil {
>                                                 done <- err
>                                                 close(done)
>                                                 return
>                                         }
>                                 }
>                         }
>                         close(done)
>                 }()
>
>                 select {
>                 case err := <-done:
>                         if err != nil {
>                                 return emptyResp, err
>                         }
>                 case <-time.After(time.Duration(req.Timeout) * time.Second):
>                         return emptyResp, grpcStatus.Errorf(codes.DeadlineExceeded, "Timeout reached after %ds", timeout)
>
> Stefan
> _______________________________________________
> kata-dev mailing list
> kata-dev at lists.katacontainers.io
> http://lists.katacontainers.io/cgi-bin/mailman/listinfo/kata-dev



-- 
bergwolf at hyper.sh



More information about the kata-dev mailing list