GEODE-2297: push new InternalDistributedSystem into AlertAppender * InternalDistributedSystem initialize pushes its instance into AlertAppender
* During AlertAppender shuttingDown, it nulls out the reference to InternalDistributedSystem Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/fcf9085f Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/fcf9085f Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/fcf9085f Branch: refs/heads/master Commit: fcf9085f1e72a72b0507ff56adf360d6d60337e0 Parents: 4d58778 Author: Kirk Lund <kl...@apache.org> Authored: Fri Jan 20 13:05:22 2017 -0800 Committer: Kirk Lund <kl...@apache.org> Committed: Mon Jan 23 10:41:30 2017 -0800 ---------------------------------------------------------------------- .../internal/InternalDistributedSystem.java | 2 ++ .../internal/logging/log4j/AlertAppender.java | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/fcf9085f/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java index fad9206..987e491 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java @@ -570,6 +570,8 @@ public class InternalDistributedSystem extends DistributedSystem try { SocketCreatorFactory.setDistributionConfig(config); + AlertAppender.getInstance().onConnect(this); + // LOG: create LogWriterAppender(s) if log-file or security-log-file is specified final boolean hasLogFile = this.config.getLogFile() != null && !this.config.getLogFile().equals(new File("")); http://git-wip-us.apache.org/repos/asf/geode/blob/fcf9085f/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java b/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java index a6c54ab..8a50050 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java +++ b/geode-core/src/main/java/org/apache/geode/internal/logging/log4j/AlertAppender.java @@ -18,6 +18,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Date; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicReference; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; @@ -44,7 +45,7 @@ import org.apache.geode.internal.tcp.ReenteredConnectException; public final class AlertAppender extends AbstractAppender implements PropertyChangeListener { private static final String APPENDER_NAME = AlertAppender.class.getName(); private static final Logger logger = LogService.getLogger(); - private static final AlertAppender instance = new AlertAppender(); + private static final AlertAppender instance = createAlertAppender(); /** Is this thread in the process of alerting? */ private static final ThreadLocal<Boolean> alerting = new ThreadLocal<Boolean>() { @@ -59,12 +60,23 @@ public final class AlertAppender extends AbstractAppender implements PropertyCha private final AppenderContext appenderContext = LogService.getAppenderContext(); + private final AtomicReference<InternalDistributedSystem> systemRef = new AtomicReference<>(); + // This can be set by a loner distributed sytem to disable alerting private volatile boolean alertingDisabled = false; + private static AlertAppender createAlertAppender() { + AlertAppender alertAppender = new AlertAppender(); + alertAppender.start(); + return alertAppender; + } + private AlertAppender() { super(APPENDER_NAME, null, PatternLayout.createDefaultLayout()); - start(); + } + + public void onConnect(final InternalDistributedSystem system) { + this.systemRef.set(system); } public static AlertAppender getInstance() { @@ -114,7 +126,7 @@ public final class AlertAppender extends AbstractAppender implements PropertyCha logger.debug("Delivering an alert event: {}", event); } - InternalDistributedSystem ds = InternalDistributedSystem.getConnectedInstance(); + InternalDistributedSystem ds = this.systemRef.get(); if (ds == null) { // Use info level to avoid triggering another alert logger.info("Did not append alert event because the distributed system is set to null."); @@ -307,6 +319,7 @@ public final class AlertAppender extends AbstractAppender implements PropertyCha this.listeners.clear(); this.appenderContext.getLoggerContext().removePropertyChangeListener(this); this.appenderContext.getLoggerConfig().removeAppender(APPENDER_NAME); + this.systemRef.set(null); } /**