From 864afda9351e3791ec094579028cc0b03379bf73 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 8 Oct 2024 16:03:31 +0530 Subject: [PATCH] backoff changes Signed-off-by: Abhishek Kumar --- .../backoff/impl/ConstantTimeBackoff.java | 1 - .../utils/backoff/impl/RangeTimeBackoff.java | 8 +-- .../backoff/impl/RangeTimeBackoffTest.java | 70 +++++++++++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 utils/src/test/java/com/cloud/utils/backoff/impl/RangeTimeBackoffTest.java diff --git a/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java b/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java index c48f4462a52..de8f221e1e1 100644 --- a/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java +++ b/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java @@ -56,7 +56,6 @@ public class ConstantTimeBackoff extends AdapterBase implements BackoffAlgorithm } finally { _asleep.remove(current.getName()); } - return; } @Override diff --git a/utils/src/main/java/com/cloud/utils/backoff/impl/RangeTimeBackoff.java b/utils/src/main/java/com/cloud/utils/backoff/impl/RangeTimeBackoff.java index 8104caa69c6..9f7d1fbc8c0 100644 --- a/utils/src/main/java/com/cloud/utils/backoff/impl/RangeTimeBackoff.java +++ b/utils/src/main/java/com/cloud/utils/backoff/impl/RangeTimeBackoff.java @@ -36,7 +36,7 @@ import com.cloud.utils.component.AdapterBase; * **/ public class RangeTimeBackoff extends AdapterBase implements BackoffAlgorithm { - private static final int DEFAULT_MIN_TIME = 5; + protected static final int DEFAULT_MIN_TIME = 5; private int minTime = DEFAULT_MIN_TIME; private int maxTime = 3 * DEFAULT_MIN_TIME; private final Map asleep = new ConcurrentHashMap<>(); @@ -44,11 +44,12 @@ public class RangeTimeBackoff extends AdapterBase implements BackoffAlgorithm { @Override public void waitBeforeRetry() { + long time = minTime * 1000L; Thread current = Thread.currentThread(); try { asleep.put(current.getName(), current); - long time = ThreadLocalRandom.current().nextInt(minTime, maxTime) * 1000L; - LOG.info("Waiting " + current.getName() + " for " + time); + time = ThreadLocalRandom.current().nextInt(minTime, maxTime) * 1000L; + LOG.debug("Waiting " + current.getName() + " for " + time); Thread.sleep(time); } catch (InterruptedException e) { // JMX or other threads may interrupt this thread, but let's log it @@ -57,7 +58,6 @@ public class RangeTimeBackoff extends AdapterBase implements BackoffAlgorithm { } finally { asleep.remove(current.getName()); } - return; } @Override diff --git a/utils/src/test/java/com/cloud/utils/backoff/impl/RangeTimeBackoffTest.java b/utils/src/test/java/com/cloud/utils/backoff/impl/RangeTimeBackoffTest.java new file mode 100644 index 00000000000..28241a4b85a --- /dev/null +++ b/utils/src/test/java/com/cloud/utils/backoff/impl/RangeTimeBackoffTest.java @@ -0,0 +1,70 @@ +// 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 com.cloud.utils.backoff.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class RangeTimeBackoffTest { + + @Test + public void testWaitValidValue() { + RangeTimeBackoff backoff = new RangeTimeBackoff(); + Map map = new HashMap<>(); + int min = 5; + int max = 10; + map.put("minSeconds", String.valueOf(min)); + map.put("maxSeconds", String.valueOf(max)); + backoff.configure("RangeTimeBackoff", map); + long startTime = System.currentTimeMillis(); + backoff.waitBeforeRetry(); + long timeTaken = System.currentTimeMillis() - startTime; + Assert.assertTrue(timeTaken >= min * 1000L); + Assert.assertTrue(timeTaken <= max * 1000L); + } + + @Test + public void testWaitEmptyValue() { + RangeTimeBackoff backoff = new RangeTimeBackoff(); + Map map = new HashMap<>(); + map.put("minSeconds", ""); + map.put("maxSeconds", ""); + backoff.configure("RangeTimeBackoff", map); + long startTime = System.currentTimeMillis(); + backoff.waitBeforeRetry(); + long timeTaken = System.currentTimeMillis() - startTime; + Assert.assertTrue(timeTaken >= RangeTimeBackoff.DEFAULT_MIN_TIME * 1000L); + } + + @Test + public void testWaitNullValue() { + RangeTimeBackoff backoff = new RangeTimeBackoff(); + Map map = new HashMap<>(); + backoff.configure("RangeTimeBackoff", map); + long startTime = System.currentTimeMillis(); + backoff.waitBeforeRetry(); + long timeTaken = System.currentTimeMillis() - startTime; + Assert.assertTrue(timeTaken >= RangeTimeBackoff.DEFAULT_MIN_TIME * 1000L); + } + +}