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
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to