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

Stored the ram classes before sending the compilationReq to server #9955

Merged
merged 1 commit into from
Jul 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions runtime/compiler/control/CompilationRuntime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "control/rossa.h"
#include "runtime/RelocationRuntime.hpp"
#if defined(J9VM_OPT_JITSERVER)
#include "control/JITServerHelpers.hpp"
#include "env/PersistentCollections.hpp"
#include "net/ServerStream.hpp"
#endif /* defined(J9VM_OPT_JITSERVER) */
Expand Down Expand Up @@ -1009,6 +1010,7 @@ class CompilationInfo
}
void setNewlyExtendedClasses(PersistentUnorderedMap<TR_OpaqueClassBlock*, uint8_t> *it) { _newlyExtendedClasses = it; }

TR::Monitor *getclassesCachedAtServerMonitor() const { return _classesCachedAtServerMonitor; }
TR::Monitor *getSequencingMonitor() const { return _sequencingMonitor; }
uint32_t getCompReqSeqNo() const { return _compReqSeqNo; }
uint32_t incCompReqSeqNo() { return ++_compReqSeqNo; }
Expand All @@ -1017,6 +1019,7 @@ class CompilationInfo
uint8_t getCHTableUpdateDone() const { return _chTableUpdateFlags; }

const PersistentVector<std::string> &getJITServerSslKeys() const { return _sslKeys; }
PersistentUnorderedSet<J9Class*> & getclassesCachedAtServer() { return _classesCachedAtServer; }
void addJITServerSslKey(const std::string &key) { _sslKeys.push_back(key); }
const PersistentVector<std::string> &getJITServerSslCerts() const { return _sslCerts; }
void addJITServerSslCert(const std::string &cert) { _sslCerts.push_back(cert); }
Expand Down Expand Up @@ -1227,6 +1230,8 @@ class CompilationInfo

#if defined(J9VM_OPT_JITSERVER)
ClientSessionHT *_clientSessionHT; // JITServer hashtable that holds session information about JITClients
PersistentUnorderedSet<J9Class*> _classesCachedAtServer;
TR::Monitor *_classesCachedAtServerMonitor;
PersistentVector<TR_OpaqueClassBlock*> *_unloadedClassesTempList; // JITServer list of classes unloaded
PersistentVector<TR_OpaqueClassBlock*> *_illegalFinalFieldModificationList; // JITServer list of classes that have J9ClassHasIllegalFinalFieldModifications is set
TR::Monitor *_sequencingMonitor; // Used for ordering outgoing messages at the client
Expand Down
2 changes: 2 additions & 0 deletions runtime/compiler/control/CompilationThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1058,6 +1058,7 @@ TR::CompilationInfo::CompilationInfo(J9JITConfig *jitConfig) :
#if defined(J9VM_OPT_JITSERVER)
_sslKeys(decltype(_sslKeys)::allocator_type(TR::Compiler->persistentAllocator())),
_sslCerts(decltype(_sslCerts)::allocator_type(TR::Compiler->persistentAllocator())),
_classesCachedAtServer(decltype(_classesCachedAtServer)::allocator_type(TR::Compiler->persistentAllocator())),
#endif /* defined(J9VM_OPT_JITSERVER) */
_persistentMemory(pointer_cast<TR_PersistentMemory *>(jitConfig->scratchSegment)),
_sharedCacheReloRuntime(jitConfig),
Expand Down Expand Up @@ -1158,6 +1159,7 @@ TR::CompilationInfo::CompilationInfo(J9JITConfig *jitConfig) :
_illegalFinalFieldModificationList = NULL;
_newlyExtendedClasses = NULL;
_sequencingMonitor = TR::Monitor::create("JIT-SequencingMonitor");
_classesCachedAtServerMonitor = TR::Monitor::create("JIT-ClassesCachedAtServerMonitor");
_compReqSeqNo = 0;
_chTableUpdateFlags = 0;
_localGCCounter = 0;
Expand Down
5 changes: 5 additions & 0 deletions runtime/compiler/control/HookedByTheJit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2115,7 +2115,12 @@ static void jitHookClassUnload(J9HookInterface * * hookInterface, UDATA eventNum
#if defined(J9VM_OPT_JITSERVER)
// Add to JITServer unload list
if (compInfo->getPersistentInfo()->getRemoteCompilationMode() == JITServer::CLIENT)
{
compInfo->getUnloadedClassesTempList()->push_back(clazz);
// Loop through the set to find the class that needs to be purged.
// Once found erase from the set.
compInfo->getclassesCachedAtServer().erase(unloadedEvent->clazz);
}
#endif
}
#endif /* defined (J9VM_GC_DYNAMIC_CLASS_UNLOADING)*/
Expand Down
24 changes: 21 additions & 3 deletions runtime/compiler/control/JITClientCompilationThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
#include "vmaccess.h"

extern TR::Monitor *assumptionTableMutex;

// TODO: This method is copied from runtime/jit_vm/ctsupport.c,
// in the future it's probably better to make that method publicly accessible
static UDATA
Expand Down Expand Up @@ -162,6 +161,7 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
J9VMThread *vmThread = compInfoPT->getCompilationThread();
TR_Memory *trMemory = compInfoPT->getCompilation()->trMemory();
TR::Compilation *comp = compInfoPT->getCompilation();
TR::CompilationInfo *compInfo = compInfoPT->getCompilationInfo();

TR_ASSERT(TR::MonitorTable::get()->getClassUnloadMonitorHoldCount(compInfoPT->getCompThreadId()) == 0, "Must not hold classUnloadMonitor");
TR::MonitorTable *table = TR::MonitorTable::get();
Expand Down Expand Up @@ -216,6 +216,10 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
std::string encoded = FlatPersistentClassInfo::serializeHierarchy(table);

client->write(response, ranges, unloadedClasses->getMaxRanges(), encoded);
{
OMR::CriticalSection romClassCache(compInfo->getclassesCachedAtServerMonitor());
compInfo->getclassesCachedAtServer().clear();
}
break;
}

Expand Down Expand Up @@ -1137,7 +1141,7 @@ handleServerMessage(JITServer::ClientStream *client, TR_J9VM *fe, JITServer::Mes
case MessageType::ResolvedMethod_getRemoteROMClassAndMethods:
{
J9Class *clazz = std::get<0>(client->getRecvData<J9Class *>());
client->write(response, JITServerHelpers::packRemoteROMClassInfo(clazz, fe->vmThread(), trMemory));
client->write(response, JITServerHelpers::packRemoteROMClassInfo(clazz, fe->vmThread(), trMemory, true));
}
break;
case MessageType::ResolvedMethod_isJNINative:
Expand Down Expand Up @@ -3135,7 +3139,21 @@ remoteCompile(

if (compiler->isOptServer())
compiler->setOption(TR_Server);
auto classInfoTuple = JITServerHelpers::packRemoteROMClassInfo(clazz, compiler->fej9vm()->vmThread(), compiler->trMemory());

// Check the _classesCachedAtServer set to determine whether JITServer is likely to have this class already cached.
// If so, do not send the ROMClass content to save network traffic.
bool serializeClass = false;
{
OMR::CriticalSection romClassCache(compInfo->getclassesCachedAtServerMonitor());
if (compInfo->getclassesCachedAtServer().find(clazz) == compInfo->getclassesCachedAtServer().end())
{
// clazz not found. Send the romClass to JITServer.
compInfo->getclassesCachedAtServer().insert(clazz);
serializeClass = true;
mpirvu marked this conversation as resolved.
Show resolved Hide resolved
}
}

auto classInfoTuple = JITServerHelpers::packRemoteROMClassInfo(clazz, compiler->fej9vm()->vmThread(), compiler->trMemory(), serializeClass);
std::string optionsStr = TR::Options::packOptions(compiler->getOptions());
std::string recompMethodInfoStr = compiler->isRecompilationEnabled() ? std::string((char *) compiler->getRecompilationInfo()->getMethodInfo(), sizeof(TR_PersistentMethodInfo)) : std::string();

Expand Down
17 changes: 15 additions & 2 deletions runtime/compiler/control/JITServerCompilationThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,10 +525,23 @@ TR::CompilationInfoPerThreadRemote::processEntry(TR_MethodToBeCompiled &entry, J
}
// Get the ROMClass for the method to be compiled if it is already cached
// Or read it from the compilation request and cache it otherwise
J9ROMClass *romClass = NULL;
J9ROMClass *romClass = NULL;
if (!(romClass = JITServerHelpers::getRemoteROMClassIfCached(clientSession, clazz)))
{
romClass = JITServerHelpers::romClassFromString(std::get<0>(classInfoTuple), compInfo->persistentMemory());
// Check whether the first argument of the classInfoTuple is an empty string
// If it's an empty string then I dont't need to cache it
if(!(std::get<0>(classInfoTuple).empty()))
{
romClass = JITServerHelpers::romClassFromString(std::get<0>(classInfoTuple), compInfo->persistentMemory());
}
else
{
// When I receive an empty string I need to check whether the server had the class caches
// It could be a renewed connection, so that's a new server because old one was shutdown
// When the server receives an empty ROM class it would check if it actually has this class cached,
// And if it it's not cached, send a request to the client
romClass = JITServerHelpers::getRemoteROMClass(clazz, stream, compInfo->persistentMemory(), &classInfoTuple);
}
JITServerHelpers::cacheRemoteROMClass(getClientData(), clazz, romClass, &classInfoTuple);
}

Expand Down
13 changes: 11 additions & 2 deletions runtime/compiler/control/JITServerHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ JITServerHelpers::getRemoteROMClassIfCached(ClientSessionData *clientSessionData
}

JITServerHelpers::ClassInfoTuple
JITServerHelpers::packRemoteROMClassInfo(J9Class *clazz, J9VMThread *vmThread, TR_Memory *trMemory)
JITServerHelpers::packRemoteROMClassInfo(J9Class *clazz, J9VMThread *vmThread, TR_Memory *trMemory, bool serializeClass)
{
// Always use the base VM here.
// If this method is called inside AOT compilation, TR_J9SharedCacheVM will
Expand Down Expand Up @@ -324,7 +324,7 @@ JITServerHelpers::packRemoteROMClassInfo(J9Class *clazz, J9VMThread *vmThread, T
uintptr_t classChainOffsetOfIdentifyingLoaderForClazz = fe->sharedCache() ?
fe->sharedCache()->getClassChainOffsetOfIdentifyingLoaderForClazzInSharedCacheNoFail((TR_OpaqueClassBlock *)clazz) : 0;

return std::make_tuple(packROMClass(clazz->romClass, trMemory), methodsOfClass, baseClass, numDims, parentClass,
return std::make_tuple(serializeClass ? packROMClass(clazz->romClass, trMemory) : std::string(), methodsOfClass, baseClass, numDims, parentClass,
TR::Compiler->cls.getITable((TR_OpaqueClassBlock *) clazz), methodTracingInfo,
classHasFinalFields, classDepthAndFlags, classInitialized, byteOffsetToLockword,
leafComponentClass, classLoader, hostClass, componentClass, arrayClass, totalInstanceSize,
Expand All @@ -350,6 +350,15 @@ JITServerHelpers::getRemoteROMClass(J9Class *clazz, JITServer::ServerStream *str
return romClassFromString(std::get<0>(*classInfoTuple), trMemory->trPersistentMemory());
}

J9ROMClass *
Copy link
Contributor

Choose a reason for hiding this comment

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

Is the previous version of JITServerHelpers::getRemoteClass() needed anymore? If not, we can delete it.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yes, it's used in getAndCacheRemoteROMClass() in CompilationThread.cpp and getAndCacheRemoteROMClass is used in other several files. That's why I overloaded the function. For example, here _romClass = threadCompInfo->getAndCacheRemoteROMClass(_ramClass, trMemory); which is in j9methodServer.cpp.

JITServerHelpers::getRemoteROMClass(J9Class *clazz, JITServer::ServerStream *stream, TR_PersistentMemory *trMemory, ClassInfoTuple *classInfoTuple)
{
stream->write(JITServer::MessageType::ResolvedMethod_getRemoteROMClassAndMethods, clazz);
const auto &recv = stream->read<ClassInfoTuple>();
*classInfoTuple = std::get<0>(recv);
return romClassFromString(std::get<0>(*classInfoTuple), trMemory);
}

// Return true if able to get data from cache, return false otherwise.
bool
JITServerHelpers::getAndCacheRAMClassInfo(J9Class *clazz, ClientSessionData *clientSessionData, JITServer::ServerStream *stream, ClassInfoDataType dataType, void *data)
Expand Down
3 changes: 2 additions & 1 deletion runtime/compiler/control/JITServerHelpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,12 @@ class JITServerHelpers
uintptr_t, std::vector<J9ROMMethod *> // 20: _classChainOffsetOfIdentifyingLoaderForClazz 21. _origROMMethods
>;

static ClassInfoTuple packRemoteROMClassInfo(J9Class *clazz, J9VMThread *vmThread, TR_Memory *trMemory);
static ClassInfoTuple packRemoteROMClassInfo(J9Class *clazz, J9VMThread *vmThread, TR_Memory *trMemory, bool serializeClass);
static void cacheRemoteROMClass(ClientSessionData *clientSessionData, J9Class *clazz, J9ROMClass *romClass, ClassInfoTuple *classInfoTuple);
static void cacheRemoteROMClass(ClientSessionData *clientSessionData, J9Class *clazz, J9ROMClass *romClass, ClassInfoTuple *classInfoTuple, ClientSessionData::ClassInfo &classInfo);
static J9ROMClass *getRemoteROMClassIfCached(ClientSessionData *clientSessionData, J9Class *clazz);
static J9ROMClass *getRemoteROMClass(J9Class *, JITServer::ServerStream *stream, TR_Memory *trMemory, ClassInfoTuple *classInfoTuple);
static J9ROMClass *getRemoteROMClass(J9Class *, JITServer::ServerStream *stream, TR_PersistentMemory *trMemory, ClassInfoTuple *classInfoTuple);
static J9ROMClass *romClassFromString(const std::string &romClassStr, TR_PersistentMemory *trMemory);
static bool getAndCacheRAMClassInfo(J9Class *clazz, ClientSessionData *clientSessionData, JITServer::ServerStream *stream, ClassInfoDataType dataType, void *data);
static bool getAndCacheRAMClassInfo(J9Class *clazz, ClientSessionData *clientSessionData, JITServer::ServerStream *stream, ClassInfoDataType dataType1, void *data1,
Expand Down
2 changes: 1 addition & 1 deletion runtime/compiler/net/CommunicationStream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class CommunicationStream
ClientMessage _cMsg;

static const uint8_t MAJOR_NUMBER = 1;
static const uint16_t MINOR_NUMBER = 7;
static const uint16_t MINOR_NUMBER = 8;
static const uint8_t PATCH_NUMBER = 0;
static uint32_t CONFIGURATION_FLAGS;

Expand Down