GEODE-8643: Fix IllegalArgumentException in ParallelGatewaySenderQueu… (#5653)
* GEODE-8643: Fix IllegalArgumentException in ParallelGatewaySenderQueue for negative sleep value
* GEODE-8643: Small corrections after review
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
index 2788bb2..18c1624 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueue.java
@@ -1307,7 +1307,7 @@
// Sleep a bit before trying again.
long currentTime = System.currentTimeMillis();
try {
- Thread.sleep(getTimeToSleep(end - currentTime));
+ Thread.sleep(calculateTimeToSleep(end - currentTime));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
@@ -1393,7 +1393,11 @@
return (incompleteTransactions.size() == 0);
}
- private long getTimeToSleep(long timeToWait) {
+ @VisibleForTesting
+ static long calculateTimeToSleep(long timeToWait) {
+ if (timeToWait <= 0) {
+ return 0;
+ }
// Get the minimum of 50 and 5% of the time to wait (which by default is 1000 ms)
long timeToSleep = Math.min(50L, ((long) (timeToWait * 0.05)));
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
index 48035e5..1f4d81e 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelGatewaySenderQueueJUnitTest.java
@@ -456,6 +456,26 @@
assertEquals(3, peekedAfter.size());
}
+ @Test
+ public void testCalculateTimeToSleepNegativeInputReturnsZero() {
+ assertEquals(0L, ParallelGatewaySenderQueue.calculateTimeToSleep(-3));
+ }
+
+ @Test
+ public void testCalculateTimeToSleepZeroInputReturnsZero() {
+ assertEquals(0L, ParallelGatewaySenderQueue.calculateTimeToSleep(0));
+ }
+
+ @Test
+ public void testCalculateTimeToSleepInputGreaterThanOneThousand() {
+ assertEquals(50L, ParallelGatewaySenderQueue.calculateTimeToSleep(1002));
+ }
+
+ @Test
+ public void testCalculateTimeToSleepInputSmallerThanOneThousand() {
+ assertEquals(2L, ParallelGatewaySenderQueue.calculateTimeToSleep(40));
+ }
+
private GatewaySenderEventImpl createGatewaySenderEventImpl(int transactionId,
boolean isLastEventInTransaction) {
GatewaySenderEventImpl event = mock(GatewaySenderEventImpl.class);