@@ -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