Fix bug in JIT source purging: do not nullify attached context list after purge

This commit is contained in:
Vinoth Veeraraghavan
2020-09-22 15:42:28 +08:00
parent 8e82cbfeb3
commit 478ade750e
3 changed files with 24 additions and 5 deletions

View File

@ -506,19 +506,26 @@ extern void PurgeJitContext(JitContext* jitContext, uint64_t relationId)
// cleanup keys(s)
if ((jitContext->m_table != nullptr) && (jitContext->m_table->GetTableExId() == relationId)) {
MOT_LOG_TRACE("Purging JIT context %p primary keys by relation id %" PRIu64, jitContext, relationId);
CleanupJitContextPrimary(jitContext);
}
// cleanup JOIN keys(s)
if ((jitContext->m_innerTable != nullptr) && (jitContext->m_innerTable->GetTableExId() == relationId)) {
MOT_LOG_TRACE("Purging JIT context %p inner keys by relation id %" PRIu64, jitContext, relationId);
CleanupJitContextInner(jitContext);
}
// cleanup sub-query keys
for (uint32_t i = 0; i < jitContext->m_subQueryCount; ++i) {
JitContext::SubQueryData* subQueryData = &jitContext->m_subQueryData[i];
MOT_LOG_TRACE("Cleaning up sub-query %u data in JIT context %p", i, jitContext);
CleanupJitContextSubQueryData(subQueryData);
if ((subQueryData->m_table != nullptr) && (subQueryData->m_table->GetTableExId() == relationId)) {
MOT_LOG_TRACE("Purging sub-query %u data in JIT context %p by relation id %" PRIu64,
i,
jitContext,
relationId);
CleanupJitContextSubQueryData(subQueryData);
}
}
}
}
@ -564,7 +571,9 @@ static void CleanupJitContextInner(JitContext* jitContext)
static void CleanupJitContextSubQueryDataArray(JitContext* jitContext)
{
MOT_LOG_TRACE("Cleaning up sub-query data array in JIT context %p", jitContext);
if (jitContext->m_subQueryData != nullptr) {
MOT_LOG_TRACE("Cleaning up sub-query data array in JIT context %p", jitContext);
}
for (uint32_t i = 0; i < jitContext->m_subQueryCount; ++i) {
JitContext::SubQueryData* subQueryData = &jitContext->m_subQueryData[i];
MOT_LOG_TRACE("Cleaning up sub-query %u data in JIT context %p", i, jitContext);

View File

@ -452,6 +452,7 @@ extern int JitExecQuery(
extern void PurgeJitSourceCache(uint64_t relationId)
{
MOT_LOG_TRACE("Purging JIT source map by relation id %" PRIu64, relationId);
(void)PurgeJitSourceMap(relationId);
}

View File

@ -84,9 +84,18 @@ extern bool InitJitSource(JitSource* jitSource, const char* queryString)
extern void DestroyJitSource(JitSource* jitSource)
{
MOT_LOG_TRACE("Destroying JIT source %p with query string: %s", jitSource, jitSource->_query_string);
if (jitSource->m_contextList != nullptr) {
MOT_LOG_WARN("JIT source still contains registered JIT context objects, while destroying JIT source");
JitContext* jitContext = jitSource->m_contextList;
while (jitContext != nullptr) {
jitContext->m_jitSource = nullptr; // prevent crash during DestroyJitContext()
jitContext = jitContext->m_nextInSource;
}
}
if (jitSource->_source_jit_context != nullptr) {
// this code is executed during shutdown, so the underlying
// GsCodeGen object was already destroyed the top memory context
// GsCodeGen object was already destroyed by the top memory context
DestroyJitContext(jitSource->_source_jit_context);
jitSource->_source_jit_context = NULL;
}
@ -288,6 +297,7 @@ static void SetJitSourceStatus(JitSource* jitSource, JitContext* readySourceJitC
}
jitSource->m_contextList = nullptr;
} else { // expired context: cleanup all related JIT context objects
MOT_LOG_TRACE("Purging all JIT context objects by relation id %" PRIu64, relationId);
JitSourcePurgeContextList(jitSource, relationId);
}
}
@ -344,7 +354,6 @@ static void JitSourcePurgeContextList(JitSource* jitSource, uint64_t relationId)
PurgeJitContext(itr, relationId);
itr = itr->m_nextInSource;
}
jitSource->m_contextList = nullptr;
}
static void RemoveJitSourceContextImpl(JitSource* jitSource, JitContext* jitContext)