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);