From cd85108afd5b262a04984f4b9d70fbb6ed06ba7c Mon Sep 17 00:00:00 2001 From: "Svetlana.Zemlyanskaya" Date: Mon, 5 Nov 2018 11:02:11 +0100 Subject: [PATCH] IDEA-CR-39038: IDEA-201580 Infinite logging loop on IDEA shutdown if there's an exception during IDE close --- .../diagnostic/DefaultIdeaErrorLogger.java | 24 +++++----------- .../AppLifecycleUsageTriggerCollector.java | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/diagnostic/DefaultIdeaErrorLogger.java b/platform/platform-impl/src/com/intellij/diagnostic/DefaultIdeaErrorLogger.java index e59d603754e6..7d2af9173ec1 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/DefaultIdeaErrorLogger.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/DefaultIdeaErrorLogger.java @@ -3,11 +3,10 @@ package com.intellij.diagnostic; import com.intellij.diagnostic.VMOptions.MemoryKind; import com.intellij.featureStatistics.fusCollectors.AppLifecycleUsageTriggerCollector; -import com.intellij.internal.statistic.eventLog.FeatureUsageLogger; -import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.diagnostic.ErrorLogger; @@ -19,8 +18,6 @@ import com.intellij.util.io.MappingFailedException; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.HashMap; -import java.util.Map; /** * @author kir @@ -40,6 +37,11 @@ public class DefaultIdeaErrorLogger implements ErrorLogger { if (ourLoggerBroken) return false; try { + final Application app = ApplicationManager.getApplication(); + if (app.isDisposed() || app.isDisposeInProgress()) { + return false; + } + UpdateChecker.checkForUpdate(event); boolean notificationEnabled = !DISABLED_VALUE.equals(System.getProperty(FATAL_ERROR_NOTIFICATION_PROPERTY, ENABLED_VALUE)); @@ -49,19 +51,7 @@ public class DefaultIdeaErrorLogger implements ErrorLogger { boolean isOOM = getOOMErrorKind(event.getThrowable()) != null; boolean isMappingFailed = !isOOM && event.getThrowable() instanceof MappingFailedException; - String key = "ide.error"; - if(isOOM){ - key+=".oom"; - } - if(isMappingFailed){ - key+=".mappingFailed"; - } - - FUSApplicationUsageTrigger.getInstance().trigger(AppLifecycleUsageTriggerCollector.class, key); - Map values = new HashMap<>(); - values.put("oom",isOOM); - values.put("mappingFailed",isMappingFailed); - FeatureUsageLogger.INSTANCE.log("lifecycle", "ide.error", values); + AppLifecycleUsageTriggerCollector.onError(isOOM, isMappingFailed); return notificationEnabled || showPluginError || diff --git a/platform/platform-impl/src/com/intellij/featureStatistics/fusCollectors/AppLifecycleUsageTriggerCollector.java b/platform/platform-impl/src/com/intellij/featureStatistics/fusCollectors/AppLifecycleUsageTriggerCollector.java index 315d7e44da06..c55fb5dee859 100644 --- a/platform/platform-impl/src/com/intellij/featureStatistics/fusCollectors/AppLifecycleUsageTriggerCollector.java +++ b/platform/platform-impl/src/com/intellij/featureStatistics/fusCollectors/AppLifecycleUsageTriggerCollector.java @@ -1,13 +1,41 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.featureStatistics.fusCollectors; +import com.intellij.internal.statistic.eventLog.FeatureUsageLogger; import com.intellij.internal.statistic.service.fus.collectors.ApplicationUsageTriggerCollector; +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger; +import com.intellij.openapi.diagnostic.Logger; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; +import java.util.Map; + public class AppLifecycleUsageTriggerCollector extends ApplicationUsageTriggerCollector { + private static final Logger LOG = Logger.getInstance("#com.intellij.featureStatistics.fusCollectors.AppLifecycleUsageTriggerCollector"); + @NotNull @Override public String getGroupId() { return "statistics.lifecycle.app"; } + + public static void onError(boolean isOOM, boolean isMappingFailed) { + try { + String key = "ide.error"; + if (isOOM) { + key += ".oom"; + } + if (isMappingFailed) { + key += ".mappingFailed"; + } + FUSApplicationUsageTrigger.getInstance().trigger(AppLifecycleUsageTriggerCollector.class, key); + Map values = new HashMap<>(); + values.put("oom", isOOM); + values.put("mappingFailed", isMappingFailed); + FeatureUsageLogger.INSTANCE.log("lifecycle", "ide.error", values); + } + catch (Exception e) { + LOG.warn(e); + } + } }