[crac] RFR: Report checkpoint processing to jcmd [v21]
Anton Kozlov
akozlov at openjdk.org
Thu Aug 11 15:47:04 UTC 2022
On Wed, 10 Aug 2022 15:04:03 GMT, Ilarion Nakonechnyy <inakonechnyy at openjdk.org> wrote:
>> pass output stream from diagnosticCommand.cpp through java code into os_linux.cpp::VM_crac::doit()
>
> Ilarion Nakonechnyy has updated the pull request incrementally with two additional commits since the last revision:
>
> - implement checkpointRestoreLocked
> - Revert "java core crac corections"
>
> This reverts commit 6a2b03b77f1ee4e6d48a120a14694d8dff9dbf39.
Changes requested by akozlov (Lead).
src/hotspot/os/linux/attachListener_linux.cpp line 68:
> 66: volatile int LinuxAttachListener::_listener = -1;
> 67: bool LinuxAttachListener::_atexit_registered = false;
> 68: AttachOperation* LinuxAttachListener::_jcmdOperation = NULL;
This is not necessary jcmd. Let's call it `_attach_op` and rename corresponding getter/setter.
src/hotspot/os/linux/attachListener_linux.cpp line 359:
> 357:
> 358: if (_effectively_completed) {
> 359: return;
An assert here would catch lost output that won't be reported anywhere.
Suggestion:
assert(st->size() == 0, "no lost output");
return;
src/hotspot/os/linux/os_linux.cpp line 5731:
> 5729:
> 5730: static void print_resources(outputStream * ostream, const char* msg, ... ) {
> 5731: outputStream * ou = (ostream == NULL) ? tty : ostream;
You can probably move this check into VM_Crac, then get rid of these helper functions as trivial ones
src/hotspot/os/linux/os_linux.cpp line 6213:
> 6211:
> 6212: if (_vm_inited_fds.get_state(i, FdsInfo::CLOSED) != FdsInfo::CLOSED) {
> 6213: print_resources(ostream, "OK: inherited from process env");
There is an extra newline between this outputs. This code produced a single line for each FD, now there are two lines.
src/hotspot/os/linux/os_linux.cpp line 6243:
> 6241: }
> 6242: details = sock_details(details, detailsbuf, sizeof(detailsbuf));
> 6243: print_resources(ostream, "issock, details2=\"%s\" ", details);
"issock" is redundant, we have already printed "type=socket"
src/hotspot/os/linux/os_linux.cpp line 6272:
> 6270: trace_cr(ostream, "Checkpoint ...");
> 6271: // If execution comes here, assumme that further all be ok.
> 6272: report_ok_to_jcmd();
Starting from this point all output should go somewhere, e.g. `tty`.
src/hotspot/share/services/diagnosticCommand.cpp line 1047:
> 1045: JavaCallArguments args;
> 1046: args.push_long((jlong )output());
> 1047: args.push_long((jlong )LinuxAttachListener::get_jcmdOperation());
You apparently don't need to pass the attach operation through java code to JVM_Checkpoint and eventually os::Linux::checkpoint -- you can get the operation right there with the same call.
src/hotspot/share/services/diagnosticCommand.cpp line 1052:
> 1050: vmSymbols::checkpointRestereInternal_signature(), &args, CHECK);
> 1051: jvalue* jv = (jvalue*) result.get_value_addr();
> 1052: oop str = cast_to_oop(jv->l);
oop str = result.get_oop()
src/hotspot/share/services/diagnosticCommand.cpp line 1055:
> 1053: if (str != NULL) {
> 1054: char* out = java_lang_String::as_utf8_string(str);
> 1055: if (out) {
I believe these conditions are always true. When I run with CRAllowToSkipCheckpoint, I get
$ jcmd Main JDK.checkpoint
787055:
CR: Skip Checkpoint
An exception during a checkpoint operation:
Although no exceptions are thrown.
src/java.base/share/classes/jdk/crac/Core.java line 266:
> 264: try {
> 265: checkpointRestoreLocked(outputStream_p, jcmd_p);
> 266: } catch (CheckpointException | RestoreException e) {
RestoreException may appear only after restore, when the jcmd channel does not exist anymore. Let's report all RestoreExceptions to the console.
Can be checked on
class TestResource implements Resource {
@Override
public void afterRestore(Context<?> context) {
throw new RuntimeException("restore");
}
}
-------------
PR: https://git.openjdk.org/crac/pull/10
More information about the crac-dev
mailing list