[lxc-devel] Bugfix for lxc-stop --nowait in 4.0 and master branches

Robert Vogelgesang vogel at folz.de
Tue Jun 23 09:21:44 UTC 2020


Hi Christian,

On Tue, Jun 23, 2020 at 11:15:47AM +0200, Christian Brauner wrote:
> On Tue, Jun 23, 2020 at 10:47:44AM +0200, Robert Vogelgesang wrote:
> > Hello @all,
> > 
> > in 4.0 and master branches, the lxc-stop command is currently a
> > no-op when using the --nowait flag.  Patch against current 4.0
> > branch attached, should apply to master, too.
> > 
> > Best regards,
> 
> Hey Robert,
> 
> Thanks for the patch.
> I've picked your changes up and created a PR with you as author and with
> your SOB added here:
> https://github.com/lxc/lxc/pull/3456
> 
> can you quickly give your ack or nack on this?

yes, looks good, so:
ACK

Robert

> 
> Thanks!
> Christian
> 
> > 
> > Robert
> > 
> 
> > diff -up lxc-stable-4.0/src/lxc/lxccontainer.c.nowait lxc-stable-4.0/src/lxc/lxccontainer.c
> > --- lxc-stable-4.0/src/lxc/lxccontainer.c.nowait	2020-06-15 18:52:01.000000000 +0200
> > +++ lxc-stable-4.0/src/lxc/lxccontainer.c	2020-06-16 15:52:20.782513170 +0200
> > @@ -2096,41 +2096,41 @@ static bool do_lxcapi_shutdown(struct lx
> >  
> >  		if (ret < MAX_STATE)
> >  			return false;
> > +	}
> >  
> > -		if (pidfd >= 0) {
> > -			struct pollfd pidfd_poll = {
> > -			    .events = POLLIN,
> > -			    .fd = pidfd,
> > -			};
> > -
> > -			killret = lxc_raw_pidfd_send_signal(pidfd, haltsignal,
> > -							    NULL, 0);
> > -			if (killret < 0)
> > -				return log_warn(false, "Failed to send signal %d to pidfd %d",
> > -						haltsignal, pidfd);
> > -
> > -			TRACE("Sent signal %d to pidfd %d", haltsignal, pidfd);
> > -
> > -			/*
> > -			 * No need for going through all of the state server
> > -			 * complications anymore. We can just poll on pidfds. :)
> > -			 */
> > -
> > -			if (timeout != 0) {
> > -				ret = poll(&pidfd_poll, 1, timeout * 1000);
> > -				if (ret < 0 || !(pidfd_poll.revents & POLLIN))
> > -					return false;
> > -
> > -				TRACE("Pidfd polling detected container exit");
> > -			}
> > -		} else {
> > -			killret = kill(pid, haltsignal);
> > -			if (killret < 0)
> > -				return log_warn(false, "Failed to send signal %d to pid %d",
> > -						haltsignal, pid);
> > +	if (pidfd >= 0) {
> > +		struct pollfd pidfd_poll = {
> > +		    .events = POLLIN,
> > +		    .fd = pidfd,
> > +		};
> > +
> > +		killret = lxc_raw_pidfd_send_signal(pidfd, haltsignal,
> > +						    NULL, 0);
> > +		if (killret < 0)
> > +			return log_warn(false, "Failed to send signal %d to pidfd %d",
> > +					haltsignal, pidfd);
> > +
> > +		TRACE("Sent signal %d to pidfd %d", haltsignal, pidfd);
> > +
> > +		/*
> > +		 * No need for going through all of the state server
> > +		 * complications anymore. We can just poll on pidfds. :)
> > +		 */
> > +
> > +		if (timeout != 0) {
> > +			ret = poll(&pidfd_poll, 1, timeout * 1000);
> > +			if (ret < 0 || !(pidfd_poll.revents & POLLIN))
> > +				return false;
> >  
> > -			TRACE("Sent signal %d to pid %d", haltsignal, pid);
> > +			TRACE("Pidfd polling detected container exit");
> >  		}
> > +	} else {
> > +		killret = kill(pid, haltsignal);
> > +		if (killret < 0)
> > +			return log_warn(false, "Failed to send signal %d to pid %d",
> > +					haltsignal, pid);
> > +
> > +		TRACE("Sent signal %d to pid %d", haltsignal, pid);
> >  	}
> >  
> >  	if (timeout == 0)
> 
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel



More information about the lxc-devel mailing list