This is an automated email from the ASF dual-hosted git repository.

boglesby pushed a commit to branch support/1.12
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.12 by this push:
     new 424b42f  GEODE-8478: Modified logThresholdExceededAlerts to handle 
exceptions
424b42f is described below

commit 424b42f014bd9be098914dfd8ffa56e8aff5b3cf
Author: Barry Oglesby <[email protected]>
AuthorDate: Thu Sep 3 09:30:46 2020 -1000

    GEODE-8478: Modified logThresholdExceededAlerts to handle exceptions
    
    
    (cherry picked from commit 2d995fbefe9503d7fed24f5a3f5186b7744d3825)
    (cherry picked from commit 294ab07191dead87e09df59441be9f57cb922328)
---
 ...GatewaySenderEventProcessorIntegrationTest.java | 76 ++++++++++++++++++++++
 .../wan/AbstractGatewaySenderEventProcessor.java   | 39 ++++++-----
 .../internal/cache/wan/GatewaySenderEventImpl.java |  8 ++-
 3 files changed, 105 insertions(+), 18 deletions(-)

diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessorIntegrationTest.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessorIntegrationTest.java
new file mode 100644
index 0000000..44778d7
--- /dev/null
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessorIntegrationTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+package org.apache.geode.internal.cache.wan;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.LocalRegion;
+
+public class AbstractGatewaySenderEventProcessorIntegrationTest {
+
+  protected InternalCache cache;
+
+  @Before
+  public void setUp() {
+    this.cache = (InternalCache) new CacheFactory().create();
+  }
+
+  @After
+  public void tearDown() {
+    if (this.cache != null) {
+      this.cache.close();
+    }
+  }
+
+  @Test
+  public void verifyThresholdExceededAlertLogDoesNotThrowException() {
+    // Mock the sender
+    AbstractGatewaySender sender = mock(AbstractGatewaySender.class);
+    when(sender.getAlertThreshold()).thenReturn(1);
+    when(sender.getStatistics()).thenReturn(mock(GatewaySenderStats.class));
+
+    // Mock the processor
+    AbstractGatewaySenderEventProcessor eventProcessor =
+        mock(AbstractGatewaySenderEventProcessor.class);
+    when(eventProcessor.getSender()).thenReturn(sender);
+
+    // Mock the region
+    LocalRegion lr = mock(LocalRegion.class);
+    when(lr.getCache()).thenReturn(this.cache);
+
+    // Create the events
+    List<GatewaySenderEventImpl> events = new ArrayList<>();
+    GatewaySenderEventImpl gsei1 = mock(GatewaySenderEventImpl.class);
+    when(gsei1.getValueAsString(true)).thenThrow(new 
IllegalStateException("test"));
+    events.add(gsei1);
+
+    // Invoke the real method
+    doCallRealMethod().when(eventProcessor).logThresholdExceededAlerts(events);
+    assertThatCode(() -> eventProcessor.logThresholdExceededAlerts(events))
+        .doesNotThrowAnyException();
+  }
+}
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessor.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessor.java
index 3d026c1..71a5b9b 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessor.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySenderEventProcessor.java
@@ -961,7 +961,9 @@ public abstract class AbstractGatewaySenderEventProcessor 
extends LoggingThread
 
     filteredList.clear();
     eventQueueRemove(events.size());
-    final GatewaySenderStats statistics = this.sender.getStatistics();
+
+    logThresholdExceededAlerts(events);
+
     int queueSize = eventQueueSize();
 
     if (this.eventQueueSizeWarning && queueSize <= 
AbstractGatewaySender.QUEUE_SIZE_THRESHOLD) {
@@ -1028,24 +1030,27 @@ public abstract class 
AbstractGatewaySenderEventProcessor extends LoggingThread
       }
       eventQueueRemove(events.size());
 
-      final GatewaySenderStats statistics = this.sender.getStatistics();
+      logThresholdExceededAlerts(events);
+    }
+  }
 
-      // Log an alert for each event if necessary
-      if (this.sender.getAlertThreshold() > 0) {
-        Iterator it = events.iterator();
-        long currentTime = System.currentTimeMillis();
-        while (it.hasNext()) {
-          Object o = it.next();
-          if (o != null && o instanceof GatewaySenderEventImpl) {
-            GatewaySenderEventImpl ge = (GatewaySenderEventImpl) o;
-            if (ge.getCreationTime() + this.sender.getAlertThreshold() < 
currentTime) {
-              logger.warn(
-                  "{} event for region={} key={} value={} was in the queue for 
{} milliseconds",
-                  new Object[] {ge.getOperation(), ge.getRegionPath(), 
ge.getKey(),
-                      ge.getValueAsString(true), currentTime - 
ge.getCreationTime()});
-              statistics.incEventsExceedingAlertThreshold();
-            }
+  protected void logThresholdExceededAlerts(List<GatewaySenderEventImpl> 
events) {
+    // Log an alert for each event if necessary
+    if (getSender().getAlertThreshold() > 0) {
+      long currentTime = System.currentTimeMillis();
+      for (GatewaySenderEventImpl event : events) {
+        try {
+          if (event.getCreationTime() + getSender().getAlertThreshold() < 
currentTime) {
+            logger.warn(
+                "{} event for region={} key={} value={} was in the queue for 
{} milliseconds",
+                new Object[] {event.getOperation(), event.getRegionPath(), 
event.getKey(),
+                    event.getValueAsString(true), currentTime - 
event.getCreationTime()});
+            getSender().getStatistics().incEventsExceedingAlertThreshold();
           }
+        } catch (Exception e) {
+          logger.warn("Caught the following exception attempting to log 
threshold exceeded alert:",
+              e);
+          getSender().getStatistics().incEventsExceedingAlertThreshold();
         }
       }
     }
diff --git 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventImpl.java
 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventImpl.java
index b2d1819..aa9127d 100644
--- 
a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventImpl.java
@@ -612,7 +612,13 @@ public class GatewaySenderEventImpl
         // Using Arrays.toString(bav) can cause us to run out of memory
         return "byte[" + bav.length + "]";
       } else {
-        return v.toString();
+        String valueStr;
+        try {
+          valueStr = v.toString();
+        } catch (Exception e) {
+          valueStr = "Could not convert value to string because " + e;
+        }
+        return valueStr;
       }
     } else {
       return "";

Reply via email to