Hi,
You are right, commit 113cea8 introduced this regression, we guarantee
that nspawn returns the exit code of the program executed in the
container in case nspwan wont fail. My bad, I missed this point...
sorry!
Ok will comment on this patch, the other one is wrong, since we mix
-errno with exit status, 'status.si_status' contains the low 8 bits of
the value returned by child, in other words it is equivalent to
WIFEXITED() of waitpid(), so that patch converts any exit status to an
-errno code...
IMHO this is the right patch.
On Sat, Jun 28, 2014 at 12:09:56PM -0400, Luke Shumaker wrote:
> This is accomplished by having wait_for_container() return a positive error
> code when we would like that error code to make its way to the user. This
> is at odds with the CODING_STYLE rule that error codes should be returned
> as negative values.
This is not odd, we already do that!
When I did convert to wait_for_container(), I remember I checked all
calls to wait_for_terminate() to see what others do, and there was the:
src/shared/util.c:wait_for_terminate_and_warn()
Which also returns the positive 'status.si_status' code to caller, and it
is used in all places...
I checked that function, but was played by the fact that if the child
fails to setup the container we just fail with _exit(EXIT_FAILURE), no
specific code, so I converted to -1 and introduced the regression... :-/
So if you are able to send a v2 of this patch, here are some comments:
Please improve the commit log, note the commit that caused the regression,
and remove the mention to CODING_STYLE, since we already do this in
systemd, and for nspawn: the positive code returned by
wait_for_container() is the exit code of the program executed in the
container, it can be positive or EXIT_SUCCESS, and this is already
documented.
It will be easy to buy it this way :-)
> ---
> src/nspawn/nspawn.c | 21 +++++++++++++--------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
> index 0a8dc0c..42f939b 100644
> --- a/src/nspawn/nspawn.c
> +++ b/src/nspawn/nspawn.c
> @@ -2645,12 +2645,17 @@ static int change_uid_gid(char **_home) {
> }
>
> /*
> - * Return 0 in case the container is being rebooted, has been shut
> - * down or exited successfully. On failures a negative value is
> - * returned.
> + * Return values:
> + * < 0 : The container was terminated by a signal, or failed for an
> + * unknown reason. No change is made to the container argument.
wait_for_container() failed to get the state of the container, the
container was terminated by a signal or failed for an unknown reason.
> + * > 0 : The container terminated with an error code, which is the
> + * return value. No change is made to the container argument.
"The exit code of the program executed in the container is returned."
Quoted from systemd-nspawn man page.
> + * 0 : The container is being rebooted, has been shut down or exited
> + * successfully. The container argument has been set to either
> + * CONTAINER_TERMINATED or CONTAINER_REBOOTED.
Nice!
> *
> - * The status of the container "CONTAINER_TERMINATED" or
> - * "CONTAINER_REBOOTED" will be saved in the container argument
> + * That is, success is indicated by a return value of zero, and an
> + * error is indicated by a non-zero value.
> */
> static int wait_for_container(pid_t pid, ContainerStatus *container) {
> int r;
> @@ -2672,7 +2677,6 @@ static int wait_for_container(pid_t pid,
> ContainerStatus *container) {
A minor thing:
in wait_for_container() could you add please a log_warning() if
wait_for_terminate() fails, as it is done in
wait_for_terminate_and_warn().
> } else {
> log_error("Container %s failed with error code %i.",
> arg_machine, status.si_status);
> - r = -1;
> }
> break;
>
> @@ -3299,8 +3303,9 @@ check_container_status:
> r = wait_for_container(pid, &container_status);
> pid = 0;
>
> - if (r < 0) {
> - r = EXIT_FAILURE;
> + if (r != 0) {
Add a code comment, if (r < 0) explicitly set to EXIT_FAILURE, otherwise
return the exit code of the containered process.
> + if (r < 0)
> + r = EXIT_FAILURE;
> break;
> } else if (container_status == CONTAINER_TERMINATED)
> break;
Thank you for the report and the patch!
--
Djalal Harouni
http://opendz.org
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel