From 0202dd698d26420b0429ef6b1047733d3f27bde8 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 20 Oct 2016 18:31:29 +0530 Subject: [PATCH] Enhancements to improve DJC transaction retry mechanisms Description : Adding linear time delay for each retries in case of job execution failure in datastorejobcordinator Change-Id: Icd2bd50b3dd80236f32c5be0fd371ce508dbbbf3 Signed-off-by: Faseela K --- .../DataStoreJobCoordinator.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/datastoreutils/DataStoreJobCoordinator.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/datastoreutils/DataStoreJobCoordinator.java index e6b3fa230..5d00ba243 100755 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/datastoreutils/DataStoreJobCoordinator.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/datastoreutils/DataStoreJobCoordinator.java @@ -17,9 +17,7 @@ import org.slf4j.LoggerFactory; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.*; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; @@ -27,7 +25,9 @@ public class DataStoreJobCoordinator { private static final Logger LOG = LoggerFactory.getLogger(DataStoreJobCoordinator.class); private static final int THREADPOOL_SIZE = Runtime.getRuntime().availableProcessors(); - + private static final long RETRY_WAIT_BASE_TIME = 100; + private ScheduledExecutorService scheduledExecutorService = + Executors.newScheduledThreadPool(5); private final ForkJoinPool fjPool; private final Map> jobQueueMap = new ConcurrentHashMap<>(); private final ReentrantLock reentrantLock = new ReentrantLock(); @@ -183,9 +183,16 @@ public class DataStoreJobCoordinator { return; } - if (jobEntry.decrementRetryCountAndGet() > 0) { - MainTask worker = new MainTask(jobEntry); - fjPool.execute(worker); + int retryCount = jobEntry.decrementRetryCountAndGet(); + if ( retryCount > 0) { + long waitTime = (RETRY_WAIT_BASE_TIME * 10)/retryCount; + scheduledExecutorService.schedule( + () -> { + MainTask worker = new MainTask(jobEntry); + fjPool.execute(worker); + }, + waitTime, + TimeUnit.MILLISECONDS); return; } -- 2.36.6