This is an automated email from the ASF dual-hosted git repository.
boglesby pushed a commit to branch support/1.13
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/support/1.13 by this push:
new 294ab07 GEODE-8478: Modified logThresholdExceededAlerts to handle
exceptions
294ab07 is described below
commit 294ab07191dead87e09df59441be9f57cb922328
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)
---
...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 74c2785..8acdc6f 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 "";