[crac] RFR: 8350845: [CRaC] Support C/R engines in form of a library

Timofei Pushkin tpushkin at openjdk.org
Thu Feb 27 13:53:18 UTC 2025


On Thu, 27 Feb 2025 12:19:10 GMT, Timofei Pushkin <tpushkin at openjdk.org> wrote:

> Adds support for C/R engines implemented in form of dynamic libraries.
> 
> In the proposed API the engine controls the set of the configurable options — they are mainly passed by the user via the new `CRaCEngineOptions` VM option, but some may also be passed by the VM. Other VM and/or engine implementations may extend the API via "extensions".
> 
> The JVM is supposed to know what configuration options and API extensions are supported by calling `can_configure` and `get_extension`.
> 
> The user is supposed to know which options they can pass by asking the engine with `-XX:CRaCEngineOptions=help` (support for this is engine-dependent). Example of how this looks for bundled engines:
> 
> $ java -XX:CRaCEngine=simengine -XX:CRaCEngineOptions=help -XX:CRaCCheckpointTo=cr -version
> 
> crexec — pseudo-CRaC-engine used to relay data from JVM to a "real" engine implemented as an executable (instead of a library).
> The engine executable is expected to have CRaC-CRIU-like CLI. Support of the options below also depends on the engine executable.
> 
> Configuration options:
> * keep_running=<true/false> (default: false) — keep the process running after the checkpoint or kill it.
> * direct_map=<true/false> (default: false) — on restore, map process data directly from saved files. This may speedup the restore but the resulting process will not be the same as before the checkpoint.
> * args=<string> (default: "") — free space-separated arguments passed directly to the engine executable, e.g. "--arg1 --arg2 --arg3".
> * help — print this message.
> 
> openjdk version "24-internal" 2025-03-18
> OpenJDK Runtime Environment (slowdebug build 24-internal-adhoc.timpushkin.crac)
> OpenJDK 64-Bit Server VM (slowdebug build 24-internal-adhoc.timpushkin.crac, mixed mode, sharing)
> 
> 
> Notable related changes included in the patch:
> - The ability to pass arguments to C/R engine was removed from `CRaCEngine` because it can now be implemented through `CRaCEngineOptions`. E.g. `-XX:CRaCEngine=criu,--verbose` is now `-XX:CRaCEngine=criu -XX:CRaCEngineOptions=args=--verbose`.
> - `CRaCEngine` (as well as the new `CRaCEngineOptions`) VM Option is now not updated in the restored VM. This seems more correct because engine path and options will very likely differ on restore and on checkpoint, so it is not obvious how to combine them — just replacing won't always work. Until now the updates were ignored by the CRaC implementation anyway, so this should only be visible by inspecting the options through JMX.
> - `CRaCRestoreFrom` is now co...

We can add an optional extension for this, not sure how exactly to call it (`description`, `identification`...), but it would have methods `const char *id_string()` and `const char *configure_description_string()`.

`id_string` would return something like what `java -version` prints but about the engine, or maybe the first part of the help message I left in the PR description — it's up to the engine.

`configure_description_string` would return the list of supported configure options with their descriptions as a single string. We could make it more structured, make it return a list of tuples of strings where the first string in would be option name, the second — the supported values, the third — the default value, the last — the description. But that's probably too complicated, I'd just document a suggested format for the returned string instead.

Then, if JVM detects that the user asked for help, it could construct the help message by combining the output of these two methods to get roughly the same as in the PR description. To make it so that it does not require `CRaCCheckpointTo`/`CRaCRestoreFrom` to work we can either make `CRaCEngineOptions=help` a special case for which the VM will check regardless of the CRaC-enabling options being set, or we can add another VM option `CRaCPrintEngineHelpAndExit` (or `PrintCRaCEngineHelpAndExit`, `PrintCRaCEngineInfoAndExit`?) that would load the engine, print the help message and exit VM analogous to how `PrintSharedArchiveAndExit` from CDS behaves.

-------------

PR Comment: https://git.openjdk.org/crac/pull/207#issuecomment-2688017076


More information about the crac-dev mailing list