Enhancements to improve DJC transaction retry mechanisms 01/47201/2
authorunknown <efaseel@IN00116280.ericsson.se>
Thu, 20 Oct 2016 13:01:29 +0000 (18:31 +0530)
committerFaseela K <faseela.k@ericsson.com>
Thu, 20 Oct 2016 14:05:26 +0000 (19:35 +0530)
Description : Adding linear time delay for each retries in case of job
execution failure in datastorejobcordinator

Change-Id: Icd2bd50b3dd80236f32c5be0fd371ce508dbbbf3
Signed-off-by: Faseela K <faseela.k@ericsson.com>
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/datastoreutils/DataStoreJobCoordinator.java

index e6b3fa2307b589b1a663f9fdb6cd801956be746f..5d00ba243f98b0fbc66d8bf82c60f4272c1f1e08 100755 (executable)
@@ -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<Integer,Map<String, JobQueue>> 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;
             }