[crac] RFR: Print better diagnostics for spawning CRIU
Jan Kratochvil
jkratochvil at openjdk.org
Fri Aug 4 06:38:02 UTC 2023
On Wed, 2 Aug 2023 17:33:28 GMT, Anton Kozlov <akozlov at openjdk.org> wrote:
>> It was always a mystery why it does not work this time as there are no error messages printed.
>> Still may system call errors are currently not reported but those errors at least do not happen commonly.
>> In fact `os::exec_child_process_and_wait` should be more verbose but that is already a part of OpenJDK so I did not modify it.
>> It would be much easier if `criuengine.c` was in C++. I was considering to switch it but then I wrote it already in C.
>> I understand this code will become obsolete after planned integration of CRIU into JVM but it may not yet be soon enough.
>
> src/java.base/unix/native/criuengine/criuengine.c line 115:
>
>> 113: }
>> 114:
>> 115: static char *path_abs(const char *rel) {
>
> Is not this exactly `realpath()`?
Not really as `realpath()` is resolving symlinks while this function does not. I agree the code is ugly, I originally expected it will be more nice in C++ but then I realized [std::filesystem::path](https://en.cppreference.com/w/cpp/filesystem/path) is `C++17` only.
> src/java.base/unix/native/criuengine/criuengine.c line 131:
>
>> 129: free(rel1_abs);
>> 130: return retval;
>> 131: }
>
> This function is closer to path_from, rather than to abs. But by using just path_join/path_from, we'll provide a shorter yet still correct path to the log (the only use of the function), so I propose to drop it.
It became now simple enough in C++, is it OK?
> src/java.base/unix/native/criuengine/criuengine.c line 215:
>
>> 213: if (child != wait(&status)) {
>> 214: criu_cmdline = join_args(args);
>> 215: fprintf(stderr, "Error waiting for spawned CRIU \"%s\": %m\n", criu_cmdline);
>
> Calling fprintf repeatedly multiple time would save us from too complex join_args(), right? Could you do this?
With C++ `std::string` it has been solved, hasn't it?
> src/java.base/unix/native/criuengine/criuengine.c line 227:
>
>> 225: criu_log = path_abs2(imagedir, log_local);
>> 226: fprintf(stderr, "Spawned CRIU \"%s\" has not properly exited: exit code %d - check %s\n", criu_cmdline, WEXITSTATUS(status), criu_log);
>> 227: }
>
> Could you unify these handlings? There is a slight difference in each code path.
Either it got fixed by C++ or describe more the difference, please.
-------------
PR Review Comment: https://git.openjdk.org/crac/pull/97#discussion_r1284036451
PR Review Comment: https://git.openjdk.org/crac/pull/97#discussion_r1284036765
PR Review Comment: https://git.openjdk.org/crac/pull/97#discussion_r1284037517
PR Review Comment: https://git.openjdk.org/crac/pull/97#discussion_r1284038029
More information about the crac-dev
mailing list