From 079292e3fc20b7319b6e7c35dcda6864bb128f1c Mon Sep 17 00:00:00 2001 From: Ace-Tang Date: Mon, 10 Sep 2018 13:32:02 +0800 Subject: [PATCH] fix: modify lock location of exec delete func (e *execProcess) delete(ctx context.Context) error { e.wg.Wait() ... } delete exec process will wait for io copy finish, if wait here, other process can not get lock of shim service. 1. apply lock around s.transition() calls in the Delete methods. 2. put lock after wait io copy in exec Delete. Signed-off-by: Ace-Tang --- runtime/v1/linux/proc/exec_state.go | 8 ++++---- runtime/v1/shim/service.go | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/runtime/v1/linux/proc/exec_state.go b/runtime/v1/linux/proc/exec_state.go index 617ec0d97..ac5467552 100644 --- a/runtime/v1/linux/proc/exec_state.go +++ b/runtime/v1/linux/proc/exec_state.go @@ -60,11 +60,11 @@ func (s *execCreatedState) Start(ctx context.Context) error { } func (s *execCreatedState) Delete(ctx context.Context) error { - s.p.mu.Lock() - defer s.p.mu.Unlock() if err := s.p.delete(ctx); err != nil { return err } + s.p.mu.Lock() + defer s.p.mu.Unlock() return s.transition("deleted") } @@ -168,11 +168,11 @@ func (s *execStoppedState) Start(ctx context.Context) error { } func (s *execStoppedState) Delete(ctx context.Context) error { - s.p.mu.Lock() - defer s.p.mu.Unlock() if err := s.p.delete(ctx); err != nil { return err } + s.p.mu.Lock() + defer s.p.mu.Unlock() return s.transition("deleted") } diff --git a/runtime/v1/shim/service.go b/runtime/v1/shim/service.go index afb860cb0..d76d5803d 100644 --- a/runtime/v1/shim/service.go +++ b/runtime/v1/shim/service.go @@ -224,19 +224,21 @@ func (s *Service) Delete(ctx context.Context, r *ptypes.Empty) (*shimapi.DeleteR // DeleteProcess deletes an exec'd process func (s *Service) DeleteProcess(ctx context.Context, r *shimapi.DeleteProcessRequest) (*shimapi.DeleteResponse, error) { - s.mu.Lock() - defer s.mu.Unlock() if r.ID == s.id { return nil, status.Errorf(codes.InvalidArgument, "cannot delete init process with DeleteProcess") } + s.mu.Lock() p := s.processes[r.ID] + s.mu.Unlock() if p == nil { return nil, errors.Wrapf(errdefs.ErrNotFound, "process %s", r.ID) } if err := p.Delete(ctx); err != nil { return nil, err } + s.mu.Lock() delete(s.processes, r.ID) + s.mu.Unlock() return &shimapi.DeleteResponse{ ExitStatus: uint32(p.ExitStatus()), ExitedAt: p.ExitedAt(),