From 478ade750e338519bf502e861d91d193d88ddb48 Mon Sep 17 00:00:00 2001 From: Vinoth Veeraraghavan Date: Tue, 22 Sep 2020 15:42:28 +0800 Subject: [PATCH] Fix bug in JIT source purging: do not nullify attached context list after purge --- .../storage/mot/jit_exec/src/jit_context.cpp | 15 ++++++++++++--- .../storage/mot/jit_exec/src/jit_exec.cpp | 1 + .../storage/mot/jit_exec/src/jit_source.cpp | 13 +++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_context.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_context.cpp index bec8addd9..217e871cc 100755 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_context.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_context.cpp @@ -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); diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_exec.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_exec.cpp index 915a66b45..6b56caf55 100644 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_exec.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_exec.cpp @@ -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); } diff --git a/src/gausskernel/storage/mot/jit_exec/src/jit_source.cpp b/src/gausskernel/storage/mot/jit_exec/src/jit_source.cpp index 23423d661..8da7a2e09 100644 --- a/src/gausskernel/storage/mot/jit_exec/src/jit_source.cpp +++ b/src/gausskernel/storage/mot/jit_exec/src/jit_source.cpp @@ -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)