@@ -397,30 +397,25 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
397397 return err
398398 }
399399
400+ // signal will be sent once resume is finished
401+ if paused {
402+ if err := task .Resume (ctx ); err != nil {
403+ log .G (ctx ).Errorf ("Cannot unpause container %s: %s" , container .ID (), err )
404+ return err
405+ }
406+ }
400407 if * timeout > 0 {
401408 sig , err := getSignal (signalValue , l )
402409 if err != nil {
403410 return err
404411 }
405-
406412 if err := task .Kill (ctx , sig ); err != nil {
407413 return err
408414 }
409-
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-
420415 sigtermCtx , sigtermCtxCancel := context .WithTimeout (ctx , * timeout )
421416 defer sigtermCtxCancel ()
422417
423- err = waitContainerStop (sigtermCtx , exitCh , container .ID ())
418+ err = waitContainerStop (sigtermCtx , task , exitCh , container .ID ())
424419 if err == nil {
425420 return nil
426421 }
@@ -434,18 +429,10 @@ func Stop(ctx context.Context, container containerd.Container, timeout *time.Dur
434429 if err != nil {
435430 return err
436431 }
437-
438432 if err := task .Kill (ctx , sig ); err != nil {
439433 return err
440434 }
441-
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 ())
435+ return waitContainerStop (ctx , task , exitCh , container .ID ())
449436}
450437
451438func getSignal (signalValue string , containerLabels map [string ]string ) (syscall.Signal , error ) {
@@ -460,14 +447,20 @@ func getSignal(signalValue string, containerLabels map[string]string) (syscall.S
460447 return signal .ParseSignal ("SIGTERM" )
461448}
462449
463- func waitContainerStop (ctx context.Context , exitCh <- chan containerd.ExitStatus , id string ) error {
450+ func waitContainerStop (ctx context.Context , task containerd. Task , exitCh <- chan containerd.ExitStatus , id string ) error {
464451 select {
465452 case <- ctx .Done ():
466453 if err := ctx .Err (); err != nil {
467454 return fmt .Errorf ("wait container %v: %w" , id , err )
468455 }
469456 return nil
470457 case status := <- exitCh :
458+ // Cleanup the IO after a successful Stop
459+ if io := task .IO (); io != nil {
460+ if cerr := io .Close (); cerr != nil {
461+ log .G (ctx ).Warnf ("failed to close IO for container %s: %v" , id , cerr )
462+ }
463+ }
471464 return status .Error ()
472465 }
473466}
0 commit comments