@@ -385,6 +385,12 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
385385
386386 switch status .Status {
387387 case containerd .Created , containerd .Stopped :
388+ // Cleanup the IO after a successful Stop
389+ if io := task .IO (); io != nil {
390+ if cerr := io .Close (); cerr != nil {
391+ log .G (ctx ).Warnf ("failed to close IO for container %s: %v" , container .ID (), cerr )
392+ }
393+ }
388394 return nil
389395 case containerd .Paused , containerd .Pausing :
390396 paused = true
@@ -397,6 +403,13 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
397403 return err
398404 }
399405
406+ // signal will be sent once resume is finished
407+ if paused {
408+ if err := task .Resume (ctx ); err != nil {
409+ log .G (ctx ).Errorf ("Cannot unpause container %s: %s" , container .ID (), err )
410+ return err
411+ }
412+ }
400413 if * timeout > 0 {
401414 sig , err := getSignal (signalValue , l )
402415 if err != nil {
@@ -407,20 +420,10 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
407420 return err
408421 }
409422
410- // signal will be sent once resume is finished
411- if paused {
412- if err := task .Resume (ctx ); err != nil {
413- log .G (ctx ).Warnf ("Cannot unpause container %s: %s" , container .ID (), err )
414- } else {
415- // no need to do it again when send sigkill signal
416- paused = false
417- }
418- }
419-
420423 sigtermCtx , sigtermCtxCancel := context .WithTimeout (ctx , * timeout )
421424 defer sigtermCtxCancel ()
422425
423- err = waitContainerStop (sigtermCtx , exitCh , container .ID ())
426+ err = waitContainerStop (sigtermCtx , task , exitCh , container .ID ())
424427 if err == nil {
425428 return nil
426429 }
@@ -439,13 +442,7 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
439442 return err
440443 }
441444
442- // signal will be sent once resume is finished
443- if paused {
444- if err := task .Resume (ctx ); err != nil {
445- log .G (ctx ).Warnf ("Cannot unpause container %s: %s" , container .ID (), err )
446- }
447- }
448- return waitContainerStop (ctx , exitCh , container .ID ())
445+ return waitContainerStop (ctx , task , exitCh , container .ID ())
449446}
450447
451448func getSignal (signalValue string , containerLabels map [string ]string ) (syscall.Signal , error ) {
@@ -460,7 +457,7 @@ func getSignal(signalValue string, containerLabels map[string]string) (syscall.S
460457 return signal .ParseSignal ("SIGTERM" )
461458}
462459
463- func waitContainerStop (ctx context.Context , exitCh <- chan containerd.ExitStatus , id string ) error {
460+ func waitContainerStop (ctx context.Context , task containerd. Task , exitCh <- chan containerd.ExitStatus , id string ) error {
464461 select {
465462 case <- ctx .Done ():
466463 if err := ctx .Err (); err != nil {
0 commit comments