diff --git a/analysis/heap-dump/provider/src/main/java/org/eclipse/jifa/hdp/provider/HeapDumpAnalysisApiExecutor.java b/analysis/heap-dump/provider/src/main/java/org/eclipse/jifa/hdp/provider/HeapDumpAnalysisApiExecutor.java index 0193bade..40c04938 100644 --- a/analysis/heap-dump/provider/src/main/java/org/eclipse/jifa/hdp/provider/HeapDumpAnalysisApiExecutor.java +++ b/analysis/heap-dump/provider/src/main/java/org/eclipse/jifa/hdp/provider/HeapDumpAnalysisApiExecutor.java @@ -197,7 +197,9 @@ protected HeapDumpAnalyzer buildAnalyzer(Path target, Map option @Override protected void cachedAnalyzerRemoved(HeapDumpAnalyzer heapDumpAnalyzer) { - heapDumpAnalyzer.dispose(); + if (heapDumpAnalyzer != null) { + heapDumpAnalyzer.dispose(); + } } private File indexFile(Path target) { diff --git a/analysis/src/main/java/org/eclipse/jifa/analysis/AbstractApiExecutor.java b/analysis/src/main/java/org/eclipse/jifa/analysis/AbstractApiExecutor.java index 7d1e0a34..3443a480 100644 --- a/analysis/src/main/java/org/eclipse/jifa/analysis/AbstractApiExecutor.java +++ b/analysis/src/main/java/org/eclipse/jifa/analysis/AbstractApiExecutor.java @@ -333,11 +333,11 @@ public Progress progressOfAnalysis(@ApiParameterMeta(targetPath = true) Path tar } public void release(@ApiParameterMeta(targetPath = true) Path target) { - cachedAnalyzer.invalidate(target); + cleanAndDisposeAnalyzerCache(target); } public void clean(@ApiParameterMeta(targetPath = true) Path target) { - cachedAnalyzer.invalidate(target); + cleanAndDisposeAnalyzerCache(target); File errorLog = errorLogFile(target); if (errorLog.exists()) { if (!errorLog.delete()) { @@ -364,4 +364,13 @@ protected final boolean isActive(Path target) { protected int getCacheDuration() { return 8; } + + private void cleanAndDisposeAnalyzerCache(Path target) { + // Dispose snapshot synchronized to prevent from some problem caused by data inconsistency. + Analyzer analyzer = cachedAnalyzer.getIfPresent(target); + cachedAnalyzer.invalidate(target); + if (analyzer != null) { + cachedAnalyzerRemoved(analyzer); + } + } } \ No newline at end of file diff --git a/frontend/src/components/Analysis.vue b/frontend/src/components/Analysis.vue index c968b2f3..3d497d02 100644 --- a/frontend/src/components/Analysis.vue +++ b/frontend/src/components/Analysis.vue @@ -51,6 +51,21 @@ const progressStatus = computed(() => { function analyze(options?) { let parameters; if (options) { + options = { ...options }; + let additionalOptions = options.additional_options; + delete options.additional_options; + if (additionalOptions && additionalOptions.trim()) { + const pairs = additionalOptions.match(/(\w+)=('(?:\\.|[^'\\])*'|\S+)/g); + + for (let pair of pairs) { + const index = pair.indexOf('='); + const key = pair.slice(0, index); + const value = pair.slice(index + 1); + // delete qouta on value if exists. + const cleanedValue = value.replace(/^'(.*)'$/, '$1'); + options[key] = cleanedValue + } + } parameters = { options }; } request('analyze', parameters) @@ -163,6 +178,13 @@ onUnmounted(() => { diff --git a/frontend/src/components/heapdump/Setup.vue b/frontend/src/components/heapdump/Setup.vue index 816cbd09..749495de 100644 --- a/frontend/src/components/heapdump/Setup.vue +++ b/frontend/src/components/heapdump/Setup.vue @@ -12,19 +12,40 @@ --> - + diff --git a/frontend/src/components/heapdump/Toolbar.vue b/frontend/src/components/heapdump/Toolbar.vue index 9428be9b..07e848f6 100644 --- a/frontend/src/components/heapdump/Toolbar.vue +++ b/frontend/src/components/heapdump/Toolbar.vue @@ -20,12 +20,11 @@ import { Phase, useAnalysisStore } from '@/stores/analysis'; const { request } = useAnalysisApiRequester(); const analysis = useAnalysisStore(); -function clean() { - request('clean').then(() => { - useAnalysisStore().leaveGuard = false; - location.reload(); - }); + +function showSetup() { + analysis.setShowSetupPage(true) } +