Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add JITServer AOT cache persistence #15949

Merged
merged 5 commits into from
Oct 21, 2022

Conversation

cjjdespres
Copy link
Contributor

@cjjdespres cjjdespres commented Sep 22, 2022

The current JITServer AOT cache lacks any persistence mechanism. These changes add two functions

class JITServerAOTCache
   {
   ...
   bool writeCache(FILE *f) const;
   static JITServerAOTCache *readCache(FILE *f, const std::string &name, TR_Memory &trMemory);
   }

to the public cache interface that will read or write an entire cache to or from a particular file stream. A cache file header and versioning mechanism has also been introduced.

The added intrusive linked list traversals of the AOT cache maps allow cache serialization to be performed concurrently with other cache record storage and retrieval.

@cjjdespres cjjdespres marked this pull request as draft September 22, 2022 16:59
@cjjdespres
Copy link
Contributor Author

The JITServerAOTCacheMap still needs to be modified to keep track of the AOT cache directory.

@mpirvu mpirvu self-assigned this Sep 22, 2022
@mpirvu mpirvu added the comp:jitserver Artifacts related to JIT-as-a-Service project label Sep 22, 2022
Copy link
Contributor

@mpirvu mpirvu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The newly introduced field _nextRecord needs to be initialized to NULL in the constructor.

runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
@cjjdespres cjjdespres force-pushed the jitserver-aot-persist branch 2 times, most recently from 0183e8b to aed120c Compare September 28, 2022 14:23
Copy link
Contributor

@mpirvu mpirvu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code looks good now.
Are you planning to add more fields to JITServerAOTCacheHeader in the future (like eye-catcher, checksum, JITServerAOTCacheVersion) or will you have another header that includes these fields and JITServerAOTCacheHeader?

@cjjdespres
Copy link
Contributor Author

My intent was to split up the header in two parts, one with the initial versioning information that can be read to ensure cache compatibility, and one that has more concrete cache data (map sizes, offsets, checksum). Maybe from that perspective the types should look like

struct JITServerAOTCacheVersion
   {
   uint32_t snapshotVersion;
   uint32_t jitserverVersionMajor;
   uint32_t jitserverVersionMinor;
   uint32_t jitserverVersionPatch;
   uint64_t serverUID;
   };

struct JITServerAOTCacheHeader
   {
   size_t numClassLoaderRecords;
   size_t numClassRecords;
   size_t numMethodRecords;
   size_t numClassChainRecords;
   size_t numWellKnownClassesRecords;
   size_t numAOTHeaderRecords;
   size_t numCachedAOTMethods;
   uint32_t checksum;
   <various offsets, potentially>
   };

My instinct was to have the snapshot preamble be human-readable, something like

JITServer AOT cache snapshot <version>
JITServer version: <version>. Server UID: <uid>.
<size and offset data>

but maybe the encoding should be more compact?

@mpirvu
Copy link
Contributor

mpirvu commented Sep 28, 2022

My instinct was to have the snapshot preamble be human-readable

It's up to you. You may have to do some conversions ASCII <--> integer if you go this route.
If you go less verbose, then we need an eye-catcher, something like "AOTCACHE" at the beginning of the header.

@AlexeyKhrabrov
Copy link
Contributor

My instinct was to have the snapshot preamble be human-readable

It's up to you. You may have to do some conversions ASCII <--> integer if you go this route. If you go less verbose, then we need an eye-catcher, something like "AOTCACHE" at the beginning of the header.

I second Marius' suggestion of an 8-byte eye-catcher field with a character sequence "AOTCACHE", I think it's much simpler than having a human readable header where we need to parse decimal integers (unless there is some specific advantage in doing that).

One more thought about the header and versioning. In addition to the JITServer protocol version, the code also uses configuration/compatibility flags (see CommunicationStream.hpp) which currently include the Java spec version (8/11/17/etc., not the OpenJ9 version) and whether compressed references are enabled. These flags must match on the server and the client. Should we also include that in the snapshot header, and only load a snapshot created by a compatible previous JITServer instance? I don't think it's necessary for correctness, but would possibly allow us to reject an unusable incompatible snapshot earlier. By the way, the client-side version information is also implicitly included in the AOT header records stored in the cache, although in a different way: the AOT header stores the VM's and the JIT's build version strings.

@cjjdespres
Copy link
Contributor Author

For the CachedAOTMethod type of record, does the SerializedAOTMethod play the same role as the AOTSerializationRecord in an AOTCacheRecord? That is, can I simply fwrite that portion of the CachedAOTMethod based on its size(), or is there more data in the CachedAOTMethod that needs to be written?

@AlexeyKhrabrov
Copy link
Contributor

For the CachedAOTMethod type of record, does the SerializedAOTMethod play the same role as the AOTSerializationRecord in an AOTCacheRecord? That is, can I simply fwrite that portion of the CachedAOTMethod based on its size(), or is there more data in the CachedAOTMethod that needs to be written?

Yes, the SerializedAOTMethod is all the data that should be persisted. Make sure that you use the size() of the SerializedAOTMethod, not the one in CachedAOTMethod. The same applies to all other record types, of course.

Copy link
Contributor

@AlexeyKhrabrov AlexeyKhrabrov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The snapshot write implementation looks good, I only have some minor code style suggestions inline.

runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
return true;
}

static bool
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should consider merging SerializedAOTMethod and CachedAOTMethod into the record class hierarchies to avoid duplicating this code (there will probably be more places). Not in this PR though.

runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.hpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
runtime/compiler/runtime/JITServerAOTCache.cpp Outdated Show resolved Hide resolved
Copy link
Contributor

@mpirvu mpirvu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Now for the read routine...

@mpirvu
Copy link
Contributor

mpirvu commented Oct 4, 2022

I was thinking that for reading-in serialization records we can skip writing new constructors and just copy data from the file into the memory allocated for the record. Something like:

AOTSerializationRecord dummyRecord;
fread(&dummyRecord, sizeof(dummyRecord), 1, stream)
verify record type
allocate memory for dummyRecord.size() bytes
fseek(stream, -sizeof(dummyRecord), SEEK_CUR); // go back in the stream
fread(allocatedMem, 1, dummyRecord.size(), stream)
cast allocatedMem to the type of record we are reading

@AlexeyKhrabrov
Copy link
Contributor

I was thinking that for reading-in serialization records we can skip writing new constructors and just copy data from the file into the memory allocated for the record. Something like:
...

Note that you still have to construct AOTCacheRecords because they have a vtable. The sizes of AOTCacheRecords are also larger than the corresponding AOTSerializationRecords, but can be determined from the fixed-size "header" part of the corresponding AOTSerializationRecord type. You'll probably need to implement no-argument constructors in each AOTCacheRecord subclass and static create() methods that only take enough arguments to determine the size.

Since we know the record type (e.g. ClassSerializationRecord) in each section of the snapshot file, we can read the whole fixed-size part of the record (e.g. sizeof(ClassSerializationRecord) bytes), use the data in it to create the corresponding AOTCacheRecord (e.g. AOTCacheClassRecord::create(nameLength)), copy the already read fixed-size part of the record into record->dataAddr(), and finally read the remaining variable-size part of the record from the file (we can avoid the fseek() call).

@mpirvu
Copy link
Contributor

mpirvu commented Oct 4, 2022

I forgot that ClassSerializationRecord is embedded into AOTCacheClassRecord rather than being linked to.

@cjjdespres cjjdespres force-pushed the jitserver-aot-persist branch 2 times, most recently from 3a3d7f6 to 5425355 Compare October 7, 2022 01:20
@mpirvu
Copy link
Contributor

mpirvu commented Oct 17, 2022

jenkins test sanity plinuxjit,xlinuxjit jdk17

@AlexeyKhrabrov
Copy link
Contributor

Some time after loading (with at least one method and well known classes record) there is a segfault:

It looks like there is a null sub-record somewhere, which should be impossible during normal operation.

Even after this issue is fixed, we'll still need to check for invalid sub-record IDs that point to nulls in ID-record vectors so that JITServer doesn't crash after loading a malformed snapshot file.

(header.classLoaderId() >= classLoaderRecords.size()))
return NULL;

auto record = new (AOTCacheRecord::allocate(size(header.nameLength()))) AOTCacheClassRecord(classLoaderRecords[header.classLoaderId()]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For instance, there is a missing check that classLoaderRecords[header.classLoaderId()] is non-null here. The same applies to all other places where we set sub-record pointers.

@cjjdespres
Copy link
Contributor Author

I'll see if the cache fails to be read with these changes.

@AlexeyKhrabrov
Copy link
Contributor

I'll see if the cache fails to be read with these changes.

Sure, but this still only hides the original issue that lead to a segfault. If the cache is populated and persisted correctly, there should be no missing sub-records when it gets loaded.

@cjjdespres
Copy link
Contributor Author

Certainly, we ought to be able to read a cache we just wrote.

It appears that reading fails at this block

         case AOTSerializationRecordType::WellKnownClasses:
            if ((sccOffset.recordId() >= wellKnownClassesRecords.size()) || !wellKnownClassesRecords[sccOffset.recordId()])
               goto error;
            record->records()[i] = wellKnownClassesRecords[sccOffset.recordId()];
            break;

The wellKnownClassesRecords.size() is 3 and the sccOffset.recordId() is 2, but wellKnownClassesRecords[2] is null. The value of header._numWellKnownClasses is 1. Note that the wellKnownClassesRecords.size() is equal to the header._nextWellKnownClassesId.

Evidently, at some point a cached aot method was created by the server that references a second well known classes record, and this cached aot method was saved during serialization but the corresponding well known classes record was not.

@cjjdespres
Copy link
Contributor Author

This is strange anyway, since we save the sizes like this:

      {
      OMR::CriticalSection cs(_wellKnownClassesMonitor);
      header._numWellKnownClassesRecords = _wellKnownClassesMap.size();
      header._nextWellKnownClassesId = _nextWellKnownClassesId;
      }

and I think that _wellKnownClassesMap.size() should be 1 less than _nextWellKnownClassesId.

@cjjdespres
Copy link
Contributor Author

Unfortunately, I didn't save the logs for the server when I created that particular cache file. I just created a second one with each type of record and it seems to load without issue, though a short time later the acmeair client consistently experiences a segfault:

Unhandled exception
Type=Segmentation error vmState=0x00000000
J9Generic_Signal_Number=00000018 Signal_Number=0000000b Error_Value=00000000 Signal_Code=00000001
Handler1=00007F74BCF9B460 Handler2=00007F74BCDA0F90 InaccessibleAddress=0000000000000000
RDI=00000000F0B074D8 RSI=00000000FFAFB540 RAX=00000000F0B074D8 RBX=0000000000427200
RCX=0000000000000000 RDX=00000000F0AE5348 R8=00000000FFAFB540 R9=00000000F111ADD8
R10=00000000F0B07498 R11=000000000000001E R12=000000000048AD00 R13=00000000FFAFB550
R14=0000000000000004 R15=00000000FFAFB4F0
RIP=0000000000000000 GS=0000 FS=0000 RSP=00000000005953C8
EFlags=0000000000010246 CS=0033 RBP=0000000000571800 ERR=0000000000000014
TRAPNO=000000000000000E OLDMASK=0000000000000000 CR2=0000000000000000
xmm0 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm1 00007f74b7d38120 (f: 3084091648.000000, d: 6.923800e-310)
xmm2 0000000000595609 (f: 5854729.000000, d: 2.892620e-317)
xmm3 0000000000419ae8 (f: 4299496.000000, d: 2.124233e-317)
xmm4 00000000000026e0 (f: 9952.000000, d: 4.916941e-320)
xmm5 0000000000994f80 (f: 10047360.000000, d: 4.964055e-317)
xmm6 00000000004d7c00 (f: 5078016.000000, d: 2.508873e-317)
xmm7 00000000004e50f0 (f: 5132528.000000, d: 2.535806e-317)
xmm8 0a00020000000500 (f: 1280.000000, d: 1.626768e-260)
xmm9 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm10 6d726f722839302a (f: 674836544.000000, d: 1.626926e+219)
xmm11 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm12 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm13 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm14 0000000000000000 (f: 0.000000, d: 0.000000e+00)
xmm15 0000000000000000 (f: 0.000000, d: 0.000000e+00)
Target=2_90_20221017_000000 (Linux 5.4.0-128-generic)
CPU=amd64 (8 logical CPUs) (0x3e8850000 RAM)
----------- Stack Backtrace -----------
protectedBacktrace+0x16 (0x00007F74BCD9D4A6 [libj9prt29.so+0x254a6])
omrsig_protect+0x2b1 (0x00007F74BCDA1D91 [libj9prt29.so+0x29d91])
omrintrospect_backtrace_thread_raw+0xbf (0x00007F74BCD9D99F [libj9prt29.so+0x2599f])
omrsig_protect+0x2b1 (0x00007F74BCDA1D91 [libj9prt29.so+0x29d91])
omrintrospect_backtrace_thread+0x7e (0x00007F74BCD9D33E [libj9prt29.so+0x2533e])
generateDiagnosticFiles+0x8f (0x00007F74BCF9AF7F [libj9vm29.so+0x3cf7f])
omrsig_protect+0x2b1 (0x00007F74BCDA1D91 [libj9prt29.so+0x29d91])
vmSignalHandler+0x18f (0x00007F74BCF9B1EF [libj9vm29.so+0x3d1ef])
 (0x00007F74BD098555 [libj9vm29.so+0x13a555])

@AlexeyKhrabrov
Copy link
Contributor

Unfortunately, I didn't save the logs for the server when I created that particular cache file. I just created a second one with each type of record and it seems to load without issue, though a short time later the acmeair client consistently experiences a segfault:

This doesn't look good. On top of the invalid sub-records, it looks like some of the data in the serialization records loaded from the file that gets sent to the client is inconsistent. There is some debug logging in JITServerAOTDeserializer::updateSCCOffsets() that could be helpful. I think the AOT load infrastructure also has some tracing options that might help figure out where exactly the relocated method gets broken.

@@ -338,6 +477,9 @@ class JITServerAOTCache
const uintptr_t _includedClasses;
};

static WellKnownClassesKey getRecordKey(const AOTCacheWellKnownClassesRecord *record)
{ return { record->records(), record->data().list().length() }; }
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this may be the problem. Notice that the key initializer that this replaces above is { record->records(), length, includedClasses }. This is likely the cause of the discrepancies I saw in #15949 (comment), and might be the cause of the segfault as well.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that's probably it. This could have been prevented by defining actual constructors in the ...Key structs, which is still worth doing.

Signed-off-by: Christian Despres <despresc@ibm.com>
@cjjdespres
Copy link
Contributor Author

cjjdespres commented Oct 20, 2022

That particular change does fix the discrepancy (and subsequent cache read failure) of #15949 (comment). With that change, a cache with each type of record will round trip to an equal cache and subsequently operate correctly, as long as the segfault in #15949 (comment) doesn't occur just after client start-up.

That change does not fix the segfault, which may be unrelated to this PR. Even with a JDK built using master, the segfault occurs after the following steps:

  1. start jitserver with AOT caching enabled
  2. start an acmeair client with TR_DontDisableSVMDuringStartup=1 and have it request a particular named cache
  3. wait for the client to finish starting up the web server, then stop the client
  4. start an acmeair client (with or without TR_DontDisableSVMDuringStartup=1) and have it request the same named cache

The acmeair client will frequently, but not always, segfault after (4).

@mpirvu
Copy link
Contributor

mpirvu commented Oct 20, 2022

The acmeair client will frequently, but not always, segfault after (4).

I'll try to reproduce this with a recent build. I remember I have run AcmeAir with AOTServer AOT cache (but without TR_DontDisableSVMDuringStartup=1) and 0.33.1 and it ran fine.

@mpirvu
Copy link
Contributor

mpirvu commented Oct 20, 2022

0.33.1 crashes too if TR_DontDisableSVMDuringStartup=1 is set

@AlexeyKhrabrov
Copy link
Contributor

Does it crash inside a compiled method? If so, is it the same method every time? Does it look similar to #15146 by any chance?

@mpirvu
Copy link
Contributor

mpirvu commented Oct 20, 2022

In one such run the stacktrace from the javacore indicates a problem during stack walking by GC:

4XENATIVESTACK               triggerDumpAgents+0x372 (0x00007F992864C342 [libj9dmp29.so+0x1f342])
4XENATIVESTACK               generateDiagnosticFiles+0x162 (0x00007F9928C959B2 [libj9vm29.so+0x3d9b2])
4XENATIVESTACK               omrsig_protect+0x2b1 (0x00007F992A2E3581 [libj9prt29.so+0x2a581])
4XENATIVESTACK               vmSignalHandler+0x17f (0x00007F9928C95B3F [libj9vm29.so+0x3db3f])
4XENATIVESTACK               mainSynchSignalHandler+0x225 (0x00007F992A2E2A75 [libj9prt29.so+0x29a75])
4XENATIVESTACK                (0x00007F9929DFA980 [libpthread.so.0+0x12980])
4XENATIVESTACK               walkStackFrames+0x49c (0x00007F9928CD688C [libj9vm29.so+0x7e88c])
4XENATIVESTACK               _ZN28GC_VMThreadStackSlotIterator9scanSlotsEP10J9VMThreadS1_PvPFvP8J9JavaVMPP8J9ObjectS2_P16J9StackWalkStatePKvEbb+0x76 (0x00007F9922CA9556 [libj9gc29.so+0x42556])
4XENATIVESTACK               _ZN14MM_RootScanner13scanOneThreadEP18MM_EnvironmentBaseP10J9VMThreadPv+0x101 (0x00007F9922CA0C51 [libj9gc29.so+0x39c51])
4XENATIVESTACK               _ZN14MM_RootScanner11scanThreadsEP18MM_EnvironmentBase+0xbf (0x00007F9922CA018F [libj9gc29.so+0x3918f])
4XENATIVESTACK               _ZN14MM_RootScanner9scanRootsEP18MM_EnvironmentBase+0x43 (0x00007F9922CA2C93 [libj9gc29.so+0x3bc93])

@AlexeyKhrabrov
Copy link
Contributor

AlexeyKhrabrov commented Oct 20, 2022

Since the segfault appears to be unrelated to AOT cache persistence and is only reproducible with a non-standard option TR_DontDisableSVMDuringStartup=1, I think it should be investigated as a separate issue, and this PR can be delivered now (maybe after more testing with standard options).

@mpirvu
Copy link
Contributor

mpirvu commented Oct 20, 2022

jenkins test sanity plinuxjit,xlinuxjit,zlinuxjit jdk17

@mpirvu
Copy link
Contributor

mpirvu commented Oct 21, 2022

Timeout on x86 for cmdLineTester_jvmtitests_debug_5

17:47:47  ===============================================
17:47:47  Running test cmdLineTester_jvmtitests_debug_5 ...
17:47:47  ===============================================
17:47:47  cmdLineTester_jvmtitests_debug_5 Start Time: Thu Oct 20 18:47:47 2022 Epoch Time (ms): 1666302467411
17:47:47  "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/java" -Xshareclasses:destroyAll; "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/java" -Xshareclasses:groupAccess,destroyAll; echo "cache cleanup done";
17:47:47  JVMSHRC005I No shared class caches available
17:47:48  JVMSHRC005I No shared class caches available
17:47:48  cache cleanup done
17:47:48  variation: Mode357
17:47:48  JVM_OPTIONS: -XX:+UseJITServer -Xgcpolicy:metronome -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,onthrow=no.pkg.foo,launch=echo -Xjit:count=0 -Xcompressedrefs 
17:47:48  { success=0; \
17:47:48  itercnt=1; \
17:47:48  mkdir -p "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../TKG/output_16662953428818/cmdLineTester_jvmtitests_debug_5"; \
17:47:48  cd "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../TKG/output_16662953428818/cmdLineTester_jvmtitests_debug_5"; \
17:47:48  export LD_LIBRARY_PATH="/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/openjdk-test-image/openj9:/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/../lib/default:/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/../lib/j9vm:"; \
17:47:48  "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/java" -XX:+UseJITServer -Xgcpolicy:metronome -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,onthrow=no.pkg.foo,launch=echo -Xjit:count=0 -Xcompressedrefs  \
17:47:48  -DTEST_ROOT="/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../../jvmtest/functional/cmdLineTests/jvmtitests" \
17:47:48  -DJAR="/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../../jvmtest/functional/cmdLineTests/jvmtitests/jvmtitest.jar:/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../TKG/lib/asm-all.jar" \
17:47:48  -DEXE='"/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/openjdkbinary/j2sdk-image/bin/java" -XX:+UseJITServer -Xgcpolicy:metronome -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,onthrow=no.pkg.foo,launch=echo -Xjit:count=0 -Xcompressedrefs  -Xdump ' \
17:47:48  -jar "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../../jvmtest/functional/cmdline_options_tester/cmdlinetester.jar" \
17:47:48  -config "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../../jvmtest/functional/cmdLineTests/jvmtitests/jvmtitests_extended.xml" \
17:47:48  -explainExcludes -xids all,linux_x86-64 -xlist "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../../jvmtest/functional/cmdLineTests/jvmtitests/jvmtitests_excludes_17.xml" -nonZeroExitWhenError; \
17:47:48  if [ $? -eq 0 ] ; then echo ""; echo "cmdLineTester_jvmtitests_debug_5""_PASSED"; echo ""; cd /home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/..; rm -f -r "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../TKG/output_16662953428818/cmdLineTester_jvmtitests_debug_5"; else echo ""; echo "cmdLineTester_jvmtitests_debug_5""_FAILED"; echo ""; fi; } 2>&1 | tee -a "/home/jenkins/workspace/Test_openjdk17_j9_sanity.functional_x86-64_linux_jit_Personal_testList_1/aqa-tests/TKG/../TKG/output_16662953428818/TestTargetResult";
01:28:10  Cancelling nested steps due to timeout

On zLinux we have: Exception: org.jenkinsci.plugins.workflow.steps.FlowInterruptedException

@mpirvu
Copy link
Contributor

mpirvu commented Oct 21, 2022

jenkins test sanity xlinuxjit,zlinuxjit jdk17

@mpirvu mpirvu merged commit b3fef84 into eclipse-openj9:master Oct 21, 2022
@mpirvu mpirvu linked an issue Nov 11, 2022 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
comp:jitserver Artifacts related to JIT-as-a-Service project
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add persistence to the JITServer AOT cache
3 participants