[igt-dev] [PATCH i-g-t 1/2] runner: Introduce a way to stop testing without marking tests incomplete

Chris Wilson chris at chris-wilson.co.uk
Thu Jan 21 10:02:02 UTC 2021


Quoting Petri Latvala (2021-01-21 09:50:14)
> Killing igt_runner with SIGHUP will now still kill the currently
> running test, but it will mark that test as being "notrun" instead of
> "incomplete". This allows for external tools to interrupt the testing
> without messing the results.
> 
> Incidentally, Intel CI's testing procedures occasionally falsely
> determine that the machine being tested is unreachable and as its next
> step, will ssh in and issue a reboot in preparation for the next round
> of testing, causing igt_runner to be killed with a SIGHUP...
> 
> v2:
>  - Fix typo SIGUP -> SIGHUP
>  - Make runner print that a graceful exit will be done
>  - Explain the code flow regarding handling of signals to the runner process
>  - Use GRACEFUL_EXITCODE instead of -SIGHUP directly
> 
> Signed-off-by: Petri Latvala <petri.latvala at intel.com>
> Cc: Tomi Sarvela <tomi.p.sarvela at intel.com>
> Cc: Arkadiusz Hiler <arek at hiler.eu>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  runner/executor.c  | 31 +++++++++++++++++++++++++++++++
>  runner/resultgen.c | 10 +++++++---
>  2 files changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/runner/executor.c b/runner/executor.c
> index c1a0545a..3ca2d20a 100644
> --- a/runner/executor.c
> +++ b/runner/executor.c
> @@ -1008,6 +1008,37 @@ static int monitor_output(pid_t child,
>                                              get_cmdline(siginfo.ssi_pid, comm, sizeof(comm)),
>                                              siginfo.ssi_pid,
>                                              strsignal(siginfo.ssi_signo));
> +
> +                                       if (siginfo.ssi_signo == SIGHUP) {

Detecting SIGHUP should do the job of catching the external shutdown.

> @@ -1106,6 +1108,8 @@ static const char *result_from_exitcode(int exitcode)
>                 return "abort";
>         case INCOMPLETE_EXITCODE:
>                 return "incomplete";
> +       case GRACEFUL_EXITCODE:
> +               return "notrun";
>         default:
>                 return "fail";
>         }
> @@ -1180,7 +1184,7 @@ static void fill_from_journal(int fd,
>                 }
>         }
>  
> -       if (subtests->size && exitcode == IGT_EXIT_ABORT) {
> +       if (subtests->size && (exitcode == IGT_EXIT_ABORT || exitcode == GRACEFUL_EXITCODE)) {
>                 char *last_subtest = subtests->subs[subtests->size - 1].name;
>                 char subtest_piglit_name[256];
>                 struct json_object *subtest_obj;
> @@ -1188,7 +1192,7 @@ static void fill_from_journal(int fd,
>                 generate_piglit_name(entry->binary, last_subtest, subtest_piglit_name, sizeof(subtest_piglit_name));
>                 subtest_obj = get_or_create_json_object(tests, subtest_piglit_name);
>  
> -               set_result(subtest_obj, "abort");
> +               set_result(subtest_obj, exitcode == IGT_EXIT_ABORT ? "abort" : "notrun");

And after a look through the resultgen, this looks to be the cases where
exitcode is used (and exitcode is derived from the atoi(journal)).

Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the igt-dev mailing list