You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2019/08/13 18:31:39 UTC
[geode] branch release/1.10.0 updated: GEODE-6959: Prevent NPE in
GMSMembershipManager for null AlertAppender (#3899)
This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch release/1.10.0
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/release/1.10.0 by this push:
new bb509b0 GEODE-6959: Prevent NPE in GMSMembershipManager for null AlertAppender (#3899)
bb509b0 is described below
commit bb509b0e283917e94a4f6046791e59516f1320a4
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Thu Aug 8 14:59:44 2019 -0700
GEODE-6959: Prevent NPE in GMSMembershipManager for null AlertAppender (#3899)
If a custom log4j2.xml is used without specifying the Geode AlertAppender,
GMSMembershipManager may throw a NullPointerException when invoking
AlertAppender.getInstance().stopSession() during a forceDisconnect. This
change prevents the NullPointerException allowing forceDisconnect to finish.
Users using Spring Boot with Logback are more likely to hit this bug.
Co-authored-by: Mark Hanson mhanson@pivotal.io
(cherry picked from commit dd15fec1f2ecbc3bc0cdfc42072252c379e0bb89)
---
.../membership/gms/mgr/GMSMembershipManager.java | 2 +-
.../internal/logging/log4j/AlertAppender.java | 16 ++++++++++++-
.../internal/logging/log4j/AlertAppenderTest.java | 26 ++++++++++++++++++++++
3 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/mgr/GMSMembershipManager.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
index bd70990..8411ee6 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/membership/gms/mgr/GMSMembershipManager.java
@@ -2509,7 +2509,7 @@ public class GMSMembershipManager implements MembershipManager, Manager {
services.setShutdownCause(shutdownCause);
services.getCancelCriterion().cancel(reason);
- AlertAppender.getInstance().stopSession();
+ AlertAppender.stopSessionIfRunning();
if (!inhibitForceDisconnectLogging) {
logger.fatal(
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 d56a0da..40332da 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
@@ -36,6 +36,7 @@ import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
+import org.apache.geode.annotations.VisibleForTesting;
import org.apache.geode.annotations.internal.MakeNotStatic;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.internal.alerting.AlertLevel;
@@ -337,7 +338,20 @@ public class AlertAppender extends AbstractAppender
return listeners;
}
- public static AlertAppender getInstance() {
+ @VisibleForTesting
+ static AlertAppender getInstance() {
return instanceRef.get();
}
+
+ @VisibleForTesting
+ static void setInstance(AlertAppender alertAppender) {
+ instanceRef.set(alertAppender);
+ }
+
+ public static void stopSessionIfRunning() {
+ AlertAppender instance = instanceRef.get();
+ if (instance != null) {
+ instance.stopSession();
+ }
+ }
}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/logging/log4j/AlertAppenderTest.java b/geode-core/src/test/java/org/apache/geode/internal/logging/log4j/AlertAppenderTest.java
index 0ba7e45..6779b20 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/logging/log4j/AlertAppenderTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/logging/log4j/AlertAppenderTest.java
@@ -15,9 +15,13 @@
package org.apache.geode.internal.logging.log4j;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
import org.apache.logging.log4j.Level;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -52,6 +56,11 @@ public class AlertAppenderTest {
asAlertingProvider = alertAppender;
}
+ @After
+ public void tearDown() {
+ AlertAppender.setInstance(null);
+ }
+
@Test
public void alertListenersIsEmptyByDefault() {
assertThat(alertAppender.getAlertListeners()).isEmpty();
@@ -164,4 +173,21 @@ public class AlertAppenderTest {
assertThat(alertAppender.getAlertListeners()).containsExactly(listener1, listener2,
listener3);
}
+
+ @Test
+ public void stopSessionIfRunningDoesNotThrowIfReferenceIsNull() {
+ AlertAppender.setInstance(null);
+
+ assertThatCode(AlertAppender::stopSessionIfRunning).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void stopSessionIfRunningStopCurrentInstance() {
+ alertAppender = spy(alertAppender);
+ AlertAppender.setInstance(alertAppender);
+
+ AlertAppender.stopSessionIfRunning();
+
+ verify(alertAppender).stopSession();
+ }
}